LambdaをAPI化してGETで呼んでみます
手順
簡易版
Lambdaを選んで
関数 > 関数の作成
こんな感じに
※ポイント
・その他設定から「関数 URL を有効化」を選択してください。
・認証はとりあえずNONE
あとはデフォルトで関数の作成をクリック
関数 URLが作成されるのでクリック
はい、こんにちは。
これでおしまいです。簡単ですね、お疲れ様でした!
ちょっと凝ってみる
こんにちはするAPIじゃ使い物にならないので、GETリクエストでパラメータを受け付けてみましょう。
claude-3-sonnetにコードを作ってもらいましょう。
作ってもらったコードを赤枠箇所に張り付けます。
Deployします。
先ほど表示した関数 URLに「?」でパラメータを追加して実行すると表示できます。
コードも置いておきます。
lambda_function.py
import json
def lambda_handler(event, context):
try:
# クエリパラメータから'prompt'を取得
query_params = event.get('queryStringParameters', {}) or {}
prompt = query_params.get('prompt', '')
# プロンプトの有無をチェック
if prompt:
message = f"プロンプトを受け取りました: {prompt}"
else:
message = "プロンプトが指定されていません"
# レスポンスの作成
response = {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"message": message,
"prompt": prompt
}, ensure_ascii=False)
}
return response
except Exception as e:
return {
"statusCode": 500,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"error": str(e)
}, ensure_ascii=False)
}
もう少し凝ってみる
もう少し進んで、
ここで作成したBedrockを呼び出せるLambda関数をAPI化してみたいと思います。
以下でコードを書き換えてください。上記手順の設定が完了できていればAPI経由でBedrockを呼び出せます。
lambda_function.py
import boto3
import json
import urllib.parse
def lambda_handler(event, context):
try:
# API Gatewayからのクエリパラメータを取得
query_params = event.get('queryStringParameters', {}) or {}
prompt = query_params.get('prompt', '')
# URLエンコードされた日本語プロンプトをデコード
prompt = urllib.parse.unquote(prompt)
# プロンプトが空の場合はエラーレスポンスを返す
if not prompt:
return {
"statusCode": 400,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"error": "プロンプトが指定されていません"
}, ensure_ascii=False)
}
# Bedrock Runtime クライアントを初期化
brt = boto3.client(service_name="bedrock-runtime", region_name="us-west-2")
# Bedrockに送信するリクエストボディを構築
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"messages": [{"role": "user", "content": prompt}],
"max_tokens": 300,
"temperature": 0.1,
})
modelId = "anthropic.claude-3-sonnet-20240229-v1:0"
accept = "application/json"
contentType = "application/json"
# Bedrock APIを呼び出し
response = brt.invoke_model(
body=body,
modelId=modelId,
accept=accept,
contentType=contentType
)
# Bedrockからのレスポンスを解析
response_body = json.loads(response.get("body").read())
# API Gatewayに返すレスポンスを構築
return {
"statusCode": 200,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"prompt": prompt,
"response": response_body
}, ensure_ascii=False)
}
except Exception as e:
# エラーが発生した場合のレスポンス
return {
"statusCode": 500,
"headers": {
"Content-Type": "application/json"
},
"body": json.dumps({
"error": str(e)
}, ensure_ascii=False)
}
こんな感じ