もうすぐGo1.xランタイムがサポート終了するため、provided.al2に変更しました。
更新はできたものの釈然としない部分があったのでもう少し調べてみました。
注意点まとめ
- ファイルは
bootstrap
という名前で「直下に」置く必要がある - Handlerの値は使用されないので何でもいい
Handlerもbootstrapじゃなきゃいけないとか、従来通り設定できると勘違いしがちだと思います。
Template更新例
Templateをどう直せば良いのか先に記載します。
なお、以降の記述も含めて.zip
デプロイ前提で記載します。
また、provided.al2023
がリリースされたので基本的にそちらで記載しますが、provided.al2
でも同じです。
Serverless Framework
aws-go
テンプレートを元に記載します。
Makefile
|
|
serverless.yml
|
|
AWS SAM
Hello World Example
を元に記載します。
template.yaml
|
|
※本記事作成時点では、Runtime: provided.al2023
とすると以下のエラーになりました。
RequestId: xxx Error: Couldn't find valid bootstrap(s): [/var/task/bootstrap /opt/bootstrap] Runtime.InvalidEntrypoint
これ以降は検証した結果を記載します。
Go1.xランタイムの終了について
そもそも発端となった件について軽くまとめておきます。
Go1.xランタイムは2023年12月31日にサポートが終了します。
https://aws.amazon.com/jp/blogs/compute/migrating-aws-lambda-functions-from-the-go1-x-runtime-to-the-custom-runtime-on-amazon-linux-2/?nc1=h_ls
厳密に言うと上記は「非推奨化フェーズ1」の日程です。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html
フェーズ1の制約
- 新規で作成はできないが、更新は引き続き可能
- セキュリティアップデートが受けられない
フェーズ2は上記に加えて更新も不可。
サポート終了しても関数が実行できなくなるわけではありません(勘違いしている人はあまりいないとは思いますが)。
Go1.x ランタイムが終了するにあたり、後継は出さないようでカスタムランタイムに移行する必要があります。
ファイル名とHandlerについて
Go1.xは実行ファイルとハンドラーが対応していて、両方任意でした。
カスタムランタイムでは実行ファイルはbootstrap固定で、Handlerは任意となっています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-handler.html#golang-handler-naming
ファイル名とHandlerの罠
設定を変えながら検証してみます。
フレームワークに左右されないようにあえてCLIで作成する事にします。
まずGo1.xのデプロイをCLIで書くと以下になります。
|
|
前述の案内Blogに沿ってカスタムランタイムに変更すると以下になります。
|
|
これで成功はするのですが、
ファイル名がbootstrap、Handlerが任意ということなので、以前となるべく変えずに修正しようとすると以下のようにしたくなります。
|
|
これは実行すると以下のエラーになってしまいます。
|
|
ファイル名がbootstrapと書かれているので、ファイル名さえbootstrapであればいいと普通は考えると思うのですが、直下に配置しないといけません。
そしてHandler名は任意となっていますが、任意だとしてどこに合わせればいいんでしょうか?
これはHandler名は何にしても意味がないので、以下のようにしても問題ありません。
|
|
ちなみに、書く意味がないならとハンドラーの指定を削ってみるとエラーになります。
An error occurred (InvalidParameterValueException) when calling the CreateFunction operation: Runtime and Handler are mandatory parameters for functions created with deployment packages.
まとめると、先にも書いた通り以下です。
- ファイルは
bootstrap
という名前で「直下に」置く必要がある - Handlerの値は使用されないので何でもいい
うーん、分かりづらい。。
現にServerless Frameworkの、Issueでもbootstrapについて私と同様の同様の勘違いをしている人がいましたし
後述のドキュメントのせいかもしれませんが、Handlerもbootstrapにしなければならないと書かれた記事をちらほら見かけます。
検証したりサポートに問合せしたりしてようやく理解できました。
なお、以下のドキュメントには「ハンドラー名は何でもかまいません。」と書かれています。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/golang-package.html#golang-package-mac-linux
※私の記憶ではこちらのドキュメントには以前はハンドラーもbootstrapにしなければならないと書かれてたと思うのですが、矛盾してるやんとフィードバックしたので、更新されたのかもしれません。
参考にした記事
移行にあたり以下の記事がとても参考になりました。
https://blog.matthiasbruns.com/running-multiple-golang-aws-lambda-functions-on-arm64-with-serverlesscom
まぁこの方も"the handler name must be bootstrap"って書いてます。仕方ないね