5

I die Datenverarbeitungspipeline vonZugang boto3 durch AWS Lambda unter Verwendung

S3 + SNS +

Lambda konstruiert verwenden

becasue S3 nicht notificaiton aus seinem Speicherbereich senden, so habe ich Verwendung von SNS zu senden S3-Benachrichtigung an Lambda in einer anderen Region.

Die Funktion Lambda codiert mit

from __future__ import print_function 
import boto3 


def lambda_handler (event, context): 
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"] 
    input_file_key = event["Records"][0]["s3"]["object"]["key"] 

    input_file_name = input_file_bucket+"/"+input_file_key 

    s3=boto3.resource("s3") 
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key) 
    response = obj.get() 

    return event #echo first key valuesdf 

wenn ich speichern und Test lief, bekam ich folgende Fehlermeldung

{ 
    "stackTrace": [ 
    [ 
     "/var/task/lambda_function.py", 
     20, 
     "lambda_handler", 
     "response = obj.get()" 
    ], 
    [ 
     "/var/runtime/boto3/resources/factory.py", 
     394, 
     "do_action", 
     "response = action(self, *args, **kwargs)" 
    ], 
    [ 
     "/var/runtime/boto3/resources/action.py", 
     77, 
     "__call__", 
     "response = getattr(parent.meta.client, operation_name)(**params)" 
    ], 
    [ 
     "/var/runtime/botocore/client.py", 
     310, 
     "_api_call", 
     "return self._make_api_call(operation_name, kwargs)" 
    ], 
    [ 
     "/var/runtime/botocore/client.py", 
     395, 
     "_make_api_call", 
     "raise ClientError(parsed_response, operation_name)" 
    ] 
    ], 
    "errorType": "ClientError", 
    "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied" 
} 

ich die Lambda-Rolle konfiguriert mit

full S3 access 

und Set Eimer-Politik auf meinem Zielbehälter

everyone can do anything(list, delete, etc.) 

Es scheint, dass ich Politik nicht gut eingestellt habe.

Antwort

3

Möglichkeit des spezifischen S3 Objekt, das Sie suchen, ist mit begrenzten Berechtigungen

+1

Das ist ziemlich vage. Könnten Sie vielleicht darauf hinweisen, wie man dieses Problem angehen könnte? –

+1

Zwei Möglichkeiten 1. S3-Objekt-Level-Berechtigung zum Lesen ist verweigert 2. Die Rolle Lambda hat keine Berechtigung zum Lesen/Lesen S3-Objekte – omuthu

+0

Für mich half Hinzufügen von 's3: GetObject' zu der Richtlinie. –

10

Ich hatte ein ähnliches Problem, löste ich es durch die entsprechende Richtlinie zu meinen Benutzer anbringen.

IAM -> Benutzer -> Benutzername -> Berechtigungen -> Richtlinie anhängen.

Stellen Sie außerdem sicher, dass Sie den richtigen Zugriffsschlüssel und den geheimen Zugriffsschlüssel hinzufügen, Sie können dies mit AmazonCLI tun.

1

Hinzufügen zu Amri Antwort, wenn Ihr Eimer privat ist und Sie die Anmeldeinformationen für den Zugriff Sie den boto3.client verwenden können:

import boto3 
s3 = boto3.client('s3',aws_access_key_id='ACCESS_KEY',aws_secret_access_key='SECRET_KEY') 
response = s3.get_object(Bucket='BUCKET', Key='KEY') 

* Für diese Datei: s3: // Eimer/a/b/c/some.text, Bucket ist 'bucket' und Key ist 'a/b/c/some.text'