首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS CLI创建Lambda函数无法解压缩上传的文件

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

Stack Overflow用户
提问于 2016-02-05 23:11:29
回答 2查看 6.9K关注 0票数 3

我正在尝试使用AWS创建一个AWS函数。因此,我通过传入aws lambda create-function参数,然后相应地替换值,生成了用于--generate-cli-skeleton函数的JSON输入框架。

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

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文件的内容如下:

代码语言:javascript
复制
{
    "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文件并在命令行中提供所有参数的情况下创建函数,那么它就能工作。因此,例如,这样做完全没有任何问题:

代码语言:javascript
复制
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",但问题依然存在。

编辑:我找到了--调试选项,可以传递给命令。问题是当我们提供来自JSON的输入时,这个工具没有正确地读取ZipFile。因此,例如,如果我运行提供命令本身中所有参数的命令,我可以看到正确编码的zip文件,即:

代码语言:javascript
复制
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时,命令base64编码JSON中ZipFile键的值(这是该文件的URI,即fileb://C:/Projects/src/zip/MyFunction.zip)

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

EDIT2: --如果我提供了压缩文件的base64编码字符串,则命令将再次对该字符串进行编码,这将导致相同的错误(即无法解压缩)。因此,我的问题是,字段ZipFile需要什么?文件:// protocol或fileb://?压缩文件的内容基-64编码?

EN

回答 2

Stack Overflow用户

发布于 2016-03-21 19:32:29

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

代码语言:javascript
复制
...
    {
        "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)中做类似的事情。

希望能帮上忙!

票数 2
EN

Stack Overflow用户

发布于 2016-10-01 04:37:11

lambda创建函数的aws cli文档实际上并没有将ZipFile作为--code选项的一部分列出。

Python AWS SDK文档 do list ZipFile -它应该是字节,并且是“包含部署包的zip文件的内容”。

在python中,您可以通过读取zip文件的内容来做到这一点,但我不确定如何以合适的格式将其转换为json文件--我不确定您能不能这样做。

我想知道是否cli文档是准确的,该命令的--generate-cli-skeleton输出是否准确,并且必须将lambda部署包存储在s3中,以便在传递给--cli-input-json的文件中引用,或者作为cmd行选项传递,就像您最后所做的那样。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35235118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档