古いaws/aws-lambda-goでAWS Lambdaのcontainer image runtimeを使うと刺さる
具体的に言うと、aws/aws-lambda-go@v1.18.0よりも前のバージョンでAWS Lambdaのcontainer image runtimeを使うとハンドラが呼び出されず、タイムアウトするまで刺さります。
例えば以下のような非常に簡単なLambda Functionをデプロイした時、
package main import ( "context" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.DynamoDBEvent) error { fmt.Println("CALLED") return nil } func main() { lambda.Start(handler) }
古いaws/aws-lambda-goを利用していると、以下のログのように CALLED
は表示されずタイムアウトまで実行を引っぱります。つまり handler()
が呼ばれることなくタイムアウトをしているという挙動であることがわかります。
START RequestId: ...snip... Version: $LATEST END RequestId: ...snip... REPORT RequestId: ...snip... Duration: 3003.52 ms Billed Duration: 3000 ms Memory Size: 128 MB Max Memory Used: 10 MB 2021-12-20T02:49:56.683Z ...snip... Task timed out after 3.00 seconds
このライブラリのバージョンをv1.18.0以降のバージョンにする *1 と、しっかりとハンドラが呼ばれて意図通りの動きをします。
START RequestId: ...snip... Version: $LATEST CALLED END RequestId: ...snip... REPORT RequestId: ...snip... Duration: 9.12 ms Billed Duration: 924 ms Memory Size: 128 MB Max Memory Used: 26 MB Init Duration: 914.31 ms
go1.x
で既に動いているLambda FunctionをそのままContainerに移植してみたところ、この問題で絶妙にハマってしまいました。Lambdaの実行ログには特にそれらしいエラーメッセージも出てこないし、そもそもハンドラ関数が呼ばれないのが謎すぎた……。
それはそうとしてv1.18.0のリリースノートにはそれらしい変更について言及が無いんですが、どれが該当する変更なんでしょう。これなのでしょうか? https://github.com/aws/aws-lambda-go/pull/298。
[追記]
上記の件はやはりこのPull Requestが関連するとのこと https://github.com/aws/aws-lambda-go/pull/298。
container runtimeはcustom runtimeと同じ挙動(自分でRuntime APIにアクセスする)なのでバージョンアップが必要ですね / “古いaws/aws-lambda-goでAWS Lambdaのcontainer image runtimeを使うと刺さる - その手の平は尻もつかめるさ” https://t.co/HkVVTi8wR2
— fujiwara (@fujiwara) 2021年12月20日
[追記ここまで]
さておきライブラリのバージョンは上げないと駄目ですね。ヤル気があるので最新まで上げました。以上です。
*1:つまりv1.18.0は大丈夫