🎉

Terraform Lambda for Go Language

2024/03/16に公開

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"
}

手順

  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"
}
  1. 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
  1. AWSにリソースを反映させる
terraform plan

terraform apply

以上で実際にAWSにリソースを反映できます!

GitHubで編集を提案

Discussion