Sameer
Sameer

Reputation: 143

AWS CDK: Uploaded file must be a non-empty zip

I have written a simple hello world lambda function to deploy but after the command cdk deploy it is giving this error. Can someone please guide about this?

enter image description here

Upvotes: 6

Views: 10000

Answers (3)

bln_dev
bln_dev

Reputation: 2411

For me it occurred in WSL2.

It turned out it was introduced when I accidentaly npm ied in windows console.

Solution was then:

in WSL2:

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

Then cdk deploy worked as expected. No bootstrapping necessary.

Upvotes: 0

dave vedant
dave vedant

Reputation: 717

Steps helps to resolve it...

  • delete cdk.out (directory)

  • run command

    • cdk synth
    • cdk bootstrap
    • cdk deploy

Upvotes: 5

kichik
kichik

Reputation: 34704

This issue might be caused by https://github.com/aws/aws-cdk/issues/12536. You should try:

  1. Upgrading node.js version
  2. Deleting cdk.out
  3. Upgrade to latest CDK version
  4. Delete the asset directly from S3 (bucket will be something like cdk-hnb659fds-assets-<ACCOUNT NUMBER>-<REGION>)
  5. Deploy again

CDK doesn't reupload the asset unless it changed. That's why deleting it and maybe forcing a change after upgrading node.js is required.

If all else fails, try the script I wrote that downloads the asset, fixes it by rezipping, and uploads it again. It's expecting to run in the root of your project as it looks for 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

You can confirm you're having the same issue I was having by downloading the asset zip file. Try extracting it with unzip. If it complains about the checksum or CRC, you had the same issue.

Upvotes: 4

Related Questions