AWS CDK:上传的文件必须是非空 zip

我已经编写了一个简单的 hello world lambda 函数来部署,但是在命令 cdk deploy 之后它给出了这个错误。有人可以指导一下吗?

enter image description here

stack overflow AWS CDK: Uploaded file must be a non-empty zip
原文答案

答案:

作者头像

此问题可能是由 https://github.com/aws/aws-cdk/issues/12536 引起的。你应该试试:

1.升级node.js版本
2.删除 cdk.out
3.升级到最新的CDK版本

  1. 直接从 S3 中删除资产(桶将类似于 cdk-hnb659fds-assets-<ACCOUNT NUMBER>-<REGION>
    5.再次部署

CDK 不会重新上传资产,除非它发生了变化。这就是为什么需要在升级 node.js 后删除它并强制进行更改的原因。

如果一切都失败了,试试我写的 the script 下载资产,通过重新压缩修复它,然后再次上传。当它寻找 cdk.out 时,它期望在您的项目的根目录中运行。

#!/bin/bash
set -ex

ASSEMBLY_DIRECTORY=`jq -r '.artifacts[] | select(.type == "cdk:cloud-assembly") | .properties.directoryName' cdk.out/manifest.json`
ASSET_MANIFESTS=`jq -r '.artifacts[] | select(.type == "cdk:asset-manifest") | .properties.file' cdk.out/$ASSEMBLY_DIRECTORY/manifest.json`
cd cdk.out/$ASSEMBLY_DIRECTORY
ASSETS=`jq -r '.files[].destinations[] | "s3://" + .bucketName + "/" + .objectKey' $ASSET_MANIFESTS | grep zip`

TMP=`mktemp -d`
cd $TMP

for ASSET in $ASSETS
do
    if aws s3 ls $ASSET; then
        aws s3 cp $ASSET pkg.zip
        mkdir s
        cd s
        if ! unzip ../pkg.zip; then echo bad zip; fi
        rm ../pkg.zip
        zip -r ../pkg.zip * .gitempty
        aws s3 cp ../pkg.zip $ASSET
        cd ..
        rm -rf s
    fi
done

rm -rf $TMP

您可以通过下载资产 zip 文件来确认您遇到了与我相同的问题。尝试使用 unzip 提取它。如果它抱怨校验和或 CRC,你有同样的问题。

作者头像

步骤有助于解决它...

  • 删除 cdk.out (目录)

  • 运行命令

    • cdk 合成器
    • cdk 引导程序
    • cdk 部署
作者头像

对我来说,它发生在 WSL2 中。

原来它是在我不小心在 Windows 控制台中输入 npm i 时引入的。

当时的解决方案是:

在 WSL2 中:

  • rm -r node_modules
  • rm -r cdk.out
  • npm i
  • cdk synth

然后 cdk deyploy 按预期工作。无需引导。