【问题标题】:AWS CLI create Lambda function cannot unzip uploaded fileAWS CLI 创建 Lambda 函数无法解压缩上传的文件
【发布时间】:2016-05-16 01:51:50
【问题描述】:

我正在尝试使用 AWS CLI 创建一个 AWS Lambda 函数。因此,我通过传入--generate-cli-skeleton 参数并相应地替换值来生成用于aws lambda create-function 函数的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文件的内容是:

{
    "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" 但问题仍然存在。

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

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:// 协议或 fileb:// 的 URL? Zip 文件内容 base-64 编码?

【问题讨论】:

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


    【解决方案1】:

    不知道你是否已经解决了这个问题。一种可能的解决方案是以前从 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)

    希望对你有帮助!!

    【讨论】:

    • 我明白了。不,还没有解决这个问题。我只是完全跳过它,并将路径作为 cmdline 参数传递。
    【解决方案2】:

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

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

    在 python 中,您可以通过读取 zip 文件的内容来执行此操作,但我不确定您将如何以合适的格式执行此操作以进入 json 文件 - 我不确定您是否可以。

    我想知道 cli 文档是否准确,而此命令的 --generate-cli-skeleton 的输出不准确,并且 lambda 部署包必须存储在 s3 中才能在传递给 --cli-input-json 的文件中引用,或作为命令行选项传递,就像你最终做的那样。

    【讨论】:

      猜你喜欢
      • 2018-11-27
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多