🎉
Terraform Lambda for Go Language
TerraformでGo言語のLambdaを作成して、標準出力する!
経緯
2023/12/31にLambda関数でGo言語のランタイムのサポートが終了したためです
Go 1.xランタイムを使用していた関数は、provided.al2023
またはprovided.al2
にランタイムを変更する必要がありました
作業
Terraformで、Go言語を使用したLambda関数を作成しました!
ファイル構成
sample
├── functions # Lambda関数をまとめたディレクトリ
│ └── hello-world # TerraformのLambdaモジュール
│ ├── sample
│ │ ├── go.mod
│ │ ├── go.sum
│ │ └── main.go
│ └── main.tf
├── main.tf
└── provider.tf
main.tfでLambda関数のモジュールを呼ぶ形式にしています
main.tf
module "hello_world" {
source = "./functions/hello-world"
}
provider.tf
terraform {
backend "s3" {
bucket = "bucket"
key = "terraform.tfstate"
region = "ap-northeast-1"
}
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
手順
- TerraformでLambda(
provided.al2023ランタイム
)リソースを作成
./functions/hello-world/main.tf
##################################
# Lambdaに付与するロール #
##################################
data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["lambda.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}
resource "aws_iam_role" "iam_for_lambda" {
name = "iam_for_lambda"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}
##################################
# Lambda #
##################################
resource "terraform_data" "default" {
triggers_replace = {
always_run = timestamp()
}
provisioner "local-exec" {
command = "cd ${path.module}/sample/ && GOOS=linux GOARCH=amd64 go build -o ./build/bootstrap main.go"
}
}
data "archive_file" "lambda" {
type = "zip"
source_file = "${path.module}/sample/build/bootstrap"
output_path = "${path.module}/sample/go.zip"
depends_on = [ terraform_data.default ]
}
resource "aws_lambda_function" "hellow_world" {
filename = "${path.module}/sample/go.zip"
function_name = "hello-world"
role = aws_iam_role.iam_for_lambda.arn
handler = "sample"
source_code_hash = data.archive_file.lambda.output_base64sha256
runtime = "provided.al2023"
}
- GoのLambda関数の準備
functions/hello-world/sample/main.go
package main
import (
"context"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type MyEvent struct {
Name string `json:"name"`
}
func HandleRequest(ctx context.Context, name MyEvent) (string, error) {
return fmt.Sprintf("Hello %s!", name.Name), nil
}
func main() {
lambda.Start(HandleRequest)
}
sampleディレクトリでLambdaのパッケージをインストール
go mod init lambda/hello-world
go mod tidy
- AWSにリソースを反映させる
terraform plan
terraform apply
以上で実際にAWSにリソースを反映できます!
Discussion