CDKで"Uploaded file must be a non-empty zip"、原因はNode v15.6のバグだった

  • AWS
  • CDK
  • Lambda
  • Node.js

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

CDK(v1系)で Code.fromAsset() を使ってLambdaをデプロイしたら、こんなエラーで落ちた。

Uploaded file must be a non-empty zip (Service: Lambda, Status Code: 400)

見た目的にはzipが壊れてるか空になってる感じ。心当たりがないので調べた。

原因

AWS CDKのGitHub issue(aws/aws-cdk#12536)に同じ現象が報告されてた。原因はCDK側ではなくNode.js本体のバグで、Node v15.6を使っていると Code.fromAsset() が作るzipアセットが壊れる。根本原因はNode.js側のissue(nodejs/node#37027)でトラッキングされてるらしい。

手元の環境も確認したらまさに該当バージョンだった。

$ node --version
v15.8.0

対処

CDKチームの案内では、暫定対応として3つ挙げられてた。

  1. Node.jsをv15.6未満にダウングレードする
  2. cdk.out/ 内のキャッシュされたアセットを削除する
  3. ステージング用S3バケットにアップロード済みの古いアセットを削除する

自分はn(nodeバージョン切り替えツール)でv14.14.0に落として解決した。

$ sudo n 14.14.0
$ node --version
v14.14.0

メモ

  • 現象としては「zipが空/壊れてる」というエラーだけど、実際はNode側のバグでzip生成自体がおかしくなっているのが原因だった
  • CDK自体のバグではないので、CDKのバージョンを上げ下げしても直らない(自分もそこで少しハマった)
  • Node v15.6が原因と特定されてるので、当面はv15.6を避けるのが確実