【AWS】TerraformでLambdaを作成しBedrock(Titan)を呼び出してみた

TerraformでLambdaを作成しBedrock(Titan)を呼び出してみた
前提
・us-east-1(バージニア北部)で実施
・Titan Text G1 - Expressにアクセスが付与されていること

実践!
1.環境作成
1-1.下記ファイルを作成
version.tf
terraform { required_providers { aws = { source = "hashicorp/aws" version = "~> 5.0" } } required_version = ">= 1.0.0" }
provider.tf
provider "aws" { profile = "testvault" region = "us-east-1" }
main.tf
resource "aws_iam_role" "lambda_execution" { name = "lambda-execution-role" assume_role_policy = jsonencode({ Version = "2012-10-17", Statement = [ { Effect = "Allow", Principal = { Service = "lambda.amazonaws.com" }, Action = "sts:AssumeRole" } ] }) } resource "aws_iam_policy_attachment" "lambda_execution_attach" { name = "lambda-execution-policy-attach" roles = [aws_iam_role.lambda_execution.name] policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole" } resource "aws_iam_policy" "bedrock_policy" { name = "BedrockAccessPolicy" policy = jsonencode({ Version = "2012-10-17", Statement = [ { Effect = "Allow", Action = [ "bedrock:InvokeModel", ], Resource = "*" } ] }) } resource "aws_iam_policy_attachment" "bedrock_policy_attach" { name = "bedrock-policy-attach" roles = [aws_iam_role.lambda_execution.name] policy_arn = aws_iam_policy.bedrock_policy.arn } resource "aws_lambda_layer_version" "boto3_layer" { filename = "boto3_layer.zip" # ZIPファイルのパス layer_name = "boto3-layer" compatible_runtimes = [var.lambda_runtime] description = "Custom boto3 layer for Lambda" } resource "aws_lambda_function" "bedrock_lambda" { filename = "lambda_function/lambda_function.zip" function_name = var.lambda_function_name role = aws_iam_role.lambda_execution.arn handler = "lambda_function.lambda_handler" runtime = var.lambda_runtime source_code_hash = filebase64sha256("lambda_function/lambda_function.zip") layers = [ aws_lambda_layer_version.boto3_layer.arn ] timeout = 30 # タイムアウトを 30 秒に設定 memory_size = 512 # 必要に応じてメモリを増加 environment { variables = { MODEL_ID = var.model_id } } }
2.Lambdaレイヤー用ファイル作成
2-1.PowerShellから下記を実行
terraformのコードを同じフォルダで実施
> mkdir python > cd python > pip install -t .\python boto3 > Compress-Archive -Path python\* -DestinationPath boto3_layer.zip
3.Lambda関数用ファイル作成
3-1.下記ファイルを作成
lambda_function.py
import boto3 import json # Bedrockクライアントの初期化 bedrock_runtime = boto3.client('bedrock-runtime') def lambda_handler(event, context): # プロンプトに設定する内容を取得 prompt = event.get('prompt', "Please explain about KDDI in detail.") # Titanモデルの設定 modelId = 'amazon.titan-text-express-v1' accept = 'application/json' contentType = 'application/json' # リクエストBODYの指定 body = json.dumps({ "inputText": prompt, "textGenerationConfig": { "temperature": 0.7, "topP": 0.9 } }) try: # Bedrock APIの呼び出し response = bedrock_runtime.invoke_model( modelId=modelId, accept=accept, contentType=contentType, body=body ) # APIレスポンスからBODYを取り出す response_body = json.loads(response.get('body').read()) print(f"Full response body: {response_body}") # 応答テキストを取り出す output_text = response_body.get('results', [{}])[0].get('outputText', "No response generated by the model.") print(output_text) return { "statusCode": 200, "body": output_text } except Exception as e: print(f"Error: {e}") return { "statusCode": 500, "body": f"Error: {str(e)}" }
3-2.作成したlambda_function.pyをzip化
フォルダ階層は下記のようになっていること
bedrock_terraform
- version.tf
- provider.tf
- main.tf
- python
- boto3_layer.zip
- lambda_function.py
- lambda_function.zip
4.環境作成
4-1.下記を実行
> terraform fmt > terraform init > terraform plan > terraform apply
5.動作確認
5-1.AWS - Lambda
5-2.作成した関数を開き、「テスト」を実行し、Bedrockから返答がかえってくることを確認
