現在新卒研修中であり,チームメンバーから「Bedrockの使い方を教えて欲しい」という声がありました.
今回は,簡単に生成AIを用いたアプリケーションを開発することのできる「Bedrock」を用いた簡単なテキストチャットアプリを作成します.
エラーハンドリング等の処理をすべて省き,Bedrockでclaude4-sonnetに質問をしてその返答をreturnするだけのシンプルなLambda関数を作成しました.
はじめてLambdakを触るような人にもわかるように解説していきます.
その関数のコードをもとに,使い方を解説していきます.
また,Bedrockの使用にはAIがよく出力するInvokeModel
ではなくconverse
を使用します.
- Lambda: Bedrockにプロンプトを入力し,推論結果を返す関数を作成する
- IAM: LambdaにBedrockへのアクセスを許可する
- Bedrock: 使用可能な生成AIのモデルアクセスを選択する
AWS マネージメントコンソールから,Lambda関数を作成する
関数名:simple-bedrock
ランライム:python3.13
アーキテクチャ:x86_64
その他は何もいじらなくて大丈夫です.
また,ランタイムはPython3.9以上であればどのバージョンを使用しても問題ありません.
以下のUIになれば大丈夫です.これでLambda関数の準備は終わりました.
-
リージョンを「バージニア北部(us-east-1)」に変更する
Bedrockで使用する生成AIのモデルは,このリージョンで最も安定して動きます.
そのため,東京(ap-northeast-1)リージョンのLambda関数で,
バージニア北部(us-east-1)リージョンにあるBedrockの生成AIモデルを使用します. -
モデルアクセスを変更をクリックする.
使用したい生成AIのモデルにチェクマークを入れ,[次へ]から[送信]してください.
今回は全て選択してもらっても大丈夫です.
数分待てば,今申請したモデルが使用可能になり,Bedrockの有効化が完了したことになります.
LambdaのIAMロールにBedrockへのアクセスを許可しないと,
Bedrockを呼び出す権限がない.というエラーになります.
-
[ロール名]の下にリンクがあると思うので,そこからIAMロールというものを設定していきます.
[許可]タブから[許可ポリシー]の[許可を追加]→[インラインポリシーを作成]
JSONを選択し,以下のjsonを貼り付けて,[次へ].
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel",
"bedrock:InvokeModelWithResponseStream"
],
"Resource": [
"arn:aws:bedrock:*:*:foundation-model/anthropic.*",
"arn:aws:bedrock:*:*:inference-profile/us.anthropic.*",
"arn:aws:bedrock:*:*:inference-profile/eu.anthropic.*"
]
}
]
}
3.ポリシー名を決め,[ポリシーの作成]をクリックします.
今回はsimple-bedrock-policy
としましょう.
これでLambdaからBedrockを使用することができるようになります.
今回はライブラリにboto3とjsonしか用いないため,コンテナイメージやLambdaレイヤーなどの準備をする必要はないです.このコードを貼り付けて,イベントJSONを入力すれば動きます.
完成コード
lambda_function.py
import json
import boto3
def lambda_handler(event, context):
# プロンプトを取得
prompt = event.get("prompt")
# Bedrockクライアントを作成
bedrock_client = boto3.client('bedrock-runtime', region_name='us-east-1')
# Converseを呼び出し
response = bedrock_client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [
{
"text": prompt
}
]
}
],
inferenceConfig={
"maxTokens": 1000
}
)
# レスポンスから結果を取得
result = response['output']['message']['content'][0]['text']
# 結果を返す
return {
"prompt": prompt,
"result": result
}
イベントJSON
{
"prompt": "日本の三大武将を教えて"
}
一度実行してみましょう.
- [コード]タブの中の[コードソース]の
lambda_function.py
に完成コードを貼り付けます. - [Deploy]をクリック,もしくは
Shift + Cmd + U
でデプロイします. - [設定]タブの[一般設定]の[編集]をクリックし,[タイムアウト]をデフォルトの3秒から30秒に変更し,保存します.
- [テスト]タブの[イベントJSON]に上記のjsonを貼り付け,オレンジ色のテストボタンをクリックし,[テスト]を行います.
テストで成功するとこのようなUIになります.
詳細を確認すると,以下のようになっています.
{
"prompt": "日本の三大武将を教えて",
"result": "日本の三大武将としてよく挙げられるのは、以下の3人です。\n\n1. 源頼朝(1147年-1199年)\n鎌倉幕府を開いた初代将軍。平氏一門を討伐し、武家政権の基礎を築きました。\n\n2. 織田信長(1534年-1582年) \n天下布武を目指した戦国大名。本能寺の変で暗殺されましたが、東西の統一に大きく貢献しました。\n\n3. toyotomi 秀吉(1537年-1598年)\n甲斐武田家の家臣から出世し、関ヶ原の戦いで徳川家康に勝利しました。全国統一を達成した太閤です。\n\nこの3人の武将は、日本の歴史に大きな足跡を残し、時代を画する活躍をしたことから、三大武将と呼ばれています。頼朝は武家政権の祖、信長は統一への布石、秀吉は実際の統一を成し遂げた、という位置付けです。"
}
今回は日本の三大武将を教えて
という内容のプロンプトを推論させました.
イベントJSONのprompt
に与える文字列を好きに変えてみると,その文字列の回答がresult
として返されます.
コードの解説
ライブラリのインポート
pythonでjsonの操作を行うため,jsonライブラリをインポートしてます.
boto3はpythonでAWSリソースを扱うためのライブラリです.今回の場合,このboto3でbedrockを使用しています.
lambda_handler関数の宣言
def lambda_handler(event, context):
C言語のmain関数と同じです.APIの呼び出しなどによってLambda関数が実行された場合,このlambda_handler
の中の処理が行われます.
また,2つの引数event
,context
があります.
イベントJSONに入っているjsonはこのevent
に渡されます.context
は,Lambda関数の関数名やランタイムなどの情報が入っています.
プロンプトを取得
prompt = event.get("prompt")
生成AIに推論させる内容であるprompt
に,イベントJSONのprompt
を渡しています.
つまり,今回の場合,prompt = "日本の三大武将を教えて"
と同義です.
Bedrockクライアントを作成
bedrock_client = boto3.client('bedrock-runtime', region_name='us-east-1')
クライアントとは,この場合接続窓口を表します.
bedrockを使用するため,窓口を作成する必要があります.boto3を使用し,バージニア北部(us-east-1)にあるbedrockのbedrock-runtime
を使用する宣言をします.bedrock-runtime
は,AWSが提供するAI推論サービス,つまりBedrockのことです.
Bedrock呼び出し
response = bedrock_client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [
{
"text": prompt
}
]
}
],
inferenceConfig={
"maxTokens": 1000
}
)
少し前に定義したbedrock_client
を使用し,Bedrockを呼び出します.modelId
で使用するモデルを指定します.今回はanthropic社のclaude4-sonnetを使用します.modelId
はマネジメントコンソール上のBedrockのModel catalog
から確認できます.messages
の中のtext
にAIに推論してほしい内容を入れます.
推論結果を含めて様々な情報がこの変数response
に代入されます.
レスポンスの解析
result = response_body['output']['message']['content'][0]['text']
response
には,欲しい情報以外にも様々な情報が含まれます.具体的には以下の感じです.
{'ResponseMetadata': {'RequestId': '1234567890',
'HTTPStatusCode': 200, 'HTTPHeaders': {'date': 'Mon, 16 Jun 2025 13:49:27 GMT',
'content-type': 'application/json', 'content-length': '1197',
'connection': 'keep-alive', 'x-amzn-requestid': '1234567890'}, 'RetryAttempts': 0},
'output': {'message': {'role': 'assistant',
'content': [{'text': '日本の三大武将として一般的に挙げられるのは以下の3人です:
\n\n## **織田信長(1534-1582)**\n- 戦国時代の革新的な武将
\n- 楽市楽座や兵農分離など革新的な政策を実施\n- 天下統一の基盤を築いた
\n\n## **豊臣秀吉(1537-1598)**\n- 信長の後継者として天下統一を達成
\n- 農民出身から関白まで上り詰めた立身出世の代表例\n- 刀狩りや太閤検地などの政策を実施
\n\n## **徳川家康(1543-1616)**\n- 江戸幕府の初代将軍
\n- 関ヶ原の戦いで勝利し、約260年続く江戸時代の基礎を築いた
\n- 忍耐強い性格で「鳴くまで待とう時鳥」の句で知られる
\n\nこの3人は「戦国三英傑」とも呼ばれ、それぞれが天下統一に向けて重要な役割を果たし、
日本史上最も有名な武将として親しまれています。'}]}},
'stopReason': 'end_turn', 'usage': {'inputTokens': 19,
'outputTokens': 348, 'totalTokens': 367}, 'metrics': {'latencyMs': 12345}}
今回の場合,欲しいのはこの中のoutput
の中のmessage
の中のcontent
の最初の要素のtext
要素だけです.
なのでresult = response_body['output']['message']['content'][0]['text']
でresponse
の中を読み込み,必要な部分だけをresult
に代入しています.
結果を返す
return {
"prompt": prompt,# 元の質問
"result": result # AIのかいとう
}
これが最終的なLambda関数の出力になります.
コードの解説は以上です.
発展1:クエリパラメータでpromptを受け取る
完成コード
lambda_function.py
import json
import boto3
def lambda_handler(event, context):
# クエリパラメータからプロンプトを取得
prompt = event.get("queryStringParameters", {}).get("prompt")
# Bedrockクライアントを作成
bedrock_client = boto3.client('bedrock-runtime', region_name='us-east-1')
# Converseを呼び出し
response = bedrock_client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [
{
"text": prompt
}
]
}
],
inferenceConfig={
"maxTokens": 1000
}
)
# レスポンスを解析して結果を取得
result = response['output']['message']['content'][0]['text']
# 結果を返す
return {
"prompt": prompt,
"result": result
}
API Gatewayの設定をする
このセクションでは,API Gatewayで,このLambda関数をGETメソッドで呼び出して使用できるようにする.
そのため,まずはAPI GatewayでAPIエンドポイントを発行する.
-
マネージメントコンソールで[API Gateway]を検索し,クリックします.
-
[APIを作成]をクリックします.
-
[統合タイプ]にLambda関数を指定し,作成したLambda関数
simple-bedrock
を指定し,[作成]をクリックする. -
Lambda関数に戻り,[設定]の[トリガー]を確認すると,APIエンドポイントが発行されている.
このURLを呼び出すと,Lambda関数が実行されるようになった. -
ブラウザを開いて,APIを呼び出してみる.
エンドポイントのURLを貼り付けて,https://xxxxxx.amazonaws.com/?prompt=日本の有名な武将を教えて
とし,Enterキーをクリックすると,しばらくして下記画像のように推論結果が返ってくる.?prompt=xxxxx
をクエリパラメータという.エンドポイント?クエリパラメータ
とすることによってそのクエリパラメータの部分がAIに渡すテキストとなり,そのテキストの内容を推論してくれる.クエリパラメータの部分に何も入力しないとエラーになる.
コードの変更点
before
# プロンプトを取得
prompt = event.get("prompt")
after
# クエリパラメータからプロンプトを取得
prompt = event.get("queryStringParameters", {}).get("prompt")
変更点はこの行だけであり,イベントJSONからprompt
を受け取っていたのを,クエリパラメータから受け取るように変更しただけである.
発展2:POSTメソッドでJSONを受け取り,JSONの中にpromptを格納しておく
完成コード
こちらのコードも発展1と同様に,変更したのはprompt=json.loads
の部分1行だけです.
import json
import boto3
def lambda_handler(event, context):
# POSTのJSONボディからプロンプトを取得
prompt = json.loads(event.get("body", "{}")).get("prompt")
# Bedrockクライアントを作成
bedrock_client = boto3.client('bedrock-runtime', region_name='us-east-1')
# Converseを呼び出し
response = bedrock_client.converse(
modelId="us.anthropic.claude-sonnet-4-20250514-v1:0",
messages=[
{
"role": "user",
"content": [
{
"text": prompt
}
]
}
],
inferenceConfig={
"maxTokens": 1000
}
)
# レスポンスを解析して結果を取得
result = response['output']['message']['content'][0]['text']
# 結果を返す
return {
"prompt": prompt,
"result": result
}
API Gatewayの設定をする
POSTメソッドを使用することにより,クエリパラメータを使用せず,イベントJSONを用いた時と同じようにしてprompt
を渡すことができます.
発展1で使用したものと同じAPI Gatewayに設定を追加し,POSTで通信できるようにしましょう.
-
発展1で作成したAPI Gateway「simple-bedrock-api」を開く
-
Lambda関数に戻り,[設定]の[トリガー]を確認すると,新しく
/post
で終わるAPIエンドポイントが増えている.これを呼び出し,jsonでイベントJSONと同様のものを渡すとプロンプトが返ってくる. -
curl
コマンドでAPI呼び出しテストを行うhttps:/xxxxxxx
は/post
で終わるAPIエンドポイントに変えてください.
curl -X POST https://xxxxxxxx/post \
-H "Content-Type: application/json" \
-d '{"prompt": "日本の有名な武将を教えてください"}'
しばらくすると,推論結果が返ってくると思います.
自分はcurl
コマンドの形式を覚えていないのでいつもPostmanを使って呼び出しテストを行なっています.
Postmanを使用してAPI呼び出しテストを行う.
-
インストールが完了すると,画像のように,拡張機能マークの下にPostmanマークが現れると思います.
そのアイコンをクリックし,[New HTTP Request]からAPI呼び出しテストを行うことができます. -
各種設定をする.
①POSTメソッドを選択し,APIエンドポイントを貼り付ける.
②[Body]→③[raw]→④[Text]を[JSON]に変更する.
⑤イベントJSONと同じようにjsonでprompt
を指定する.
今回はLambda+Bedrockで簡単なチャットが可能なLambda関数を作成しました.
これらのAPIをWebサイトに埋め込み,fetch
やaxios
で呼び出すことで簡単にチャットアプリを作成することができます.
しかし,今のままではAIと会話を続けていくことはできません.1つ前にどんな会話をしていたかを考慮していないからです.
そのため,次回ではDynamoDBを使用して会話を続けることのできるチャット機能の実装をします.
Views: 0