1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS LambdaでBedrock APIを呼び出す

Posted at

はじめに

生成AIのRAGシステムを構築する前段階として、AWSのLambdaから生成AIモデルを呼び出してみました。
実行ロールの割り当てに引っかかって時間を使ったので、やり方をまとめました。

Amazon Bedrockの事前準備

まず、AWS CLIをインストールして認証します。
方法はAWS CLIを使い始めるまでに書いています。

次に、Bedrockへのモデルアクセスとトークンの発行を行います。
こちらは、「Amazon Bedrock API (Claude 3 Haiku)のはじめの第一歩」にまとめました。

Lambda関数の作成

LambdaFunctionsCreate functionからLambda関数を作ります。

image.png

Create functionで関数を作成できたら、関数の設定を行います。
デフォルトではTimeoutが3秒となっていて、モデルの推論時間に間に合わない可能性が高いので、編集してTimeoutの時間を長くします。

image.png

Amazon Bedrock APIを使ってハンドラを実装

Codeタブに生成AIモデルを呼び出すプログラムを書きます。
プログラムを書いた後、Deployボタンをクリックするのを忘れないでください。

image.png

プログラム自体は前回で使用したものと同じです。一箇所、プロンプトを引数で受け取れるように設定しています。

lambda_function
import boto3
import json

def lambda_handler(event, context):
    brt = boto3.client(service_name="bedrock-runtime", region_name="ap-southeast-2")
    body = json.dumps({
        "anthropic_version": "bedrock-2023-05-31",
        "messages": [{"role": "user", "content": event["prompt"]}],
        "max_tokens": 300,
        "temperature": 0.1,
    })

    modelId = "anthropic.claude-3-haiku-20240307-v1:0"
    accept = "application/json"
    contentType = "application/json"

    response = brt.invoke_model(
        body=body, 
        modelId=modelId, 
        accept=accept, 
        contentType=contentType
    )
    response_body = json.loads(response.get("body").read())

    return json.dumps(response_body, indent=4, ensure_ascii=False)

ポリシーの割り当て

Lambda関数がAWSの他のサービスやリソースにアクセスするためには、Lambdaに実行ロールを割り当てなければなりません。
Bedrockへのアクセスは、AmazonBedrockFullAccessポリシーを割り当てることで解決します。
まず、Lambdaのロール名が必要なので、ConfigurationPermissionsからロール名を確認します。

image.png

AWS CLIの認証とアクセスキーの登録を済ませた状態で、ターミナルで以下のコマンドを入力します。下記のlambda-role-nameのところに、先ほど確認したロール名を入力してください。

aws iam attach-role-policy --role-name [lambda-role-name] --policy-arn arn:aws:iam::aws:policy/AmazonBedrockFullAccess

テスト

Testボタンをクリックして、テストを作成します。
テストはJSON形式で書く必要があり、ここで作成したテストは、lambda_handler関数のeventに渡されます。

Test
{
    "prompt": "日本固有の料理を教えてください。"
}

テストを実行すると、無事に実行結果が得られました。

出力プロンプト
"はい、日本には非常に豊かな食文化があります。日本固有の代表的な料理をいくつか紹介します。\\n\\n1. 寿司 - 生の魚介類を酢飯の上に乗せた料理。江戸時代に発祥し、世界的に有名な日本の料理です。\\n\\n2. 天ぷら - 野菜や魚介類を薄く切って衣をつけて揚げた料理。軽くて香ばしい食感が特徴です。\\n\\n3. 蕎麦 - 細長い麺を使った料理。そばつゆに浸して食べるのが一般的です。地域によって味付けや食べ方が異なります。\\n\\n4. 懐石料理 - 季節の食材を使った数種類の小皿料理が特徴の伝統的な日本料理。繊細な盛り付けと味付けが魅力です。\\n\\n5. 焼き鳥 - 鶏肉を串に刺して炭火\"

参考

Lambda 実行ロール

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?