「AIチャットボットを自分で作ってみたい」と思ったことはありますか?
AWSのAmazon BedrockとLambdaを組み合わせると、ChatGPTのような対話型AIを自分のシステムに組み込むことができます。この記事では、実際に構築した経験をもとに、仕組みから実装のポイントまで解説します。
構成の全体像
今回構築したシステムの構成はシンプルです。
ユーザー
↓ テキストを送信
API Gateway
↓ リクエストを転送
Lambda関数
↓ Bedrockを呼び出す
Amazon Bedrock(Claude)
↓ AIの回答を返す
Lambda関数
↓ レスポンスを返す
API Gateway
↓
ユーザー(回答を受け取る)
ユーザーからのメッセージをAPI Gatewayで受け取り、Lambda関数がBedrockのAPIを呼び出してAIの回答を取得し、ユーザーに返すという流れです。
使用するAWSサービス
| サービス | 役割 |
|---|---|
| Amazon Bedrock | AIモデルの呼び出し(今回はClaude) |
| AWS Lambda | Bedrockを呼び出す処理を実行 |
| Amazon API Gateway | HTTPリクエストの受け口 |
| AWS IAM | LambdaがBedrockを呼び出すための権限管理 |
サーバーを自分で用意・管理する必要がないサーバーレス構成なので、運用コストを最小限に抑えられます。
Amazon Bedrockとは?
Amazon Bedrockは、AWSが提供するフルマネージドの生成AIサービスです。
AnthropicのClaude・MetaのLlama・AmazonのNova・Stability AIなど、複数の基盤モデル(Foundation Model)をAPIで利用できます。
自分でAIモデルをトレーニングしたり、GPUサーバーを用意したりする必要がなく、API呼び出しだけで高性能なAIを使えるのが最大のメリットです。
実装のポイント
1. IAMロールの設定
LambdaがBedrockを呼び出すには、適切なIAM権限が必要です。
Lambdaの実行ロールに以下のポリシーをアタッチします。
json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"bedrock:InvokeModel"
],
"Resource": "*"
}
]
}
権限が不足していると「AccessDeniedException」エラーが発生するため、最初に確認しておくことが重要です。
2. Lambda関数の実装(Python)
Bedrockを呼び出すLambda関数の基本的な実装です。
python
import json
import boto3
def lambda_handler(event, context):
# リクエストボディからメッセージを取得
body = json.loads(event['body'])
user_message = body['message']
# Bedrockクライアントの初期化
bedrock = boto3.client('bedrock-runtime', region_name='us-east-1')
# Claudeへのリクエスト
response = bedrock.invoke_model(
modelId='anthropic.claude-3-sonnet-20240229-v1:0',
body=json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1000,
"messages": [
{
"role": "user",
"content": user_message
}
]
})
)
# レスポンスの解析
result = json.loads(response['body'].read())
ai_response = result['content'][0]['text']
return {
'statusCode': 200,
'headers': {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*'
},
'body': json.dumps({
'response': ai_response
}, ensure_ascii=False)
}
3. API Gatewayの設定
API GatewayでHTTP APIを作成し、LambdaとPOSTメソッドで連携します。
設定のポイント:
- メソッド:POST
- 統合タイプ:Lambda関数
- CORSの設定を忘れずに行う(フロントエンドから呼び出す場合)
4. モデルの有効化
Bedrockで使用するモデルは、AWSコンソールで事前に有効化(アクセスをリクエスト)する必要があります。
手順:
- AWSコンソールでBedrockを開く
- 左メニューの「モデルアクセス」を選択
- 使用するモデル(例:Claude 3 Sonnet)のアクセスをリクエスト
- 承認されたら利用可能になる
承認は数分〜数時間かかる場合があります。
実装してみてわかったこと
よかった点
コストが安い サーバーレス構成のため、使った分だけの課金です。開発・テスト段階ではほぼ無料の範囲に収まりました。
スケーラビリティが高い Lambdaは同時リクエストが増えても自動でスケールするため、急なアクセス増加にも対応できます。
構築が速い インフラの管理が不要なため、AIチャットボットの核心部分の実装に集中できました。コアの実装自体は数時間で完成しました。
注意が必要な点
リージョンの制限 Bedrockで利用できるモデルはリージョンによって異なります。Claude 3はus-east-1(バージニア北部)での利用が推奨されています。
レイテンシー AIモデルの回答生成には数秒かかる場合があります。ユーザー体験を考慮してローディング表示を実装することをおすすめします。
コンテキスト管理 基本的な実装では会話の履歴を保持しません。「前の会話を踏まえた返答」が必要な場合は、会話履歴をDynamoDBなどに保存して毎回Bedrockに渡す実装が必要です。
応用できるユースケース
このアーキテクチャは様々な場面に応用できます。
- カスタマーサポートボット — よくある質問に自動回答
- 社内ナレッジBot — 社内ドキュメントを学習させてQ&Aに対応
- コードレビューBot — コードをBedrockに送って改善点を返す
- 多言語対応チャット — 日本語の質問を英語で回答するなど
Amazon Bedrockには「ナレッジベース」機能もあり、自社のドキュメントや製品情報をAIに学習させたRAG構成も比較的簡単に実装できます。
まとめ
Amazon Bedrock × Lambda × API Gatewayの組み合わせで、サーバーレスなAIチャットボットを構築できます。
ポイントのおさらい:
- IAMロールでBedrockへのアクセス権限を付与する
- Lambdaで
bedrock-runtimeクライアントを使ってモデルを呼び出す - API GatewayでHTTPエンドポイントを作成する
- 使用するモデルは事前にコンソールで有効化しておく
生成AIをAWSのサービスと組み合わせるパターンは今後ますます増えていきます。まずはシンプルな構成から試してみて、徐々に機能を拡張していくのがおすすめです。
※ 本記事で使用したコードはサンプルです。本番環境での利用には適切なエラーハンドリング・認証・セキュリティ対策を追加してください。

コメント