AWSからの変更
Lambdaは、2023年12月31日に予定されているAmazon Linux 1のサポート終了に伴い、go1.x
ランタイムを廃止します。
現在、LambdaでGoを使用するお客様は、
go1.x
ランタイムを使用するか、provided.al2
ランタイムを使用することができます。今後、go1.x
ランタイムは、現在2023年12月31日に予定されているAmazon Linux 1のサポート終了に合わせて非推奨となる予定です。
それで生のGoファイルのサポート無きなります。それで生のGoファイルを利用してるLambdaが使えなくになりますので移行する必要があります。
移行する方法
Goのruntimeが全部なくなりますのでruntimeを変更しなきゃいけないです、provided.al2
がおすすめされてます。
Goをコンパイルする
Goファイルを使えないくになりますですが、GoをコンパイルするとBinaryファイルになります、それはLinuxのシステムを実行出来ます!
コンパイル済みのGoアプリケーションをLambda上で実行するには、コードをLinux用にコンパイルする必要があります。go1.x
ランタイムでは任意の実行ファイル名を使用できますが、provided.al2
ランタイムではbootstrap
を実行ファイル名として使用する必要があります。macOSとLinuxでは、ビルド・コマンドの最も単純な形式を以下に示します:
$ GOARCH=amd64 GOOS=linux go build -o bootstrap main.go
このビルドコマンドは、Lambda用のx86_64
命令セットと互換性のあるbootstrap
と呼ばれるGoバイナリファイルを作成します。AWS Gravitonプロセッサ用にコンパイルするには、前のコマンドでGOARCH=arm64
を設定します。
それでZipして、アップロード出来ます!
$ zip myFunction.zip bootstrap
$ aws lambda update-function-code --function-name XXX --zip-file fileb://./bootstrap.zip
handlerの名前はbootstrap
で必須、ファイルの名前もbootstrap
が必須
Windowsでコンパイルするユーザーのために、GoはLinux仮想マシンやビルド・コンテナを使用せずにLinux用のコンパイルをサポートしている。ただし、LambdaはPOSIXファイルパーミッションを使用するので、正しく設定する必要があります。Lambdaには、Lambdaで有効なデプロイメント・パッケージをビルドするヘルパー・ツールが用意されています。このツールの既存ユーザーは、最新バージョンにアップデートして、ビルドスクリプトが最新であることを確認してください。
Dockerイメージを使う
以下のDockerfileでは、最終イメージに不要なレイヤーやファイルが入らないように、2段階のビルドを使用しています。プロセスの最初のステージはアプリケーションをビルドします。このステージではGoをインストールし、コードの依存関係をダウンロードし、バイナリをコンパイルします。第二段階では、ビルドプロセスの依存関係なしに、実行可能ファイルを新しいコンテナにコピーします。
FROM public.ecr.aws/lambda/provided:al2 as build
# install compiler
RUN yum install -y golang
RUN go env -w GOPROXY=direct
# cache dependencies
ADD go.mod go.sum ./
RUN go mod download
# build
ADD . .
RUN go build -tags lambda.norpc -o /main
# copy artifacts to a clean image
FROM public.ecr.aws/lambda/provided:al2
COPY --from=build /main /main
ENTRYPOINT [ "/main" ]
dockerをbuildして
$ docker build -t hello-world .
Amazon ECR registryにログインして、登録する
$ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
Amazon ECR registryにタグとプッシュして
$ docker tag hello-world:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
$ docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
まとめ
両方が使えます、自分ならgoのコンパイルは使いやすい(そのまま)ですがDockerを管理する方が管理しやすいだと思います。