Amazon Bedrock を API キー で管理する

AWS

2025.8.8

Topics

概要

Amazon Bedrock で API キーによる認証機能がリリースされました。
本記事では、この新機能の検証結果をまとめます。

Amazon Bedrock が開発の効率化のために API キーを導入
投稿日: 2025 年 7 月 8 日
本日、Amazon Bedrock の API キーのリリースを発表します。
これにより、このサービスを使い始めるのが簡単になり、生成 AI 開発を加速できます。
Amazon Bedrock の API キーを使用すると、デベロッパーは IAM プリンシパルとポリシーを手動で設定しなくても、Amazon Bedrock コンソールまたは AWS SDK 内で直接アクセス認証情報を簡単に生成できます。
Amazon Bedrock が開発効率化のための API キーを導入 – AWS

Bedrock API キーには以下の 2 つのタイプがあります。

  • 長期キー
    • Bedrock で基本的な API リクエストを実行するための権限を持つ API キーを作成
    • IAM の権限を手動で設定したりすることなく、すぐに Bedrock API を使い始めることが可能
    • 内部的に IAM ユーザーが作成され、選択した IAM ポリシーがアタッチ
    • 1 日から無期限まで有効期限を設定可能
  • 短期キー
    • API キーの生成時に使用した IAM ユーザー/ロールと同じ権限を持つ Bedrock API キーを作成
    • セッションと同じ期間有効(12 時間以内)
    • セキュリティ強化のため認証情報を定期的に変更する本番環境に最適
    • 有効期限切れ時の自動更新設定をアプリケーションで可能

AWS の推奨は短期キーまたは一時的なセキュリティ認証情報の利用です。

詳細は以下ドキュメントで確認できます。
Amazon Bedrock API キーを生成して、Amazon Bedrock API への認証を簡単に行う – Amazon Bedrock

検証環境

  • リージョン: us-east-1 (バージニア北部)
  • モデル:Claude Haiku 3.5, Sonnet 3.7, Opus 4(必要なモデルはすでに有効化済み)
  • 実行環境:ローカル PC(Windows) から Python boto3 (バージョン 1.39.16)を使用

boto3 のバージョンが古い場合は、環境変数を正しく認識できずエラーになるためご注意ください。

なお、本記事では API キーを記載しておりますが、セキュリティの都合上一部データを加工しているため実態とは異なる点ご注意ください。

API キーの生成

長期キーと短期キーのそれぞれで試してみます。

長期キーの場合

Bedrock のコンソールから「API keys」を選択します。

Amazon Bedrock API キー管理画面

API キーの有効期限を選択することが可能です。

長期APIキー生成画面

プリセットとして用意されている期間もあれば、個別にカスタマイズすることも可能です。

APIキー有効期限設定メニュー

また、オプション設定で Marketplace モデルへのアクセス権限を設定できます。

Marketplace モデルの設定画面

今回は設定しませんが、設定する場合はキーに関連付けられた IAM ユーザーに、「AmazonBedrockMarketplaceAccess ポリシー」が付与されます。
AmazonBedrockMarketplaceAccess – AWS 管理ポリシー

作成が完了すると、API キーが表示されます。
アクセスキー同様に後からこの画面に戻れないため、API キーのコピーやキーファイルのダウンロードを忘れないように気をつけてください。

長期キー情報の画面

ちなみに、ダウンロードしたファイルの中身は以下でした。

ファイル名:bedrock-long-term-api-key.csv

API key name,API key
BedrockAPIKey-n158-at-[AWS アカウントID],ABSKQmVkcm9ja0FQSUtleS1uMTU4MTY2MTQ3MzpPRE1kMjJtNWdlSk10K2Rm

作成後の画面では、API キーの一覧が表示されていますが、API キーに対しては操作はできないようです。

長期キーの一覧画面

また、長期キーを作成すると、実態としては IAM ユーザーが作られるようなので、IAM ユーザーも確認してみます。
確認したところ、以下の IAM ユーザーが作成されていました。

APIキーのIAMユーザー

また、セキュリティ認証情報の欄に、「Amazon Bedrock の API キー」が作成されていました。

APIキー一覧管理画面

アクセスキー同様に API キーに対して、無効化や削除が行えます。

APIキーのアクション操作画面

権限は、「AmazonBedrockLimitedAccess」がアタッチされています。

AmazonBedrockLimitedAccess
説明: Amazon Bedrock およびそれに必要な関連サービスへの制限付きアクセスを提供します
AmazonBedrockLimitedAccess – AWS 管理ポリシー > Amazon Bedrock の AWS 管理ポリシー – Amazon Bedrock

IAMユーザーのポリシー画面

短期キーの場合

では、続いては短期キーを作成します。

短期キー作成画面

短期キーの場合は、長期キーと違って設定項目はないので、作成を押した段階で API キーが払い出されます。

短期キー作成後画面

ちなみに、長期キーと違って短期キーはかなり長い API キーでした。

set AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-YmVkcm9jay5hbWF6b25hd3MuY29tLz9BY3Rpb249Q2FsbFdpdGhCZWFyZXJUb2tlbiZYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFTSUFTRklYQzJBUTc3NjdXUldIJTJGMjAyNTA3MzAlMkZ1cy1lYXN0LTElMkZiZWRyb2NrJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA3MzBUMDUyNDExWiZYLUFtei1FeHBpcmVzPTQzMjAwJlgtQW16LVNlY3VyaXR5LVRva2VuPUlRb0piM0pwWjJsdVgyVmpFSTclMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkYlMkZ3RWFDWFZ6TFdWaGMzUXRNU0pITUVVQ0lGSlhvNXVOTE5ucUF3WTlJQks2Mkx1bQWhwWGN1Q3RXVmc4aXVRMzlPJTJGdEhNZkxkRFRDMXlGTnpacmJBbUd

API キーの作成画面を閉じても作成したキーは表示されません。

短期キー作成完了後の画面

API キーを使用した動作確認

それぞれ API キーを払い出したので、実際に API キーを使って Bedrock にリクエストを送ってみます。

以下、ドキュメントのサンプルコードを使用します。
Amazon Bedrock API キーを使用する – Amazon Bedrock

なお、サンプルコードからレスポンス結果を表示するために、末尾に「print(response)」を追加しています。
今回は、バージニア北部リージョンで検証を行っていますが、利用するリージョンが異なる場合はリージョン設定を変えてください。

import os
import boto3

# If you already set the API key as an environment variable, you can comment this line out
os.environ['AWS_BEARER_TOKEN_BEDROCK'] = "${api-key}"

# Create an Amazon Bedrock client
client = boto3.client(
    service_name="bedrock-runtime",
    region_name="us-east-1" # If you've configured a default region, you can omit this line
)

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

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

print(response)

長期キーの場合

環境変数に API キーをセットして Bedrock を呼び出します。

C:\Users>set AWS_BEARER_TOKEN_BEDROCK_LONG_TERM=ABSKQmVkcm9ja0FQSUtleSMTU4LWF0LTE0ODc2MTY2

C:\Users>echo %AWS_BEARER_TOKEN_BEDROCK_LONG_TERM%
ABSKQmVkcm9ja0FQSUtleS1uMTULWF0LTE0ODc2MTY2

リクエストが成功した場合は、以下のように結果が返ってきます。

{
  "ResponseMetadata": {
    "RequestId": "57458784-b95e-4006-8a5f-faca4d53fcc1",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Wed, 30 Jul 2025 05:59:55 GMT",
      "content-type": "application/json",
      "content-length": "363",
      "connection": "keep-alive",
      "x-amzn-requestid": "57458784-b95e-4006-8a5f-faca4d53fcc1"
    },
    "RetryAttempts": 0
  },
  "output": {
    "message": {
      "role": "assistant",
      "content": [
        {
          "text": "Hi there! How are you doing today? Is there anything I can help you with?"
        }
      ]
    }
  },
  "stopReason": "end_turn",
  "usage": {
    "inputTokens": 8,
    "outputTokens": 21,
    "totalTokens": 29,
    "cacheReadInputTokens": 0,
    "cacheWriteInputTokens": 0
  },
  "metrics": { "latencyMs": 952 }
}

短期キーの場合

続いては、短期キーを試します。
今度は、環境変数ではなくコード上に API キーを埋め込んでリクエストしてみます。

import os
import boto3

# If you already set the API key as an environment variable, you can comment this line out
os.environ['AWS_BEARER_TOKEN_BEDROCK'] = "bedrock-api-key-YmVkcm9jay5hbWF6b25hd3MuY29tLz9BY3Rpb249Q2FsbFdpdGhCZWFyZXJUb2tlbiZYLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFTSUFTRklYQzJBUTc3NjdXUldIJTJGMjAyNTA3MzAlMkZ1cy1lYXN0LTElMkZiWRyb2NrJTJGYXdzNF9yZXF1"

# Create an Amazon Bedrock client
client = boto3.client(
    service_name="bedrock-runtime",
    region_name="us-east-1" # If you've configured a default region, you can omit this line
)

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

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

print(response)

こちらも変わりなく結果が返ってきました。

{
  "ResponseMetadata": {
    "RequestId": "60b3af41-a3f7-4cc0-9e23-96fc32e19f61",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Wed, 30 Jul 2025 06:11:18 GMT",
      "content-type": "application/json",
      "content-length": "363",
      "connection": "keep-alive",
      "x-amzn-requestid": "60b3af41-a3f7-4cc0-9e23-96fc32e19f61"
    },
    "RetryAttempts": 0
  },
  "output": {
    "message": {
      "role": "assistant",
      "content": [
        {
          "text": "Hi there! How are you doing today? Is there anything I can help you with?"
        }
      ]
    }
  },
  "stopReason": "end_turn",
  "usage": {
    "inputTokens": 8,
    "outputTokens": 21,
    "totalTokens": 29,
    "cacheReadInputTokens": 0,
    "cacheWriteInputTokens": 0
  },
  "metrics": { "latencyMs": 825 }
}

CloudTrail を見てみる

ここで、API キーの操作ログが気になったため、CloudTrail を見てみたいと思います。

「Converse API」を使って Bedrock にリクエストをしますので、この API で検索してみます。

Converse API オペレーションとの会話を実行する – Amazon Bedrock

先ほど長期キーで検証した際の API は以下の通りです。
ユーザー名が「BedrockAPIKey-n158」になっています。

長期キーのCloudTrailのイベント

{
  "eventVersion": "1.11",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDASFIXC2AQQCYJWDOAT",
    "arn": "arn:aws:iam::012345678912:user/BedrockAPIKey-n158",
    "accountId": "012345678912",
    "userName": "BedrockAPIKey-n158"
  },
  "eventTime": "2025-07-30T06:18:22Z",
  "eventSource": "bedrock.amazonaws.com",
  "eventName": "Converse",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "0.0.0.0",
  "userAgent": "Boto3/1.39.16 md/Botocore#1.39.16 ua/2.1 os/windows#11 md/arch#amd64 lang/python#3.12.3 md/pyimpl#CPython m/D,b,Z,3 cfg/retry-mode#legacy Botocore/1.39.16",
  "requestParameters": {
    "modelId": "us.anthropic.claude-3-5-haiku-20241022-v1:0"
  },
  "responseElements": null,
  "additionalEventData": {
    "callWithBearerToken": true,
    "inferenceRegion": "us-west-2"
  },
  "requestID": "55b37cc0-b4c6-4e8e-92d4-2078e70bcc15",
  "eventID": "3b5c3c87-c6c4-4894-a8d6-18ae4d0c77b6",
  "readOnly": true,
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "012345678912",
  "eventCategory": "Management",
  "tlsDetails": {
    "tlsVersion": "TLSv1.3",
    "cipherSuite": "TLS_AES_128_GCM_SHA256",
    "clientProvidedHostHeader": "bedrock-runtime.us-east-1.amazonaws.com"
  }
}

続いては、短期キーの API を見てみます。
長期キーと比較すると、ユーザー名が異なっています。
様々な検証を行った結果、API キーを作成した IAM ユーザーが使用されるようです。

{
  "eventVersion": "1.11",
  "userIdentity": {
    "type": "AssumedRole",
    "principalId": "AROASFIXC2AQ3BHXLPMA3:kiryu.tsuji@nhn-techorus.com",
    "arn": "arn:aws:sts::012345678912:assumed-role/AWSReservedSSO_AdministratorAccess_5a101fcce3d90832/kiryu.tsuji@nhn-techorus.com",
    "accountId": "012345678912",
    "sessionContext": {
      "sessionIssuer": {
        "type": "Role",
        "principalId": "AROASFIXC2AQ3BHXLPMA3",
        "arn": "arn:aws:iam::012345678912:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_AdministratorAccess_5a101fcce3d90832",
        "accountId": "012345678912",
        "userName": "AWSReservedSSO_AdministratorAccess_5a101fcce3d90832"
      },
      "attributes": {
        "creationDate": "2025-07-30T01:09:17Z",
        "mfaAuthenticated": "false"
      }
    }
  },
  "eventTime": "2025-07-30T06:29:58Z",
  "eventSource": "bedrock.amazonaws.com",
  "eventName": "Converse",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "0.0.0.0",
  "userAgent": "Boto3/1.39.16 md/Botocore#1.39.16 ua/2.1 os/windows#11 md/arch#amd64 lang/python#3.12.3 md/pyimpl#CPython m/3,b,Z,D cfg/retry-mode#legacy Botocore/1.39.16",
  "requestParameters": {
    "modelId": "us.anthropic.claude-3-7-sonnet-20250219-v1:0"
  },
  "responseElements": null,
  "additionalEventData": {
    "callWithBearerToken": true,
    "inferenceRegion": "us-east-2"
  },
  "requestID": "5771ac7c-0fbe-4263-9597-8ad63d38536b",
  "eventID": "019b9a12-0091-475b-8367-a4fd7ca72f79",
  "readOnly": true,
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "012345678912",
  "eventCategory": "Management",
  "tlsDetails": {
    "tlsVersion": "TLSv1.3",
    "cipherSuite": "TLS_AES_128_GCM_SHA256",
    "clientProvidedHostHeader": "bedrock-runtime.us-east-1.amazonaws.com"
  },
  "sessionCredentialFromConsole": "true"
}

試しに、別の IAM ユーザーを作成してから API キーを払い出して、先ほどと同じ環境でプログラムを呼び出します。
すると今度は、作成した IAM ユーザーの名前で記録されています。

短期キーのCloudTrailのイベント

{
  "eventVersion": "1.11",
  "userIdentity": {
    "type": "IAMUser",
    "principalId": "AIDASFIXC2AQTPRNQM33S",
    "arn": "arn:aws:iam::012345678912:user/cold-airflow",
    "accountId": "012345678912",
    "userName": "cold-airflow",
    "sessionContext": {
      "attributes": {
        "creationDate": "2025-07-30T06:42:35Z",
        "mfaAuthenticated": "false"
      }
    }
  },
  "eventTime": "2025-07-30T06:45:04Z",
  "eventSource": "bedrock.amazonaws.com",
  "eventName": "Converse",
  "awsRegion": "us-east-1",
  "sourceIPAddress": "0.0.0.0",
  "userAgent": "Boto3/1.39.16 md/Botocore#1.39.16 ua/2.1 os/windows#11 md/arch#amd64 lang/python#3.12.3 md/pyimpl#CPython m/b,3,D,Z cfg/retry-mode#legacy Botocore/1.39.16",
  "requestParameters": {
    "modelId": "us.anthropic.claude-opus-4-20250514-v1:0"
  },
  "responseElements": null,
  "additionalEventData": {
    "callWithBearerToken": true,
    "inferenceRegion": "us-west-2"
  },
  "requestID": "ff8e1404-abc7-484c-b0f8-d4110dea40fd",
  "eventID": "6f379a89-6651-428d-a0ae-cfe45cf3631c",
  "readOnly": true,
  "eventType": "AwsApiCall",
  "managementEvent": true,
  "recipientAccountId": "012345678912",
  "eventCategory": "Management",
  "tlsDetails": {
    "tlsVersion": "TLSv1.3",
    "cipherSuite": "TLS_AES_128_GCM_SHA256",
    "clientProvidedHostHeader": "bedrock-runtime.us-east-1.amazonaws.com"
  },
  "sessionCredentialFromConsole": "true"
}

API キーが侵害された場合の対処法

API キーが侵害されたときの対処法も気になったので検証してみました。
API キーは、以下の方法で使用権限を取り消すことができます。

  • 長期キー
    • キーのステータスの無効化
    • キーは後で再アクティブ化可能
    • キーをリセット
    • キーを完全に削除
    • IAM ユーザーの権限を削除
    • IAM ユーザー/ロールのセッションを無効にする
  • 短期キー
    • IAM ユーザー/ロールのセッションを無効にする

侵害された長期および短期の Amazon Bedrock API キーの処理 – Amazon Bedrock

キーのステータスの無効化

IAM の画面から操作を行います。
アクセスキー同様に、対象の API キーを選択して無効化することができます。

長期キーの無効化画面

無効化した状態で呼び出すとエラーになります。

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

再度有効化することも可能です。

長期キーの再有効化画面

キーをリセット

API キーの再発行という形になります。

長期キーのリセット画面

リセットすると作成時と同じように API キーの画面が表示されます。

長期キーのリセット後のキー表示画面

キーを完全に削除

API キーを削除するだけです。
ただし、削除前に無効化する必要があります。

長期キー削除画面

無効化すると、「confirm」が入力できます。

長期キー削除画面確認入力

IAM ユーザーの権限を削除

長期キーの実態としては、IAM ユーザーが存在するので、その IAM ユーザーからポリシーを削除すれば実行できなくなります。

APIキーIAMユーザーのポリシー画面

IAM ユーザー/ロールのセッションを無効にする

認証したセッションを無効化する方法です。
この方法は、短期キーを作成した際に使用したプリンシパル(IAM ユーザー/ロール)によって操作方法が異なります。

IAM ユーザーで短期キーを作成した場合は、そのユーザーのコンソールアクセスを無効にする際に、アクティブなセッションを取り消すオプションが利用できます。

コンソールアクセス無効化画面

アクセスの無効化を行い、自動的に付与されたポリシーが以下の通りです。

設定されたポリシー画面

この状態でプログラムを実行すると、以下のエラーが発生します。

botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the Converse operation: User: arn:aws:iam::012345678912:user/cold-airflow is not authorized to perform: bedrock:InvokeModel on resource: arn:aws:bedrock:us-east-1:012345678912:inference-profile/us.anthropic.claude-opus-4-20250514-v1:0 with an explicit deny in an identity-based policy

IAM ロールで短期キーを作成した場合は、IAM ロールの管理画面から「セッションの取り消し」操作を行います。

IAMロールのセッション取り消し画面

IAM ロールの一時的なセキュリティ認証情報を取り消す – AWS Identity and Access Management

短期キーを更新する

「aws-bedrock-token-generator」 を使うことで新しいキーを作成することができるようです。

AWS Bedrock Token Generator for Python は、 AWS Bedrock API 認証用の短期ベアラートークンを生成する軽量ユーティリティライブラリです。
このライブラリは、長期的な認証情報を公開することなく、AWS Bedrock サービスへの認証に使用できる、安全で期限付きのトークンの作成プロセスを簡素化します。
https://github.com/aws/aws-bedrock-token-generator-python

基本的には、使い捨てで新しいキーを作成する形になります。

詳細は以下をご覧ください。
制御とセキュリティを強化するために、短期の Amazon Bedrock API キーを更新します – Amazon Bedrock

API キーの有効期限切れの動作

有効期限切れになった API キーを呼び出すとどうなるのか気になったので検証しました。

長期キーの場合

有効期限中と同じようにリクエストを投げてみます。
すると以下のエラーが表示されました。

botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the Converse operation: Authentication failed: Please make sure your API Key is valid.
↓翻訳
botocore.errorfactory.AccessDeniedException: Converse 操作を呼び出した際にエラーが発生しました (AccessDeniedException): 認証に失敗しました: API キーが有効であることを確認してください。

コンソールで API キーを確認すると、期限切れになっていました。

長期キー認証期限切れ画面

短期キーの場合

こちらも同じように実行します。
長期キーとは違ったエラーになりました。

botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the Converse operation: Bearer Token has expired
↓翻訳
botocore.errorfactory.AccessDeniedException: Converse 操作を呼び出した際にエラーが発生しました (AccessDeniedException): ベアラートークンが期限切れです

まとめ

様々な検証を行いましたが、セキュリティ上のリスクを考慮すると、設定する権限や漏洩時の対策を十分に検討する必要がありそうです。
しかし、手軽に Bedrock をプログラムから呼び出す際にはとても便利かなと思いました。

また、この API キーならクロスアカウントや SaaS から Bedrock を利用したい際にも活用できそうです。

参考資料

短期 Amazon Bedrock API キーを更新して制御とセキュリティを強化する – Amazon Bedrock
Amazon Bedrock が開発効率化のための API キーを導入 – AWS
Amazon Bedrock API キーで AI 開発を加速 | 人工知能
Amazon Bedrock の API キー – AWS Identity and Access Management

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら