🐝

GoのコードをLambdaで実行する

に公開

この記事では、Go言語で書かれたLambda関数を、AWSのECR(Elastic Container Registry)にプッシュし、そこからLambda関数としてデプロイ・実行する一連の流れを紹介します。AWS CLIのインストール方法からIAMロール作成、ECRリポジトリの用意、そしてLambda関数の作成までを順序立てて解説します。

前提条件

  • Goがローカル環境にインストール済みであること
  • Dockerがインストール済みであること
  • AWSアカウントを持っていること

Lambda用Goコード&ベースイメージの用意

GoでLambda関数をコンテナイメージとしてデプロイする場合、AWSが提供するベースイメージを利用します。詳しくは以下の公式ドキュメントを参照ください。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/go-image.html

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