我正在尝试使用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编码?
答案 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行选项传递,结束了。