起きたこと
GitHub Actionsで毎朝自動デプロイを行っているServerless FrameworkのAPIサービス(API Gateway + Lambda)がある朝急にエラーを吐くようになった。
TypeError: _convert_to_request_dict() missing 1 required positional argument: 'endpoint_url'
試したこと、調査したこと
どこでエラーになっているか
PynamoDBというライブラリを使っていて、それが吐いているエラーだということは確認できた。
ただ、掘っていくのが大変で真因を突き止めるのに難航。
ライブラリのバージョンは固定していたのでライブラリが更新されているわけではないと判断。
エラーが起きてなかった時点の昨日のソースに戻して再デプロイして解消するか試す
もしソースの変更が原因なら解消するはずなのだが解消しなかった。
不可解なことに時間差でほぼ同様のソースがデプロイされているはずの別環境ではエラーが起きていなかった。
そこの環境に対して昨日時点のソース再デプロイすると同様にエラー状態になるため、今度はデプロイを行っているGitHub ActionsのOSインスタンスバージョンを固定してみたが効果なし。
実際にデプロイパッケージにインストールされているライブラリの差分を調査
Lambda レイヤーを使っていたのでそこに入っているソースコードを落としてきてファイル差分を調査。
すると、botocoreに差分があることが分かった。
公式を調べるとbotocoreとboto3が丁度今日アップデートされていることが分かった。
結局何が原因だったか
ここまで調べてbotocoreのバージョンが上がったことによりPynamoDBの依存関係でエラーが起きたのではないかと推察して、公式のイシューを見に行ったらドンピシャ。
既に有志によって対応リリースされていたので、こちらもバージョンを上げて再デプロイするだけでエラーを解消することができた。
今回の学び
Lambdaの処理系にプリインストールされているライブラリはおそらくデプロイをすると最新化されてしまう
このため今回はタイトルにもあるようにソースを変えていないのにデプロイすると依存性エラーが起きるという不可解な現象にハマってしまった。
回避策はあるのか
今回はたまたま公式が光の速さで対応してくれたから大事にならなかったが、勝手にアップデートされること自体を止めれるのか。
結論はちゃんと使うライブラリを独自にバージョン固定してインストールしてあげれば大丈夫。
今回エラーになったPynamoDBのバージョンとエラーになる前のboto3のバージョンを指定してデプロイしたところエラーは発生しなかった。
Lambdaはサーバレスだから処理系の管理に気を配らなくていいやと油断していたら思いもよらない落とし穴でした。