AWS CLI创建Lambda函数无法解压缩上传的文件

时间:2016-02-05 23:11:30

标签: amazon-web-services aws-lambda aws-cli

我正在尝试使用AWS CLI创建AWS Lambda函数。所以我通过传递aws lambda create-function参数然后相应地替换值来生成JSON输入框架以与--generate-cli-skeleton函数一起使用。

问题是,当我执行命令来创建函数时,它会给我这个错误:

A client error (InvalidParameterValueException) occurred when calling the CreateFunction operation: Could not unzip uploaded file. Please check your file, then try to upload again.

这是我运行命令的方式:

aws lambda create-function --cli-input-json file://C:\Projects\Automated_Deployment\lambda_function_deploy.json

.json 文件的内容是:

{
    "FunctionName": "MyFunction",
    "Runtime": "nodejs",
    "Role": "arn:aws:iam::------------:role/lambda_dynamo",
    "Handler": "index.handler",
    "Code": {
        "ZipFile": "fileb://C:/Projects/src/zip/MyFunction.zip"
    },
    "Description": "description goes here",
    "Timeout": 10,
    "MemorySize": 128,
    "Publish": true
}

令人惊讶的是,如果我尝试在不使用JSON文件的情况下创建函数并在命令行中提供所有参数,那么它可以工作。因此,例如,这完全没有任何问题:

aws lambda create-function --function-name MyFunction --runtime nodejs --role arn:aws:iam::------------:role/lambda_dynamo --handler index.handler --zip-file fileb://C:/Projects/src/zip/MyFunction.zip

这是相同的.zip文件。关于我在这里做错了什么的暗示?我尝试将"ZipFile": "fileb://C:/Projects/src/zip/MyFunction.zip"替换为:

"ZipFile": "file://C:/Projects/src/zip/MyFunction.zip""ZipFile": "C:/Projects/src/zip/MyFunction.zip"但问题仍然存在。

修改 我找到了--debug选项,我们可以将它传递给CLI命令。问题是当我们提供JSON的输入时,该工具没有正确读取ZipFile。因此,例如,如果我运行命令提供命令本身中的所有参数,我可以看到zip文件正确base64编码,即:。

2016-02-08 10:43:59,831 - MainThread - botocore.endpoint - DEBUG - Making request for <botocore.model.OperationModel object at 0x0000000004149F28> (verify_ssl=True) with params: {'body': '{"Code": {"ZipFile": "UEsDBBQAAAAIAFiGPUiLOeW/nwcAANsdAAAIAAAAaW5kZXguanO1Gdtu2zb0PUD+gdVDI2OOmrZrBzgICi9OC29FYsRpX4pCUCQ65iJLqk 
.... 
redacted

但是当我从JSON文件提供参数时,即--cli-input-json,然后命令base64对JSON中的ZipFile键的值进行编码(这是该文件的URI,即fileb:// C: /Projects/src/zip/MyFunction.zip)

现在我不确定我们需要为ZipFile键提供什么值,或者它是工具/命令中的错误?

EDIT2:如果我提供了我的zip文件的base64编码字符串,该命令将再次对该字符串进行base64编码,这将产生相同的错误(即无法解压缩。)所以我的问题是什么ZipFile需要的字段?带有file:// protocol或fileb://的URL? Zip文件的内容base-64编码?

2 个答案:

答案 0 :(得分:2)

不知道你是否已经解决了这个问题。一种可能的解决方案是先从zip文件中获取内容。在Python中你可以这样做:

...
    {
        "FunctionName": "MyFunction",
        "Runtime": "nodejs",
        "Role": "arn:aws:iam::------------:role/lambda_dynamo",
        "Handler": "index.handler",
        "Code": {
            "ZipFile": "fileb://" + file_get_contents(C:/Projects/src/zip/MyFunction.zip)
        },
        "Description": "description goes here",
        "Timeout": 10,
        "MemorySize": 128,
        "Publish": true
    }
...

    def file_get_contents(filename):
        with open(filename) as f:
            return f.read()

我猜你可以在nodejs(https://docs.nodejitsu.com/articles/file-system/how-to-read-files-in-nodejs

中做类似的事情

希望它有所帮助!!

答案 1 :(得分:1)

aws cli docs for lambda create-function实际上不会将ZipFile列为--code选项的一部分。

Python AWS SDK docs 执行列表ZipFile - 它应该是字节,并且是&#39;包含部署包的zip文件的内容&#39;。< / p>

在python中你可以通过阅读zip文件的内容来做到这一点,但是我不知道如何以合适的格式进入json文件 - 我不确定你可以。

我想知道cli文档是否准确,并且此命令的--generate-cli-skeleton输出不是,并且lambda部署包必须存储在s3中才能在传递给{{的文件中引用1}},或者作为cmd行选项传递,结束了。