1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS Lambdaのruntimeがgo1.xになっているLambdaをprovided.al2に変更する

Posted at

AWSからの変更

Lambdaは、2023年12月31日に予定されているAmazon Linux 1のサポート終了に伴い、go1.xランタイムを廃止します。

AWSから記事が出てます:
https://aws.amazon.com/jp/blogs/compute/migrating-aws-lambda-functions-from-the-go1-x-runtime-to-the-custom-runtime-on-amazon-linux-2/

現在、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

設定はこんな感じになります
image.png

handlerの名前はbootstrapで必須、ファイルの名前もbootstrapが必須

Windowsでコンパイルするユーザーのために、GoはLinux仮想マシンやビルド・コンテナを使用せずにLinux用のコンパイルをサポートしている。ただし、LambdaはPOSIXファイルパーミッションを使用するので、正しく設定する必要があります。Lambdaには、Lambdaで有効なデプロイメント・パッケージをビルドするヘルパー・ツールが用意されています。このツールの既存ユーザーは、最新バージョンにアップデートして、ビルドスクリプトが最新であることを確認してください。

Dockerイメージを使う

以下のDockerfileでは、最終イメージに不要なレイヤーやファイルが入らないように、2段階のビルドを使用しています。プロセスの最初のステージはアプリケーションをビルドします。このステージではGoをインストールし、コードの依存関係をダウンロードし、バイナリをコンパイルします。第二段階では、ビルドプロセスの依存関係なしに、実行可能ファイルを新しいコンテナにコピーします。

Dockerfile
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を管理する方が管理しやすいだと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?