我正在尝试使用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文件的内容如下:
{
"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",但问题依然存在。
编辑:我找到了--调试选项,可以传递给命令。问题是当我们提供来自JSON的输入时,这个工具没有正确地读取ZipFile。因此,例如,如果我运行提供命令本身中所有参数的命令,我可以看到正确编码的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时,命令base64编码JSON中ZipFile键的值(这是该文件的URI,即fileb://C:/Projects/src/zip/MyFunction.zip)
现在我不确定我们需要为ZipFile键提供什么值,或者它是工具/命令中的一个bug吗?
EDIT2: --如果我提供了压缩文件的base64编码字符串,则命令将再次对该字符串进行编码,这将导致相同的错误(即无法解压缩)。因此,我的问题是,字段ZipFile需要什么?文件:// protocol或fileb://?压缩文件的内容基-64编码?
发布于 2016-03-21 19:32:29
不知道你是否已经解决了这个问题。一个可能的解决方案是从以前的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)中做类似的事情。
希望能帮上忙!
发布于 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行选项传递,就像您最后所做的那样。
https://stackoverflow.com/questions/35235118
复制相似问题