あめがえるのITブログ

頑張りすぎない。ほどほどに頑張るブログ。

【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から返答がかえってくることを確認