Amazon web services 无法在使用python创建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::' + \

我正在尝试使用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::' + \
        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)