2017-05-01 2 views
0

Ich versuche, Aws Lambda-Funktion mit Python zu erstellen.Hochgeladene Datei konnte nicht beim Erstellen der Lambda-Funktion mit Python entpackt werden

Fehler bei Lambda-Funktion

enter image description here

Funktion unten erwähnt wird, geben Fehler 'konnte nicht hochgeladene Datei entpacken'

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_function definieren innerhalb Bibliothek 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) 
+0

Also haben Sie versucht, die Datei zu entpacken, die mit 'unzip' generiert wurde? –

+0

ja versucht .... und ich kann Datei entzippen ..... ich denke ... es gibt ein Problem mit base64 und utf-8 endcodings ......... ich nicht tun, wie zu beheben ... –

Antwort

0

Eine Sache, die m Irreführend ist, dass boto 2.0 eine ältere Version der Lambda API (2014-11-13) verwendet. Die aktuelle API (2015-03-31) (die Sie sehen werden, wenn Sie the docs konsultieren), verwendet ein JSON-Diktat im Hauptteil, das die base64-codierte Zip-Datei als einen ihrer Werte enthält. In der von boto2 verwendeten API wird jedoch fast alles über Abfrageparameter übergeben, und der gesamte Textkörper ist dem Inhalt der ZIP-Datei als binärer Blob (keine Codierung) zugeordnet.

Ihr Problem scheint die Tatsache zu sein, dass Sie "file://" an die Bytes in Ihrer Zip vorausgehen. In dem Boto-Code, den Sie gepostet haben, wird der Inhalt des zip_function-Arguments einfach blind an den eventuellen HTTP-Anfragetext weitergeleitet. Sie sollten zip_filename mit dem 'b' Flag öffnen und einfach zip_blob.read() ohne Änderung an upload_lambda_function übergeben. (Oder, wenn Sie bemerken, der Code kann Datei-artige Objekte zusätzlich zu Strings behandeln, so können Sie zip_blob übergeben, ohne es zu lesen).

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) 
+0

danke Keith M ....... Ich habe es ... Jetzt ist die Frage gelöst –

Verwandte Themen