

CDKで"Uploaded file must be a non-empty zip"、原因はNode v15.6のバグだった
この記事は、構成と文章の整理に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 --versionv15.8.0対処
CDKチームの案内では、暫定対応として3つ挙げられてた。
- Node.jsをv15.6未満にダウングレードする
cdk.out/内のキャッシュされたアセットを削除する- ステージング用S3バケットにアップロード済みの古いアセットを削除する
自分はn(nodeバージョン切り替えツール)でv14.14.0に落として解決した。
$ sudo n 14.14.0$ node --versionv14.14.0メモ
- 現象としては「zipが空/壊れてる」というエラーだけど、実際はNode側のバグでzip生成自体がおかしくなっているのが原因だった
- CDK自体のバグではないので、CDKのバージョンを上げ下げしても直らない(自分もそこで少しハマった)
- Node v15.6が原因と特定されてるので、当面はv15.6を避けるのが確実