Amazon web services 无法在使用python创建Lambda函数时解压缩上载的文件
我正在尝试使用python创建aws lambda函数 Lambda函数中的错误 下面提到的函数出现错误“无法解压缩上载的文件”Amazon web services 无法在使用python创建Lambda函数时解压缩上载的文件,amazon-web-services,Amazon Web Services,我正在尝试使用python创建aws lambda函数 Lambda函数中的错误 下面提到的函数出现错误“无法解压缩上载的文件” def upload_lambda_function(zip_file_name): with open(zip_file_name) as zip_blob: #"fileb://"+base64.b64encode(zip_blob.read()), lambda_execution_role_arn = 'arn:aws:iam::' + \
def upload_lambda_function(zip_file_name):
with open(zip_file_name) as zip_blob:
#"fileb://"+base64.b64encode(zip_blob.read()),
lambda_execution_role_arn = 'arn:aws:iam::' + \
aws_account_id + ':role/' + lambda_execution_role
aws_lambda.upload_function(
lambda_function_name,
"file://"+zip_blob.read(),
"nodejs6.10",
lambda_execution_role_arn,
"index.handler",
"event",
description=None,
timeout=60,
memory_size=128)
aws_lambda.upload_函数在库boto/awslambda中定义
def upload_function(self, function_name, function_zip, runtime, role,
handler, mode, description=None, timeout=None,
memory_size=None):
uri = '/2014-11-13/functions/{0}'.format(function_name)
headers = {}
query_params = {}
if runtime is not None:
query_params['Runtime'] = runtime
if role is not None:
query_params['Role'] = role
if handler is not None:
query_params['Handler'] = handler
if mode is not None:
query_params['Mode'] = mode
if description is not None:
query_params['Description'] = description
if timeout is not None:
query_params['Timeout'] = timeout
if memory_size is not None:
query_params['MemorySize'] = memory_size
try:
content_length = str(len(function_zip))
except (TypeError, AttributeError):
# If a file like object is provided and seekable, try to retrieve
# the file size via fstat.
try:
function_zip.tell()
except (AttributeError, OSError, IOError):
raise TypeError(
"File-like object passed to parameter "
"``function_zip`` must be seekable."
)
content_length = str(os.fstat(function_zip.fileno()).st_size)
headers['Content-Length'] = content_length
return self.make_request('PUT', uri, expected_status=201,
data=function_zip, headers=headers,
params=query_params)
def make_request(self, verb, resource, headers=None, data='',
expected_status=None, params=None):
if headers is None:
headers = {}
response = AWSAuthConnection.make_request(
self, verb, resource, headers=headers, data=data, params=params)
body = response.read().decode('utf-8')
if body:
body = json.loads(body)
if response.status == expected_status:
return body
else:
error_type = response.getheader('x-amzn-ErrorType').split(':')[0]
error_class = self._faults.get(error_type, self.ResponseError)
raise error_class(response.status, response.reason, body)
有一点可能会产生误导,即BOTO2.0使用的是旧版本的Lambda API(2014-11-13)。当前的API(2015-03-31)(如果您查阅,您将看到)在主体中使用JSON dict,其中包括base64编码的zipfile作为其值之一。但是,在boto2使用的API中,几乎所有内容都是通过查询参数传递的,并且整个正文都作为二进制blob(无编码)专用于zipfile的内容 您的问题似乎是您正在将
“file://”
预编到zip中的字节。在您发布的boto代码中,zip_函数
参数的内容只是盲目地传递给最终的HTTP请求主体。您应该使用b'
标志打开zip\u文件名
,只需将zip\u blob.read()
传递到upload\u lambda\u函数
。(或者,如果您注意到,代码除了可以处理字符串外,还可以处理类似文件的对象,因此您只需传递zip\u blob
,而无需读取它)
那么,您是否尝试解压使用
解压生成的文件?是的,尝试了…我可以解压文件…我认为…base64和utf-8结尾编码有一些问题…我不知道如何更正。。。
def upload_lambda_function(zip_file_name):
with open(zip_file_name, 'rb') as zip_blob:
aws_lambda.upload_function(
lambda_function_name,
zip_blob,
"nodejs6.10",
lambda_execution_role_arn,
"index.handler",
"event",
description=None,
timeout=60,
memory_size=128)