Amazon Bedrock API Key って結局いつ使えて?何が嬉しいの?
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
みなさん、Amazon Bedrock API Key 使っていますでしょうか。
最近、アクセスキーと何が違うの?どういった出番で使えるの?とご相談いただく機会が増えてきました。
そこで今回は、私なりに登場機会を整理したいと思います。
Amazon Bedrock API Key
Amazon Bedrock API Key とは、今年の 07 月に発表された、Bedrock を利用するための新しい認証の仕組みです。
Long-term(長期)の API キーと Short-term(短期)の API キーがあり、セキュリティの観点から、可能であれば短期の API キー利用がオススメされています。
長期 API キーは、短期 API キーと比較してセキュリティリスクが高くなります。可能であれば、短期 API キーまたは一時的なセキュリティ認証情報を使用することをお勧めします。長期 API キーを使用する場合は、定期的なキーローテーションプラクティスを実施することをお勧めします。
短期の API キー
短期の API キーは、AWS Signature Version 4 を採用した署名付き URL です。そのため、API キーを発行した IAM によって、API キーの有効期限が変動します。
最大 12 時間または、セッション残り時間の短い方の時間まで有効です。
また、長期の API キーとは、次の 2 点が異なります。
- キーの生成に使用されたプリンシパルに添付された権限を継承する
- 生成した AWS リージョンでのみ使用できる
長期の API キー
長期の API キーは文字通り、キーの有効期間が長い API キーの発行方法です。
1 日から 366,000 日(約 1,000年)の期限をカスタムできます。無期限(Never expires)の API キーも生成できます。
裏側では、 IAM ユーザーを作成し、サービス固有の認証情報を利用して払い出しを行っています。
デフォルトでは AmazonBedrockLimitedAccess ポリシーが付与されます。
Amazon Bedrock API Key の嬉しいところ
主にクロスアカウントアクセスが非常に容易になることです。
データはアカウント A に保持したいが、推論はアカウント B でやりたいなど、クロスアカウントにまたがるケースにおいて Amazon Bedrock API Key は非常に有効な手段になります。
まずは Amazon Bedrock API Key がなければ、どんな実装になるか考えてみましょう。
次は Strands Agents + boto3 (AWS SDK for Python) でクロスアカウントアクセスを実装した例です。ご覧のように推論のために、別途クライアント/セッションを生成する必要があります。
import boto3
from strands import Agent
from strands.models import BedrockModel
# Assume Role
sts = boto3.client('sts')
assume_res = sts.assume_role(
# クロスアカウント先の IAM ロールを指定
RoleArn="arn:aws:iam::194712345678:role/assume-703612345678",
RoleSessionName="AgentSession",
)
credentials = assume_res['Credentials']
# セッションの作成
session = boto3.Session(
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['SessionToken']
)
# 作成したセッションで Model を定義
bedrock_model = BedrockModel(
model_id="jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
boto_session=session
)
# 指定した Model を利用する
agent = Agent(model=bedrock_model)
response = agent("Tell me about Amazon Bedrock.")
Amazon Bedrock API Key を利用すると...
続いて Amazon Bedrock API Key を利用すると、どういった処理になるか見てみましょう。
Amazon Bedrock API Key は、環境変数 AWS_BEARER_TOKEN_BEDROCK
を登録して利用します。
export AWS_BEARER_TOKEN_BEDROCK=bedrock-api-key-hogehoge
ご覧の通り、Session を別途定義せず実装できます。「IAM が干渉しない世界」が垣間見えたのではないでしょうか。
from strands import Agent
from strands.models import BedrockModel
# Model を定義
bedrock_model = BedrockModel(
model_id="jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
)
agent = Agent(model=bedrock_model)
response = agent("Tell me about Amazon Bedrock.")
IAM の優先順位
上の書き方をすると、「スイッチ元の Bedrock が使われているのでは?」と、思う方もいるのではないでしょうか。
この部分の仕様ですが、 Amazon Bedrock API Key が IAM より優先されて利用されます。
スイッチ元 AWS アカウントの Bedrock では、Claude Sonnet 4 が利用可能な状態。スイッチ先 AWS アカウントの Bedrock では、Claude Sonnet 4 が利用できない状態を用意してみました。
スイッチ元 AWS アカウント (7036 から始まる)
スイッチ先 AWS アカウント (1947 から始まる)
コードも Claude Sonnet 4.5 から Claude Sonnet 4 へ変更します。
from strands import Agent
from strands.models import BedrockModel
# Model を定義
bedrock_model = BedrockModel(
+ model_id="apac.anthropic.claude-sonnet-4-20250514-v1:0",
- model_id="jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
)
agent = Agent(model=bedrock_model)
response = agent("Tell me about Amazon Bedrock.")
次のように、アカウント内でモデルが有効化されていないエラーが出ていますね。
An error occurred (AccessDeniedException) when calling the ConverseStream operation: Your account does not have an agreement to this model.
加えて、「Amazon Bedrock API Key が使えないから、既存の IAM を使ってアクセスする
」といったフォールバックも行われません。
takakuni@ bedrock % uv run python main_w_api_key.py
Traceback (most recent call last):
File "/Users/takakuni/Documents/bedrock/main_w_api_key.py", line 10, in <module>
response = agent("Tell me about Amazon Bedrock.")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/agent/agent.py", line 408, in __call__
return future.result()
^^^^^^^^^^^^^^^
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/concurrent/futures/_base.py", line 456, in result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/concurrent/futures/_base.py", line 401, in __get_result
raise self._exception
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/opentelemetry/instrumentation/threading/__init__.py", line 171, in wrapped_func
return original_func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/agent/agent.py", line 404, in execute
return asyncio.run(self.invoke_async(prompt, **kwargs))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/asyncio/runners.py", line 194, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/asyncio/runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/agent/agent.py", line 436, in invoke_async
async for event in events:
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/agent/agent.py", line 581, in stream_async
async for event in events:
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/agent/agent.py", line 619, in _run_loop
async for event in events:
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/agent/agent.py", line 658, in _execute_event_loop_cycle
async for event in events:
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/event_loop/event_loop.py", line 191, in event_loop_cycle
raise e
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/event_loop/event_loop.py", line 138, in event_loop_cycle
async for event in stream_messages(agent.model, agent.system_prompt, agent.messages, tool_specs):
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/event_loop/streaming.py", line 351, in stream_messages
async for event in process_stream(chunks):
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/event_loop/streaming.py", line 308, in process_stream
async for chunk in chunks:
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/models/bedrock.py", line 625, in stream
await task
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/asyncio/threads.py", line 25, in to_thread
return await loop.run_in_executor(None, func_call)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/.asdf/installs/python/3.12.4/lib/python3.12/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/opentelemetry/instrumentation/threading/__init__.py", line 171, in wrapped_func
return original_func(*func_args, **func_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/models/bedrock.py", line 743, in _stream
raise e
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/strands/models/bedrock.py", line 661, in _stream
response = self.client.converse_stream(**request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/client.py", line 602, in _api_call
return self._make_api_call(operation_name, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/context.py", line 123, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/client.py", line 1078, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the ConverseStream operation: Your account does not have an agreement to this model.
└ Bedrock region: ap-northeast-1
└ Model id: apac.anthropic.claude-sonnet-4-20250514-v1:0
Claude Sonnet 4.5 にモデル ID を変えて実行してみます。
from strands import Agent
from strands.models import BedrockModel
# Model を定義
bedrock_model = BedrockModel(
model_id="jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
)
agent = Agent(model=bedrock_model)
response = agent("Tell me about Amazon Bedrock.")
当たり前ですが、Amazon Bedrock API Key を利用して、うまく推論できていますね。
takakuni@ bedrock % uv run python main_w_api_key.py
# Amazon Bedrock
Amazon Bedrock is a fully managed service from AWS that provides access to foundation models (FMs) from leading AI companies through a single API. Here are the key aspects:
## **What It Offers**
- **Multiple AI Models**: Access to models from providers like:
- Anthropic (Claude)
- AI21 Labs (Jurassic)
- Stability AI (Stable Diffusion)
- Meta (Llama)
- Cohere
- Amazon's own Titan models
## **Key Features**
- **Serverless**: No infrastructure to manage
- **Model Customization**: Fine-tune models with your own data while keeping it private
- **RAG Support**: Integrate with knowledge bases for retrieval-augmented generation
- **Agents**: Build AI agents that can execute multi-step tasks
- **Enterprise-Ready**: Built-in security, privacy, and compliance features
## **Use Cases**
- Text generation and summarization
- Conversational AI/chatbots
- Image generation
- Content creation
- Code generation
- Data analysis and insights
## **Benefits**
- Pay-as-you-go pricing
- Data privacy (your data isn't used to train base models)
- Easy model switching and experimentation
- Integration with AWS services
It's designed to help organizations build and scale generative AI applications without the complexity of managing ML infrastructure.
Bedrock 周りの API はすべて Amazon Bedrock API Key が許可される?
Bedrock API 周りすべて Amazon Bedrock API Key が許可される?のか、気になってきましたよね。
結論、以下の制御になります。
「Amazon Bedrock API 群および、 Amazon Bedrock Runtime API 群は Amazon Bedrock API Key が優先されて使用される。それ以外は、クライアントに設定された IAM が利用される。
」
これだけ覚えておけば、大抵のケースでは OK です。[1]
Amazon Bedrock API 群で言えば、Amazon Bedrock Guardrails や Prompt Management などの操作が可能です。
Amazon Bedrock Runtime API 群で言うと、モデルの推論に加えて、トークンの計算や非同期推論のジョブ操作ができます。
間違えがちなのですが、Agents for Amazon Bedrock API 群や Agents for Amazon Bedrock Runtime API 群は対象外です。
たとえば、 Amazon Bedrock Knowledge bases の作成/操作や、Amazon Bedrock Agents の作成/操作は Amazon Bedrock API Key ではサポートしていません。
このあたりの仕様は、以下をチェックしておくと良いでしょう。
(番外編) AmazonBedrockLimitedAccess について
再度になりますが、長期の API Key では、デフォルトで AmazonBedrockLimitedAccess ポリシーが付与されます。
ご覧の通り、CreateGuardrail
など、モデルの推論(InvokeModel
)以外の Bedrock API も許可されています。
{
"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"
}
}
}
]
}
そのため、IAM を持たない環境で Amazon Bedrock API Key(AWS_BEARER_TOKEN_BEDROCK
)のみ設定されたとします。
次のコードは動くのでしょうか?
import boto3
client = boto3.client(
service_name='bedrock',
region_name='ap-northeast-1'
)
response = client.create_guardrail(
name='bedrock-api-key',
description='bedrock-api-key',
contentPolicyConfig={
'filtersConfig': [
{
'type': 'PROMPT_ATTACK',
'inputStrength': 'LOW',
'outputStrength': 'NONE'
},
]
},
blockedInputMessaging='Block!!!',
blockedOutputsMessaging='Block!!!'
)
print(response)
先ほど記載した通り、CreateGuardrail は Amazon Bedrock API 群に所属するため利用できます。
takakuni@ bedrock % uv run python create_guardrails.py
{'ResponseMetadata': {'RequestId': 'aed46cdc-06ee-49e1-ae18-33d1c547d7ed', 'HTTPStatusCode': 202, 'HTTPHeaders': {'date': 'Wed, 01 Oct 2025 14:04:56 GMT', 'content-type': 'application/json', 'content-length': '177', 'connection': 'keep-alive', 'x-amzn-requestid': 'aed46cdc-06ee-49e1-ae18-33d1c547d7ed'}, 'RetryAttempts': 0}, 'guardrailId': 'tni3op9z78br', 'guardrailArn': 'arn:aws:bedrock:ap-northeast-1:194712345678:guardrail/tni3op9z78br', 'version': 'DRAFT', 'createdAt': datetime.datetime(2025, 10, 1, 14, 4, 56, 51966, tzinfo=tzutc())}
余談ですが、AWS CLI でも動きます。
takakuni@ bedrock % aws bedrock list-guardrails
{
"guardrails": [
{
"id": "tni3op9z78br",
"arn": "arn:aws:bedrock:ap-northeast-1:194712345678:guardrail/tni3op9z78br",
"status": "READY",
"name": "bedrock-api-key",
"description": "bedrock-api-key",
"version": "DRAFT",
"createdAt": "2025-10-01T14:04:56.051966+00:00",
"updatedAt": "2025-10-01T14:04:56.152558+00:00"
}
]
}
これは AWS CLI が Python で動いており、Amazon Bedrock API がサポートしている SDK に Python が含まれているためです。
Supported Regions and AWS software development kits (SDKs) for Amazon Bedrock API keys
続いて AmazonBedrockLimitedAccess では、iam:ListRoles
がワイルドカードで許可されてたりします。次のように list_roles
はできるのでしょうか。
import boto3
client = boto3.client(
service_name='iam',
region_name='ap-northeast-1'
)
response = client.list_roles()
print(response)
IAM で許可されているものの、 Amazon Bedrock API Key ではサポートしていないため、次のように Unable to locate credentials となります。想定通りですね。
takakuni@ bedrock % uv run python list_roles.py
Traceback (most recent call last):
File "/Users/takakuni/Documents/bedrock/list_roles.py", line 8, in <module>
response = client.list_roles()
^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/client.py", line 602, in _api_call
return self._make_api_call(operation_name, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/context.py", line 123, in wrapper
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/client.py", line 1060, in _make_api_call
http, parsed_response = self._make_request(
^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/client.py", line 1084, in _make_request
return self._endpoint.make_request(operation_model, request_dict)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/endpoint.py", line 119, in make_request
return self._send_request(request_dict, operation_model)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/endpoint.py", line 196, in _send_request
request = self.create_request(request_dict, operation_model)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/endpoint.py", line 132, in create_request
self._event_emitter.emit(
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/hooks.py", line 412, in emit
return self._emitter.emit(aliased_event_name, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/hooks.py", line 256, in emit
return self._emit(event_name, kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/hooks.py", line 239, in _emit
response = handler(**kwargs)
^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/signers.py", line 108, in handler
return self.sign(operation_name, request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/signers.py", line 200, in sign
auth.add_auth(request)
File "/Users/takakuni/Documents/bedrock/.venv/lib/python3.12/site-packages/botocore/auth.py", line 422, in add_auth
raise NoCredentialsError()
botocore.exceptions.NoCredentialsError: Unable to locate credentials
RetrieveAndGenerate API について
Knowledge bases からデータソースを取得し、回答を生成する RetrieveAndGenerate API と言うものがあります。
以下は Amazon Bedrock のモデル実行ログですが、identity
の ARN が異なりますね。一体どう言うことでしょうか。
{
"timestamp": "2025-10-01T14:43:34Z",
"accountId": "703612345678",
"identity": {
"arn": "arn:aws:sts::703612345678:assumed-role/AmazonBedrockExecutionRoleForKnowledgeBase_skgns/BKB-Retrieve-BKIBOTZ87V-0fada31f-6daa-4b5f-8d4c-98ed51c5e8e4"
},
"region": "us-east-1",
"requestId": "cccda710-cc34-4caf-a99b-1bf7a50c7fbd",
"operation": "InvokeModel",
"modelId": "arn:aws:bedrock:us-east-1::foundation-model/amazon.titan-embed-text-v2:0",
"input": {
"inputContentType": "application/json",
"inputBodyJson": {
"inputText": "Amazon Bedrock AgentCore Runtime の CPU 数は?\n",
"dimensions": 1024,
"embeddingTypes": [
"float"
]
},
"inputTokenCount": 12
},
"output": {
"outputContentType": "application/json",
"outputBodyJson": {
"embedding": [
"抜粋"
],
"embeddingsByType": {
"float": [
"抜粋"
]
},
"inputTextTokenCount": 12
}
},
"schemaType": "ModelInvocationLog",
"schemaVersion": "1.0"
}
{
"timestamp": "2025-10-01T14:43:35Z",
"accountId": "703612345678",
"identity": {
"arn": "arn:aws:sts::703612345678:assumed-role/AWSReservedSSO_AdministratorAccess_213995852bc44d19/hoge"
},
"region": "us-east-1",
"requestId": "cc9afe72-75b9-44d1-a2bc-3b2b5619331f",
"operation": "ConverseStream",
"modelId": "arn:aws:bedrock:us-east-1:703612345678:inference-profile/global.anthropic.claude-sonnet-4-20250514-v1:0",
"input": {
"inputContentType": "application/json",
"inputBodyJson": {
"messages": [
{
"role": "user",
"content": [
{
"text": "Amazon Bedrock AgentCore Runtime の CPU 数は?\n"
}
]
}
],
"system": [
{
"text": "抜粋 (システムプロンプトとベクトル検索の結果が記載されていました)"
}
],
"inferenceConfig": {
"maxTokens": 2048,
"temperature": 0,
"topP": 1,
"stopSequences": [
"\nObservation"
]
},
"additionalModelRequestFields": {}
},
"inputTokenCount": 2014,
"cacheReadInputTokenCount": 0,
"cacheWriteInputTokenCount": 0
},
"output": {
"outputContentType": "application/json",
"outputBodyJson": {
"output": {
"message": {
"role": "assistant",
"content": [
{
"text": "抜粋 (回答内容が記載されていました)"
}
]
}
},
"stopReason": "end_turn",
"metrics": {
"latencyMs": 2796
},
"usage": {
"inputTokens": 2014,
"outputTokens": 116,
"totalTokens": 2130
}
},
"outputTokenCount": 116
},
"inferenceRegion": "us-west-2",
"schemaType": "ModelInvocationLog",
"schemaVersion": "1.0"
}
これは、回答生成の推論では、透過的にクライアントの IAM プリンシパルが利用され回答が生成されていることを指しています。具体的には以下の図のフローです。
RetrieveAndGenerate API は Agents for Amazon Bedrock Runtime API 群に所属していますが、operation
を確認すると、透過的にクライアントの IAM を利用して、ConverseStream API (Amazon Bedrock Runtime API 群) が使われています。
このケースでは、どのような挙動をするのでしょうか。試してみましょう。(※ S3 Vector を利用したかったため、us-east-1 になっています)
再び、Claude Sonnet 4 が使える AWS アカウントと Claude Sonnet 4.5 使える AWS アカウントを用意し、Claude Sonnet 4.5 使える AWS アカウントから API Key を発行し環境変数に登録、Claude Sonnet 4 が使える AWS アカウントから、以下のコードを実行してみます。
import boto3
KNOWLEDGEBASE_ID = "BKIBOTZ87V" # ナレッジベース ID を記載
model_arn = "global.anthropic.claude-sonnet-4-20250514-v1:0"
bedrock_agent = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
prompt = (
"Amazon Bedrock Runtime って何ですか?"
)
response = bedrock_agent.retrieve_and_generate(
input={"text": prompt},
retrieveAndGenerateConfiguration={
"type": "KNOWLEDGE_BASE",
"knowledgeBaseConfiguration": {
"knowledgeBaseId": KNOWLEDGEBASE_ID,
"modelArn": model_arn,
},
},
)
print(response["output"]["text"],flush=False)
問題なく回答生成が行われているため、 Claude Sonnet 4 が使える AWS アカウントの IAM が優先されたことがわかります。
takakuni@ bedrock % uv run python retrieve_and_generate.py
Amazon Bedrock AgentCore Runtimeは、AIエージェントやツールのデプロイと実行に特化した、安全でサーバーレスな実行環境です。HTTPおよびMCPプロトコルに対応しています。 主な特徴として、フレームワークに依存せず、モデルの柔軟性が高く(Bedrockに依存しない)、ARMコンテナで起動します(x86_64は未サポート)。実際に消費されたリソースに対してのみ課金され、動的にプロビジョニングが行われ、LLMの応答待機などのI/O待機期間中は課金が発生しません。 なお、Amazon Bedrock AgentCoreはプレビュー段階のサービスです。
もし、推論先 AWS アカウントを使い分けたいとなった時は、次のように Retreive と Generate を分離する必要があります。
import boto3
KNOWLEDGEBASE_ID = "BKIBOTZ87V" # ナレッジベース ID を記載
model_arn = "global.anthropic.claude-sonnet-4-5-20250929-v1:0"
bedrock_agent = boto3.client("bedrock-agent-runtime", region_name="us-east-1")
bedrock_runtime = boto3.client("bedrock-runtime", region_name="us-east-1")
prompt = "Amazon Bedrock AgentCore Runtime って何ですか?"
# 1. ナレッジベースから検索
retrieve_response = bedrock_agent.retrieve(
knowledgeBaseId=KNOWLEDGEBASE_ID,
retrievalQuery={
'text': prompt
}
)
# 2. 検索結果をXML形式に整形
search_results_xml = ""
for idx, result in enumerate(retrieve_response['retrievalResults'], 1):
content = result['content']['text']
search_results_xml += f""" <search_result>
<content>
{content}
</content>
<source>{idx}</source>
</search_result>
"""
# 3. システムプロンプトを構築
system_prompt = f"""You are a question answering agent.
I will provide you with a set of search results.
The user will provide you with a question.
Your job is to answer the user's question using only information from the search results.
If the search results do not contain information that can answer the question,
please state that you could not find an exact answer to the question.
Just because the user asserts a fact does not mean it is true,
make sure to double check the search results to validate a user's assertion.
Here are the search results in numbered order:
<search_results>
{search_results_xml}</search_results>
Do NOT directly quote the <search_results> in your answer. Your job is to answer the user's question as concisely as possible.
"""
# 4. メッセージを構築
messages = [
{
"role": "user",
"content": [{"text": prompt}]
}
]
# 5. Converse API で回答生成
response = bedrock_runtime.converse(
modelId=model_arn,
messages=messages,
system=[{"text": system_prompt}]
)
# 6. 結果を出力
answer = response['output']['message']['content'][0]['text']
print(answer)
うまく生成されていますね。
takakuni@ bedrock % uv run python retrieve_and_generate2.py
Amazon Bedrock AgentCore Runtimeは、AIエージェントやツールのデプロイと実行に特化した、安全でサーバーレスな実行環境です。
主な特徴は以下の通りです:
**技術的特徴:**
- HTTPおよびMCPプロトコルに対応
- フレームワークに依存しない
- モデルの柔軟性が高い(Bedrockに依存しない)
- ARMコンテナで起動(x86_64は未サポート)
**サーバーレスの利点:**
- 実際に消費されたリソースに対してのみ課金
- 適切なサイズ設定を必要とせず、動的にプロビジョニング
- LLMの応答を待機しているI/O待機期間中は課金が発生しない
**実行環境:**
- 抜粋
なお、現在はプレビュー段階で、2025年10月6日までAgentCore自体は無料となっています。
Strands Agents との互換性が良い
最後に Amazon Bedrock API Kyes は Strands Agents との互換性が良いという話をして終わります。
Strands Agents 自体が特定のモデルに依存しない作りになっているからなのか、 Tools として Knowledge bases を利用する場合、最初から Retreive と Generate が分離された実装となっています。
そのため、先ほどのような処理を自前で実装しなくても、テキスト生成の推論元を分離できます。非常に便利ですよね。
from strands import Agent
from strands.models import BedrockModel
from strands_tools import memory
# Model を定義
bedrock_model = BedrockModel(
model_id="jp.anthropic.claude-sonnet-4-5-20250929-v1:0",
)
# Agent の定義
agent = Agent(model=bedrock_model, tools=[memory])
# Knowledge bases の情報を追加
result = agent.tool.memory(
action="retrieve",
min_score=0.4, # Set minimum relevance threshold
max_results=5, # Limit number of results
STRANDS_KNOWLEDGE_BASE_ID="BKIBOTZ87V"
)
response = agent(
"Amazon Bedrock AgentCore Runtime って何ですか?"
)
もちろん、うまく動いています。
takakuni@ bedrock % uv run python main_w_api_key_kb.py
Amazon Bedrock AgentCore Runtimeについてご説明します。
**Amazon Bedrock AgentCore Runtime**は、Amazon Bedrockのエージェント機能を実行するためのランタイム環境です。以下の特徴があります:
## 主な機能
1. **エージェントの実行環境**
- AIエージェントがタスクを実行するための基盤となるランタイム
- 複数のステップにわたる複雑なタスクの調整と実行
2. **ツールとの統合**
- 外部ツールやAPIとの連携を管理
- ナレッジベース(Knowledge Base)へのアクセス
- カスタムツールの呼び出し
3. **会話管理**
- ユーザーとの対話セッションの管理
- コンテキストの保持と追跡
4. **意思決定プロセス**
- LLMを使用してユーザーの意図を理解
- 適切なツールやアクションの選択
- 結果の統合と応答の生成
このランタイムは、エージェントが自律的にタスクを実行し、必要に応じて様々なリソースにアクセスできるようにする重要なコンポーネントです。
まとめ
以上、「Amazon Bedrock API Key って結局いつ使えて?何が嬉しいの?」でした。
「IAM が干渉しない世界」と言う言葉を勝手に私が使っているわけですが、なんとなく感覚わかる方いるのではないでしょうか。
IAM アクセスキーと違い、権限が付いていても Bedrock API や Bedrock Runtime API 以外ことができないようになっているは嬉しいかもですが、静的な API キーには変わらないので管理にはお気をつけください。
このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!
Amazon Bedrock Runtime API 群の中で InvokeModelWithBidirectionalStream API(Amazon Nova Sonic で利用する双方向ストリーミング API)は対象外になります。 ↩︎