2017-09-06 3 views
0

ich AWS Lambda verwenden eine Datei S3 zu laden und mit dem BefehlS3 Politik Ausgabe, wenn sie über Lambda Hochladen

s3 = boto3.resource('s3') 
s3.meta.client.upload_file("/tmp/" + fileName, [BUCKET NAME], fileName) 

Und auch ist Lambda-Richtlinie definiert als

{ 
     "Action": [ 
      "s3:PutObject" 
     ], 
     "Resource": "arn:aws:s3:::[BUCKET NAME]", 
     "Effect": "Allow" 
}, 

Aber wenn ich laufe die Funktion wird geben Fehler

(<class 'boto3.exceptions.S3UploadFailedError'>, 
S3UploadFailedError('Failed to upload /tmp/[FILE NAME] to [BUCKET 
NAME]/[FILE NAME]: An error occurred (AccessDenied) when calling the 
PutObject operation: Access Denied',), <traceback object at 
0x7f61e9d2ec48>) 

Antwort

1

Sie müssen ListBucket Politik zu ermöglichen, als auch, um Objekt in s3 programmatisch setzen.

So würde Ihre Politik sein:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["s3:ListBucket"], 
     "Resource": ["arn:aws:s3:::BUCKET_NAME"] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject" 
     ], 
     "Resource": ["arn:aws:s3:::BUCKET_NAME/*"] 
    } 
    ] 
} 
0

haben Sie für diese Rolle zu lambda.amazonaws.com Vertrauensbeziehung haben?

auch auf Ihrer Politik sollte wie die folgenden sein,

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "statement1", 
      "Effect": "Allow", 
      "Action": ["s3:PutObject"], 
      "Resource": "arn:aws:s3:::[BUCKET NAME]/*" 
     } 
    ] 
} 

Ich sehe die fehlenden/* am Ende des Eimers Namen.

Refered Dokumentation: http://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html

2

Es scheint, dass Sie

"/ *"

in der Ressource der Politik fehlen. Für den Betrieb auf Objektebene sollte die Ressource

"arn: aws: s3 ::: Beispielbucket/*" sein.

Stellen Sie außerdem sicher, dass keine Bucket-Richtlinie den Zugriff verweigert.

Weitere Informationen:

Verwandte Themen