GoのコードをLambdaで実行する
この記事では、Go言語で書かれたLambda関数を、AWSのECR(Elastic Container Registry)にプッシュし、そこからLambda関数としてデプロイ・実行する一連の流れを紹介します。AWS CLIのインストール方法からIAMロール作成、ECRリポジトリの用意、そしてLambda関数の作成までを順序立てて解説します。
前提条件
- Goがローカル環境にインストール済みであること
- Dockerがインストール済みであること
- AWSアカウントを持っていること
Lambda用Goコード&ベースイメージの用意
GoでLambda関数をコンテナイメージとしてデプロイする場合、AWSが提供するベースイメージを利用します。詳しくは以下の公式ドキュメントを参照ください。
AWS Lambda用Goイメージ (provided.al2023)
公式のガイドにしたがって、provided.al2023 をベースにしたDockerfileや、Goコードを用意しま
す。
Dockerfile
FROM golang:1.20 as build
WORKDIR /helloworld
# Copy dependencies list
COPY go.mod go.sum ./
# Build with optional lambda.norpc tag
COPY main.go .
RUN go build -tags lambda.norpc -o main main.go
# Copy artifacts to a clean image
FROM public.ecr.aws/lambda/provided:al2023
COPY --from=build /helloworld/main ./main
ENTRYPOINT [ "./main" ]
Goのサンプルコード例
package main
import (
"context"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
)
func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
response := events.APIGatewayProxyResponse{
StatusCode: 200,
Body: "\"Hello from Lambda!\"",
}
return response, nil
}
func main() {
lambda.Start(handler)
}
IAMユーザーの作成
ECRへのプッシュなどを行うため、専用のIAMユーザーを作成します。以下の記事などを参考に、IAMユーザーと適切な権限を設定してください。
IAMユーザーの作成参考
IAMユーザーを作成したら、アクセスキーとシークレットアクセスキーを取得しておきます。
aws configure で認証情報を設定
ローカル環境でAWS CLIからAWSリソースを操作するために、先ほど取得したIAMユーザーのキーをaws configureで登録します。
aws configure
AWS Access Key ID [None]: <取得したアクセスキー>
AWS Secret Access Key [None]: <取得したシークレットアクセスキー>
Default region name [None]: ap-northeast-1
Default output format [None]: json
これでAWS CLIは指定のリージョン・認証情報で操作可能になります。
ECRへのログイン
ECRを利用するには、まずAWS CLIを使ってDockerをECRにログインさせます。以下のようにコマンドを実行します。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com
実行後、Login Succeededと表示されれば成功です。
ECRリポジトリの作成
Lambda用のコンテナイメージを格納するECRリポジトリを作成します。
aws ecr create-repository \
--repository-name test \
--region ap-northeast-1 \
--image-scanning-configuration scanOnPush=true \
--image-tag-mutability MUTABLE
実行後、repositoryUriなどが返ってくれば成功です。
{
"repository": {
"repositoryArn": "arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/test",
"repositoryUri": "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test",
...
}
}
イメージにタグをつけてECRへプッシュ
ローカルでビルドしたGo Lambda用イメージに、ECRのリポジトリURIをタグ付けします。その後、docker pushでプッシュします。
docker tag <ローカルイメージ名>:test XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
正常にプッシュされれば、ECRコンソールからプッシュしたイメージを確認できます。
Lambda関数実行用ロール(IAMロール)の作成
Lambda関数が実行時に必要な権限を持つIAMロールを作成します。以下は最低限のポリシーを持つロール作成例です。
aws iam create-role \
--role-name lambda-ex \
--assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'
レスポンスでRoleオブジェクトが返ってきます。そのArnを後のステップで利用します。
Lambda関数の作成
いよいよECRにあるイメージからLambda関数を作成します。
aws lambda create-function \
--function-name test \
--package-type Image \
--code ImageUri=XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest \
--role arn:aws:iam::XXXXXXXXXXXX:role/lambda-ex
FunctionArnなどが返ってくれば、Lambda関数が作成されています。
Lambda関数の呼び出し
最後に、作成した関数が正常に動くかをテストしましょう。
aws lambda invoke --function-name test response.json
StatusCode: 200などが表示され、response.jsonに{"statusCode":200,"body":"\"Hello from Lambda!\""}
といったレスポンスが格納されていれば成功です。
まとめ
以上が、Go言語で記述したLambda関数をDockerイメージとしてビルドし、ECRにプッシュし、IAMロールの設定を行い、LambdaとしてAWS上で実行するまでの流れです。この手順を踏むことで、ローカルで開発したGoコードをコンテナとして容易にデプロイ可能になります。
Discussion