Warum erhalte ich die Fehlermeldung „Zugriff verweigert“, wenn ich eine Lambda-Funktion verwende, um Dateien in einen Amazon S3-Bucket in einem anderen AWS-Konto hochzuladen?

Lesedauer: 3 Minute
0

Ich erhalte die Fehlermeldung „Zugriff verweigert“, wenn ich eine AWS Lambda-Funktion verwende, um Dateien in einen Amazon Simple Storage Service (Amazon S3)-Bucket hochzuladen. Der Amazon S3-Bucket befindet sich in einem anderen AWS-Konto. 

Kurzbeschreibung

Wenn die Berechtigungen zwischen einer Lambda-Funktion und einem Amazon S3-Bucket unvollständig oder falsch sind, gibt Lambda den Fehler Zugriff verweigert zurück.

Gehen Sie wie folgt vor, um Berechtigungen zwischen einer Lambda-Funktion in einem Konto (Konto 1) und einem S3-Bucket in einem anderen Konto (Konto 2) einzurichten:

1.(In Konto 1) Erstellen Sie eine Lambda-Ausführungsrolle, die es der Lambda-Funktion ermöglicht, Objekte auf Amazon S3 hochzuladen.

2.(In Konto 2) Ändern Sie die Bucket-Richtlinie des S3-Buckets, damit die Lambda-Funktion Objekte in den Bucket hochladen kann.

Auflösung

**Wichtig:**Die folgende Lösung erfordert eine Lambda-Funktion in einem AWS-Konto und einen S3-Bucket in einem anderen Konto.

Beispielcode für eine Lambda-Funktion, die Dateien in einen S3-Bucket hochlädt (Python-Version 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

**Hinweis:**Bevor Sie die Bucket-Owner-Full-Control-ACL in der Upload-Anfrage übergeben, vergewissern Sie sich, dass die ACLs für den Bucket nicht deaktiviert sind. Dies erfolgt in den Einstellungen für den Besitz des S3-Buckets. Weitere Informationen finden Sie unter Steuern des Eigentums an Objekten und Deaktivieren von ACLs für Ihren Bucket.

(In Konto 1) Erstellen Sie eine Lambda-Ausführungsrolle, die es der Lambda-Funktion ermöglicht, Objekte auf Amazon S3 hochzuladen.

1.Erstellen Sie eine AWS Identity and Access Management (IAM)-Rolle für Ihre Lambda-Funktion.

2.Kopieren Sie den Amazon-Ressourcennamen (ARN) der IAM-Rolle.

**Hinweis:**Sie müssen den ARN der IAM-Rolle abrufen, bevor Sie die Bucket-Richtlinie des S3-Buckets aktualisieren können. Eine Möglichkeit, den ARN der IAM-Rolle abzurufen, besteht darin, den Befehl get-role der AWS CLI (AWS Command Line Interface) auszuführen. Wenn Sie beim Ausführen von AWS-CLI-Befehlen Fehler erhalten, stellen Sie sicher, dass Sie die neueste Version der AWS-CLI verwenden.

3.Hängen Sie der IAM-Rolle eine Richtlinie an, die Berechtigung zum Hochladen von Objekten (s3:PutObject) in den Bucket in Konto 2 gewährt.

Beispiel für eine IAM-Richtlinie, die einer IAM-Rolle s3:PutObject- und s3:PutObjectAcl-Berechtigungen gewährt

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

4.Ändern Sie die Ausführungsrolle Ihrer Lambda-Funktion in die IAM-Rolle, die Sie erstellt haben. Anweisungen finden Sie unter Lambda-Funktionsoptionen konfigurieren.

(In Konto 2) Ändern Sie die Bucket-Richtlinie des S3-Buckets, damit die Lambda-Funktion Objekte in den Bucket hochladen kann.

Aktualisieren Sie die Bucket-Richtlinie, sodass sie den ARN der Lambda-Ausführungsrolle als Principal angibt, der Zugriff auf die Aktion ** s3:PutObject** hat.

Beispiel für eine S3-Bucket-Richtlinie, die es einer Lambda-Funktion ermöglicht, Objekte in den Bucket hochzuladen

**Hinweis:**Die folgende Richtlinie gewährt der Ausführungsrolle der Lambda-Funktion auch die Berechtigung für s3:PutObjectAcl.

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

Verwandte Informationen

Wie behebe ich Fehler vom Typ „403 Zugriff verweigert“ in Amazon S3?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr