📝

CLI から Go アプリケーションを Lambda にデプロイしてみた

に公開

Go による Lambda 関数の構築 - AWS Lambda
CLI からの操作でやってみました。

前提

  • コマンド実行環境は Cloud9
  • Cloud9 環境のインスタンスタイプは t3.small
  • Cloud9 環境のプラットフォームは Amazon Linux 2023
  • バージョン情報は以下の通り
$ aws --version
aws-cli/2.28.17 Python/3.13.7 Linux/6.1.147-172.266.amzn2023.x86_64 exe/x86_64.amzn.2023

$ go version
go version go1.24.5 linux/amd64
  • Lambda 実行ロールは作成済み
    • AdministratorAccess 権限を付与

1. プロジェクトの作成

まずはアプリケーションのプロジェクトを作成します。

$ mkdir lambda-go-example
$ cd lambda-go-example
$ go mod init lambda-go-example

# Lambda Go ライブラリの追加
$ go get github.com/aws/aws-lambda-go/lambda

2. Lambda 関数コードの作成

Go のバージョン情報を出力するコードです。

$ cat > main.go << 'EOF'
package main

import (
	"context"
	"fmt"
	"log"
	"runtime"

	"github.com/aws/aws-lambda-go/lambda"
)

// Request は入力データの構造体
type Request struct {
	Name string `json:"name"`
}

// Response は出力データの構造体
type Response struct {
	Message   string `json:"message"`
	GoVersion string `json:"go_version"`
}

// HandleRequest はLambda関数のメインハンドラー
func HandleRequest(ctx context.Context, request Request) (Response, error) {
	// Goのバージョン情報をログ出力
	goVersion := runtime.Version()
	log.Printf("Go Version: %s", goVersion)
	log.Printf("Go OS: %s", runtime.GOOS)
	log.Printf("Go Arch: %s", runtime.GOARCH)
	
	name := request.Name
	if name == "" {
		name = "World"
	}
	
	message := fmt.Sprintf("Hello, %s! This is a Go Lambda function.", name)
	log.Printf("Generated message: %s", message)
	
	return Response{
		Message:   message,
		GoVersion: goVersion,
	}, nil
}

func main() {
	lambda.Start(HandleRequest)
}
EOF

main.go のインデントが崩れている場合には Cloud9 IDE 上でコードを張り付けなおしてください。

3. カスタムランタイム用にビルド

Using AL2023 in AWS Lambda - Amazon Linux 2023
provided.al2023 ランタイム用に Go コードをビルドします。

$ GOOS=linux GOARCH=amd64 go build -o bootstrap main.go

4. デプロイ

zip ファイル化して Lambda 関数にデプロイします。

$ zip lambda-function.zip bootstrap

$ aws lambda create-function \
--function-name go-lambda-example \
--runtime provided.al2023 \
--role your-role-name \
--handler bootstrap \
--zip-file fileb://lambda-function.zip \
--description "Go Lambda function example using provided.al2023 runtime"

5. 動作確認

$ cat > test-payload.json << 'EOF'
{
  "name": "AWS Lambda"
}
EOF

$ aws lambda invoke \
--function-name go-lambda-example \
--payload file://test-payload.json \
--cli-binary-format raw-in-base64-out \
response.json

$ cat response.json
{"message":"Hello, AWS Lambda! This is a Go Lambda function.","go_version":"go1.24.5"}

Lambda コンソールにも go-lambda-example という関数が作成されていることを確認できました。

CloudWatch Logs には以下のようなログが出力されていました。

2025/08/29 05:23:46 Go Version: go1.24.5
2025/08/29 05:23:46 Go OS: linux
2025/08/29 05:23:46 Go Arch: amd64
2025/08/29 05:23:46 Generated message: Hello, AWS Lambda! This is a Go Lambda function.

まとめ

今回は CLI から Go アプリケーションを Lambda にデプロイしてみました。
どなたかの参考になれば幸いです。

参考資料

Discussion