はじめに
LambdaでBedrockを呼び出すだけのシンプルな構成を作ってみました。
構築の順序としては以下になります。
- IAMロールの作成
- Lambda関数の作成
- 動作確認
1. IAMロール作成
LambdaからBedrockを呼び出すためのIAMロールを作成します。
ロールには「AmazonBedrockFullAccess」のポリシーを付与します。
2. Lambda関数作成
以下の設定でLambda関数を作成します。
- ランタイム:python 3.14
- アーキテクチャ:x86_64
- 実行ロール:既存のロールを使用する
- 1.で作成したロールを指定
Lambdaで実行されるコードはpythonで記述しております。
ここでは入力されたリクエストをBedrockに渡し、回答をレスポンスとして返します。
import json
import boto3
def lambda_handler(event, context):
bedrock_runtime = boto3.client(service_name='bedrock-runtime', region_name='us-east-1')
model_id = 'anthropic.claude-3-haiku-20240307-v1:0'
system_prompt = "質問を入力してください"
max_tokens = 1000
user_message = {"role": "user", "content": event.get("message")}
messages = [user_message]
body = json.dumps(
{
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": max_tokens,
"system": system_prompt,
"messages": messages
}
)
response = bedrock_runtime.invoke_model(body=body, modelId=model_id)
response_body = json.loads(response.get('body').read())
return {
'statusCode': 200,
'body': response_body
}
3. 動作確認
Lambda関数で想定したレスポンスが返ってくるかを確認します。
Lambda関数作成後はデフォルトのタイムアウト設定(3秒)の場合、レスポンスが返る前にタイムアウトとなるため、30秒に変更しています。

{
"message": "1日は何秒ですか"
}
{
"statusCode": 200,
"body": {
"id": "msg_bdrk_01BAx3687ANBfwauLvGZvPq3",
"type": "message",
"role": "assistant",
"model": "claude-3-haiku-20240307",
"content": [
{
"type": "text",
"text": "1日は86,400秒です。\n\nこれは以下のように計算されます:\n\n- 1日 = 24時間\n- 1時間 = 60分\n- 1分 = 60秒\n- 24時間 × 60分 × 60秒 = 86,400秒\n\nつまり、1日は24時間、1時間は60分、1分は60秒なので、1日は24 × 60 × 60 = 86,400秒となります。\n\nこのように、1日が86,400秒であることは、時間の単位換算から導き出される基本的な事実です。"
}
],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 24,
"output_tokens": 171
}
}
}
「"1日は何秒ですか"」というリクエストに対して「86,400秒」と回答が返ってきており、LambdaがBedrockへリクエストし、レスポンスを受け取っていることが確認できました。ちなみにBedrockからは単純な秒数の結果だけでなく、計算方法についても返ってきています。
おわりに
LambdaでBedrockを呼び出してみました。今後はAPI Gatewayを用いてAPI経由での実行やDB/ストレージ等、他のAWSサービスとの連携も実践していきたいと思います。


