2017-07-24 3 views
0

Ich habe die folgende Richtlinie für einen S3-Bucket, der mit dem AWS-Richtliniengenerator erstellt wurde, damit ein Lambda mit einer bestimmten Rolle auf die Dateien im Bucket zugreifen kann. Allerdings, wenn ich das Lambda ausführen, erhalte ich 403 die Erlaubnis verweigert:S3-Richtlinie zum Zulassen von Lambda

"errorMessage": "Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: <requestId>)", 
    "errorType": "com.amazonaws.services.s3.model.AmazonS3Exception", 

Die Politik auf dem S3-Bucket:

{ 
"Version": "2012-10-17", 
"Id": "Policy<number>", 
"Statement": [ 
    { 
     "Sid": "Stmt<number>", 
     "Effect": "Allow", 
     "Principal": { 
      "AWS": "arn:aws:iam::<account>:role/<roleName>" 
     }, 
     "Action": "s3:*", 
     "Resource": "arn:aws:s3:::<bucketName>/*" 
    } 
] 
} 

Was ist falsch mit der Politik? Der Lambda wird mit der in der Richtlinie konfigurierten Rolle ausgeführt.

+0

Ich werde mit der ersten Änderung dieser Richtlinie beginnen, um allen Berechtigungen zu geben .. im Prinzip entfernen Principal und Bucketname .. Das wird Ihnen sagen, ob das Problem in Ihrer S3-Richtlinie oder mit Lambda ist. – Deepak

+0

Warum fügen Sie der IAM-Rolle, die der Lambda-Funktion zugewiesen ist, die S3-Bucket-Berechtigungen hinzu, anstatt zu versuchen, dies über eine Bucket-Richtlinie zu tun? –

+0

Was machst du mit dem Eimer, von Lambda? Einige Aktionen erfordern, dass die Ressource das '/ *' am Ende ausschließt, andere müssen es enthalten: '" Ressource ": [" arn: aws: s3 ::: "," arn: aws: s3 ::: /* "]' –

Antwort

1

Eine einer AWS-Lambda-Funktion zugewiesene Rolle sollte sein, eine erstellte AWS Lambda-Rolle (ausgewählt beim Erstellen einer Rolle in der IAM-Konsole).

Rollen haben keinen Principal, da die Berechtigungen dem jeweiligen Dienst zugewiesen sind (in diesem Fall die Lambda-Funktion), der die Rolle verwendet.

Außerdem sollten Sie Berechtigungen für den Eimer selbst (zB zur Liste Inhalt) und auf den Inhalt des Eimers (zB GetObject) zuweisen. so etwas wie dieses

Es wäre:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "AllowS3Access", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:*" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::my-bucket", 
       "arn:aws:s3:::my-bucket/*" 
      ] 
     } 
    ] 
} 
+0

Danke für die Antwort. Die Richtlinie, die ich auf dem Bucket selbst eingerichtet hatte, war korrekt. Was fehlte, war, dass die Rolle selbst die AmazonS3FullAccess-Richtlinie über die IAM anhängen musste. – FiguringThisOut

0

Nach ich Looping, während ich es Arbeit machen könnte, der Prozess ist:

  1. die s3 Eimer erstellen.
  2. erstellen die IAM-Politik (Bucketnamen erforderlich)
  3. Erstellen IAM Rolle (IAM Politik erforderlich)
  4. erstellen Lambda-Funktion (IAM Rolle erforderlich)
  5. s3 bucket Politik (Lambda-Funktion Name erforderlich)
erstellen

IAM-Politik:

{ 
"Version": "2012-10-17", 
"Statement": [ 
    { 
     "Sid": "Stmt*******", 
     "Effect": "Allow", 
     "Action": [ 
      "s3:PutObject", 
      "s3:PutObjectAcl", 
      "s3:PutObjectTagging", 
      "s3:PutObjectVersionAcl", 
      "s3:PutObjectVersionTagging" 
     ], 
     "Resource": [ 
      "arn:aws:s3:::<bucket-name>" 
     ] 
    } 
] 
} 

und ich verwende diese Politik auf dem s3 Bucket

{ 
"Id": "Policy************", 
"Version": "2012-10-17", 
"Statement": [ 
{ 
    "Sid": "Stmt********", 
    "Action": [ 
    "s3:PutObject", 
    "s3:PutObjectAcl", 
    "s3:PutObjectTagging", 
    "s3:PutObjectVersionAcl", 
    "s3:PutObjectVersionTagging" 
    ], 
    "Effect": "Allow", 
    "Resource": "arn:aws:s3:::<bucket-name>/*", 
    "Principal": { 
    "AWS": [ 
     "arn:aws:iam::*********:role/<lambda-function-name>" 
      ] 
      } 
     } 
    ] 
} 
Verwandte Themen