AWS LambdaがGoのサポートを開始したのでAWSSAMを利用してのデプロイを試してみました
実行環境
$ go version
go version go1.9.2 darwin/amd64
$ aws --version
aws-cli/1.11.149 Python/3.4.2 Darwin/17.3.0 botocore/1.7.7
ソースコード
Lambda Function Handler (Go)のコードをそのまま利用します。
main.go
package main
import (
"context"
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
func HandleRequest(ctx context.Context, name string) (string, error) {
return fmt.Sprintf("Hello %s!", name), nil
}
func main() {
lambda.Start(HandleRequest)
}
テンプレート
template.yml
AWSTemplateFormatVersion: "2010-09-09"
Transform: 'AWS::Serverless-2016-10-31'
Resources:
App:
Type: 'AWS::Serverless::Function'
Properties:
Handler: lambda-go-sample # ファイル名
Runtime: go1.x
CodeUri: build # ビルドファイル設置ディレクトリ
Timeout: 1
デプロイ
GOARCH=amd64 GOOS=linux go build -o build/lambda-go-sample
aws cloudformation package \
--template-file template.yml \
--s3-bucket [パッケージアップロード先s3バケット] \
--s3-prefix lambda-go-sample \
--output-template-file .template.yml
aws cloudformation deploy \
--template-file .template.yml \
--stack-name lambda-go-sample \
--capabilities CAPABILITY_IAM
実行結果
$ aws cloudformation describe-stack-resources --stack-name lambda-go-sample
{
"StackResources": [
{
"Timestamp": "2018-01-16T02:42:50.589Z",
"StackName": "lambda-go-sample",
"LogicalResourceId": "App",
"ResourceType": "AWS::Lambda::Function",
"ResourceStatus": "CREATE_COMPLETE",
"PhysicalResourceId": "lambda-go-sample-App-1U7U6E46GZAW3",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xxx:stack/lambda-go-sample/de118db0-fa66-11e7-b9ae-50fa13f400ad"
},
{
"Timestamp": "2018-01-16T02:42:45.996Z",
"StackName": "lambda-go-sample",
"LogicalResourceId": "AppRole",
"ResourceType": "AWS::IAM::Role",
"ResourceStatus": "CREATE_COMPLETE",
"PhysicalResourceId": "lambda-go-sample-AppRole-WVOATNOP8JWV",
"StackId": "arn:aws:cloudformation:ap-northeast-1:xxx:stack/lambda-go-sample/de118db0-fa66-11e7-b9ae-50fa13f400ad"
}
]
}
$ aws lambda invoke --function-name lambda-go-sample-App-1U7U6E46GZAW3 --payload '"Lambda"' out.txt
{
"StatusCode": 200
}
$ cat out.txt
"Hello Lambda!"
あとがき
pythonやnodeと違って事前にビルドしたものをデプロイする必要がありますが、CD環境さえ整えてしまえば些細な問題ですね。
次はGitHub + CodePipeline + CodeBuild + CloudFormationによるGolangなAWS LambdaのCD環境の構築方法についてまとめたいと思います。