🎃

TerrafromでAmazon Bedrockが扱えるように設定されたLambdaモジュールを作ってみた

2023/10/25に公開

はじめに

こんにちは!AWS大好き学生みゃっちーです🦔
今回はBedrockを扱えるように設定されたLambdaモジュールを作成しました!

Bedrockは現在(2023年10月25日時点)デフォルトのLambdaに搭載されているboto3のバージョンでは使用できないため、カスタムレイヤーの設定が必要ですが、Lambdaモジュールの中に組み込んであるのでTerraformを使える環境があれば、簡単なコマンドで環境を展開または削除できます。またモジュール展開後はlambdaからBedrockに問い合わせを行い、回答を取得するサンプルプログラムが最初に記述されるので一度betrockを試してみたい方も、触ってみてください。

さらに、連携先としてAPIgatewayモジュールも自作し、これらのモジュールを使用して質問を送信すると、回答が返ってくるAPIが作成されるサンプルプログラムも作成しました。

Amazon Bedrockとは?

AWS環境で生成系AIを提供するサービスで公式には以下のような記載があります。

Amazon Bedrock は、AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon などの大手 AI 企業が提供する高性能な基盤モデル (FM) を単一の API で選択できるフルマネージド型サービスです。
https://aws.amazon.com/jp/bedrock/

サンプルプログラムの動かし方

以下のリポジトリからコードを取得してください。
https://github.com/FujiiHirokl/bedrock_test/tree/main
1. 実行するディレクトリへの移動
モジュールを使用するサンプルプログラムがあるディレクトリに移動します。

cd .\env\bedrock_lambda_test\

2. Terraformの実行

terraform init  
terraform plan
terraform apply

3. リージョンを選択
main.tfファイルに書かれているリージョンにマネジメントコンソールを変更してください。
※ほかに使いたいリージョンがあればコードを書き換えて大丈夫です。
4. マネジメントコンソールでbedrockへのアクセスを許可
こちらの記事に方法が記載されています。
https://dev.classmethod.jp/articles/amazon-bedrock-ga/
5. 実行
1.APIgatewayを検索欄から選択し、作成されているAPIを選択します。
2.リソースから/exampleのPOSTを選択します。
3.下記の選択欄から「テスト」を選択してください。

4.リクエスト本文に質問を入力し、下のテストボタンを押す。

{
  "prompt": "こんにちは!"
}

6. レスポンス
数秒後に、以下のようなレスポンスが返ってきます。

また、Lambda単体でもイベントjsonにリクエスト本文と同じ形式のものを記載することでテストから動作させることができます。

7. 環境の削除
以下のコマンドを入力すると環境を削除できます。

terraform destroy

モジュール説明

今回作成したbedrockモジュールのディレクトリ構造はこんな感じです。

bedrock/
|-- lambda_function/
   |--main.py
|-- main.tf
|-- output.tf
|-- variables.tf
|-- boto3_1.28.69.zip

入力変数

モジュールを呼び出すときはvariables.pyに記載されている値を設定することができます。

variable "region" {
  description = "AWS リージョン"
  default     = "us-east-1"
}
# 以下省略

出力変数

作成したbedrockモジュールからの値を別モジュールで扱いたい場合はoutput変数を参考にし、呼び出し元でこのように記述してください。今回のapigatewayの例ではinvoke_arnと関数名をbedrockモジュールから受け渡してます。

module "apigateway" {
  source = "../../modules/apigateway"
  aws_lambda_arn = module.bedrock.lambda_function_invoke_arn
  lambda_function_name = module.bedrock.function_name
}

lambda上のプログラム

モジュールが実行されるとlambdaにアタッチできるようにmain.pyのプログラムがZIPファイルに圧縮されbedrockディレクトリに保存されます。もし、環境構築後にmain.pyの書き換えを行って変更を環境に反映させたい場合は「terraform apply」コマンドを使うことで変更を検知し、ZIPファイルの作り直しからアタッチまで行ってくれます。

boto3レイヤーの作成

boto3についてですが現時点では下記のような記載があり、カスタムLambdaレイヤーを作成する必要があります。詳しくはこちらを参照してください。
https://dev.classmethod.jp/articles/invoke-bedrock-form-lambda-function/

当記事の執筆時点 (2023/09/29) では、Lambda関数の標準の状態ではBedrockを利用することができません。 何故なら、Lambda関数に標準で組み込まれているBoto3のバージョンが、Bedrockに対応していないためです。

そのため、上記の記事の手順に則り作成したZIPファイルをモジュール内に組み込み、モジュール内のカスタムLambdaレイヤー作成リソースで読み込みを行い、Lambda関数にアタッチしています。

# カスタムLambdaレイヤーの定義
resource "aws_lambda_layer_version" "lambda_layer" {
  filename   = "../../modules/bedrock/boto3_1.28.69.zip"
  layer_name = "boto3_layer"
  compatible_runtimes = ["python3.11"]
}

まとめ

ここまで読んでくださってありがとうございました!
Terrafromはやっぱり作ってしまうと展開と削除が簡単だからもっと扱えるようにならなきゃ…そして生成系AIの可能性は無限大…

参考

こちらの記事を参考にさせていただきました!ありがとうございます。
https://dev.classmethod.jp/articles/invoke-bedrock-form-lambda-function/
https://dev.classmethod.jp/articles/amazon-bedrock-ga/

Discussion