[アップデート]Amazon BedrockでAPIキー管理が簡単になりました

[アップデート]Amazon BedrockでAPIキー管理が簡単になりました

Clock Icon2025.07.08

こんにちは、@takaakikakei です。

Amazon Bedrockのサービス画面のDiscoverにAPI Keysの項目が追加されました。本記事ではアップデートの概要をまとめます。

CleanShot 2025-07-08 at 09.20.15@2x.png

Generate Amazon Bedrock API keys to easily authenticate to the Amazon Bedrock API - Amazon Bedrock

3行まとめ

  • Amazon Bedrockのサービス画面にAPI Keysの項目が追加され、APIキーの管理が容易に
  • 長期と短期のAPIキーを生成可能で、利便性が向上
  • aws-bedrock-token-generatorパッケージを利用することで、APIキーのリフレッシュも可能

何が嬉しいか

Amazon Bedrockのサービス画面にAPI Keysの項目が追加されたことで、APIキーの管理が容易になりました。これにより、開発者はAPIキーを簡単に生成・管理できるようになり、利便性が向上します。

調査

Long-termのAPIキー

Long-termのAPIキーは、12時間を超える有効期限を持つAPIキーです。

作成方法

「Long-term API keys」タブから「Generate long-term API Keys」をクリックします。

CleanShot 2025-07-08 at 09.41.45@2x.png

ダイアログが表示されます。作成されるAPIキーの名前を確認できます。

CleanShot 2025-07-08 at 09.42.56@2x.png

必須の入力フィールドとして、APIキーの有効期限の選択があります。

CleanShot 2025-07-08 at 09.47.30@2x.png

オプションのフィールドとして、ポリシーの選択があります。デフォルトでは、AmazonBedrockLimitedAccessというAWS管理ポリシーが適用されます。オプションでマーケットプレイスモデルにアクセスするためのAmazonBedrockMarketplaceAccessポリシーを追加することも可能です。

CleanShot 2025-07-08 at 09.49.50@2x.png

「Generate」ボタンをクリックすると、APIキーが生成されます。

CleanShot 2025-07-08 at 09.48.53@2x.png

「Download API Key」ボタンをクリックすると、APIキーのファイルがCSV形式でダウンロードされます。「Close」ボタンをクリックすると、API Keysの画面に戻ります。

確認・編集方法

作成したAPIキーは一覧に表示されます。現時点では当該画面上で編集はできません。対象のAPIキーを選択し、右上の「Manage in IAM Console」をクリックすると、IAMコンソールに遷移します。

CleanShot 2025-07-08 at 09.53.45@2x.png

IAMユーザーの「セキュリティ認証情報」タブの画面に遷移します。Long-termのAPIキーの実体はIAMユーザーなんですね。「Amazon Bedrock の API キー」という項目があり、先程作成したAPIキーが表示されています。Long-termのAPIキーを削除したい場合は、IAMコンソール上でユーザーを削除すればOKでした。

CleanShot 2025-07-08 at 09.57.01@2x.png

IAMユーザーの「許可」のタブを確認します。「AmazonBedrockLimitedAccess」ポリシーがアタッチされています。

CleanShot 2025-07-08 at 10.01.41@2x.png

ポリシーの中身は以下でした。bedrock:Retrievebedrock:RetrieveAndGenerateのポリシーは含まれていないため、Bedrockのナレッジベースの機能は利用できないようです。必要であれば、IAMユーザーの「許可」のタブでポリシーを追加する形になるかと思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "BedrockAPIs",
            "Effect": "Allow",
            "Action": [
                "bedrock:Get*",
                "bedrock:List*",
                "bedrock:CallWithBearerToken",
                "bedrock:BatchDeleteEvaluationJob",
                "bedrock:CreateEvaluationJob",
                "bedrock:CreateGuardrail",
                "bedrock:CreateGuardrailVersion",
                "bedrock:CreateInferenceProfile",
                "bedrock:CreateModelCopyJob",
                "bedrock:CreateModelCustomizationJob",
                "bedrock:CreateModelImportJob",
                "bedrock:CreateModelInvocationJob",
                "bedrock:CreatePromptRouter",
                "bedrock:CreateProvisionedModelThroughput",
                "bedrock:DeleteCustomModel",
                "bedrock:DeleteGuardrail",
                "bedrock:DeleteImportedModel",
                "bedrock:DeleteInferenceProfile",
                "bedrock:DeletePromptRouter",
                "bedrock:DeleteProvisionedModelThroughput",
                "bedrock:StopEvaluationJob",
                "bedrock:StopModelCustomizationJob",
                "bedrock:StopModelInvocationJob",
                "bedrock:TagResource",
                "bedrock:UntagResource",
                "bedrock:UpdateGuardrail",
                "bedrock:UpdateProvisionedModelThroughput",
                "bedrock:ApplyGuardrail",
                "bedrock:InvokeModel",
                "bedrock:InvokeModelWithResponseStream"
            ],
            "Resource": "*"
        },
        {
            "Sid": "DescribeKey",
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey"
            ],
            "Resource": "arn:*:kms:*:::*"
        },
        {
            "Sid": "APIsWithAllResourceAccess",
            "Effect": "Allow",
            "Action": [
                "iam:ListRoles",
                "ec2:DescribeVpcs",
                "ec2:DescribeSubnets",
                "ec2:DescribeSecurityGroups"
            ],
            "Resource": "*"
        },
        {
            "Sid": "MarketplaceOperationsFromBedrockFor3pModels",
            "Effect": "Allow",
            "Action": [
                "aws-marketplace:Subscribe",
                "aws-marketplace:ViewSubscriptions",
                "aws-marketplace:Unsubscribe"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:CalledViaLast": "bedrock.amazonaws.com"
                }
            }
        }
    ]
}

ちなみに、APIキー作成時のオプション項目で「AmazonBedrockMarketplaceAccess」ポリシーを選択した場合、下図のように、IAMユーザーの「許可」のタブに「AmazonBedrockMarketplaceAccess」ポリシーがアタッチされます。

CleanShot 2025-07-08 at 10.06.31@2x.png

公式ドキュメントにも書かれていますが、Long-termのAPIキーは検証や試用での推奨がされており、セキュリティ要件が高い本番環境などでは、AWS STSを利用した一時的なセキュリティ認証情報や後述のShort-termのAPIキーの利用が推奨されています。

Short-termのAPIキー

Short-termのAPIキーは、12時間で期限切れになるAPIキーです。

作成方法

「Short-term API keys」タブから「Generate short-term API Keys」をクリックします。

CleanShot 2025-07-08 at 09.25.48@2x.png

ダイアログが表示され、12時間で期限切れになるAPIキーが生成されます。Long-termのAPIキーと同様にAmazonBedrockLimitedAccessポリシーが適用されます。

CleanShot 2025-07-08 at 09.30.16@2x.png

ちなみにShort-term API keysを払い出しても、BedrockのAPI Keysの一覧には表示されません。またIAMユーザーも作成されません。

CleanShot 2025-07-08 at 10.14.54@2x.png

実行してみる

Short-termのAPIキーを利用して、BedrockのAPIを実行してみます。

Use an Amazon Bedrock API key - Amazon Bedrock

ターミナルで払い出されたAPIキーを環境変数に設定します。

export AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-xxxxx

以下のコードは、Pythonのboto3ライブラリを使用して、Amazon Bedrockのモデルにメッセージを送信するサンプルコードです。

import os
import boto3

def main():
    client = boto3.client(
        service_name="bedrock-runtime",
        region_name="ap-northeast-1"
    )

    # Define the model and message
    model_id = "anthropic.claude-3-haiku-20240307-v1:0"
    messages = [{"role": "user", "content": [{"text": "Hello"}]}]

    response = client.converse(
        modelId=model_id,
        messages=messages,
    )

    print(response)


if __name__ == "__main__":
    main()

uvを使って実行します。問題なく応答を受け取ることができました。

% uv run main.py

{'ResponseMetadata': {'RequestId': '295a5795-acd8-4f93-a8f8-ed46803db2f6', 'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Tue, 08 Jul 2025 02:08:29 GMT', 'content-type': 'application/json', 'content-length': '214', 'connection': 'keep-alive', 'x-amzn-requestid': '295a5795-acd8-4f93-a8f8-ed46803db2f6'}, 'RetryAttempts': 0}, 'output': {'message': {'role': 'assistant', 'content': [{'text': 'Hello! How can I assist you today?'}]}}, 'stopReason': 'end_turn', 'usage': {'inputTokens': 8, 'outputTokens': 12, 'totalTokens': 20}, 'metrics': {'latencyMs': 347}}

別リージョンのモデルを指定して実行してみます。

import os
import boto3

def main():
    client = boto3.client(
        service_name="bedrock-runtime",
        region_name="us-east-1"
    )

    # Define the model and message
    model_id = "us.anthropic.claude-sonnet-4-20250514-v1:0"
    messages = [{"role": "user", "content": [{"text": "Hello"}]}]

    response = client.converse(
        modelId=model_id,
        messages=messages,
    )

    print(response)


if __name__ == "__main__":
    main()

uvを使って実行します。AccessDeniedExceptionが発生しました。現時点では、Short-termのAPIキーは作成したリージョンに依存しているようです。

% uv run main.py

..snip..
botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the Converse operation: Authentication failed: Please make sure your API Key is valid.

リフレッシュ方法

以下の公式ドキュメントの通り、aws-bedrock-token-generatorというパッケージが提供されており、有効期限が切れた場合にプログラムで新しいAPIキーを再生成することも可能です。これにより、本番環境におけるAPIキー利用でもさらにセキュリティを高めることができます。

Refresh short-term Amazon Bedrock API keys for greater control and security - Amazon Bedrock

おわりに

今回のAPIキーの管理が容易になり、セキュリティや開発効率が向上することが期待されます。公式ドキュメントとしては、以下にまとめられているので、あわせてご確認ください。

Generate Amazon Bedrock API keys to easily authenticate to the Amazon Bedrock API - Amazon Bedrock

それではまた!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.