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

3
我正在尝试使用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",但问题仍然存在。
编辑: 我发现--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时,命令会将JSON中ZipFile键的值(即该文件的URI,即fileb://C:/Projects/src/zip/MyFunction.zip)进行base64编码。
现在我不确定需要向ZipFile键提供什么值,或者这是否是工具/命令中的错误?
编辑2:如果我提供我的zip文件的base64编码字符串,命令将再次对该字符串进行base64编码,这将导致相同的错误(即无法解压缩)。那么,字段ZipFile需要什么?带有file://协议的URL还是fileb://?Zip文件内容的base-64编码?
3个回答

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()

我猜你可以在Node.js中做类似的事情(https://docs.nodejitsu.com/articles/file-system/how-to-read-files-in-nodejs)。希望能对你有所帮助!

我明白了。还没有解决这个问题。我直接跳过它,将路径作为命令行参数传递。 - Shikasta_Kashti

2
AWS CLI文档中的lambda create-function实际上没有将ZipFile列为--code选项的一部分。 Python AWS SDK文档确实列出了ZipFile - 它应该是字节,并且是“包含部署软件包的zip文件内容”。
在Python中,您可以通过读取zip文件的内容来实现此目的,但我不确定如何以适当的格式将其放入json文件中 - 我不确定是否可以。
我想知道cli文档是否准确,并且此命令的--generate-cli-skeleton输出是否不正确,lambda部署程序包必须存储在s3中以便在传递给--cli-input-json的文件中引用,或者作为命令行选项传递,就像您最终所做的那样。

0

我找到了解决方案。这是因为您可能在Lambda函数的文件名中给出了错误的扩展名,导致出现了这个问题。应该是../../xyz.zip而不是../../xyz.py。

例如 -

data "archive_file" "this" {
  type = "zip"
  source_file = ../../xyz.py
  output_path = ../../xyz.zip
}

resource "aws_lambda_function" "this" {
   filename = ../../xyz.zip
}

如果您能添加Lambda函数代码以更好地理解,那将是非常棒的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接