Wie kann ich eine Lambda-Funktion verwenden, um Dateien von einem Amazon S3 Bucket in einen anderen zu kopieren?

Lesedauer: 4 Minute
0

Ich möchte eine AWS-Lambda-Funktion verwenden, um Dateien aus einem Amazon Simple Storage Service (Amazon S3) Bucket in einen anderen Bucket zu kopieren.

Behebung

Folgen Sie diesen Schritten, um eine Lambda-Funktion zu erstellen, die Dateien aus einem Amazon-S3-Quell-Bucket in einen S3-Ziel-Bucket kopiert.

Erstellen Sie die Amazon-S3-Quell- und -Ziel-Buckets

**Hinweis:**Wenn Sie die Quell- und Ziel-S3-Buckets bereits erstellt haben, überspringen Sie diesen Schritt.

Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie die Amazon-S3-Konsole.
  2. Wählen Sie Bucket erstellen aus.
  3. Geben Sie als Bucket-Name einen Namen für den Quell-Bucket ein.
  4. Wählen Sie aus der Dropdownliste AWS-Region Ihre AWS-Region aus.
  5. Wählen Sie Bucket erstellen aus.
  6. Wiederholen Sie die Schritte 1 bis 4 für Ihren Ziel-Bucket.

Weitere Informationen finden Sie unter Bucket erstellen.

Erstellen Sie die Lambda-Funktion

Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie die Funktionsseite in der Lambda-Konsole.

  2. Wählen Sie Funktion erstellen und wählen Sie dann Autor von Grund auf neu.

  3. Geben Sie unter Funktionsname den Namen Ihrer Funktion ein.

  4. Wählen Sie in der Runtime-Dropdown-Liste Python 3.11 aus.

  5. Erweitern Sie die Standardausführungsrolle und wählen Sie dann Neue Rolle mit Basisberechtigungen erstellen aus.

  6. Wählen Sie Funktion erstellen aus.

  7. Wählen Sie die Registerkarte Code und fügen Sie dann den folgenden Python-Code ein:

    import boto3import botocore
    import json
    import os
    import logging
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    s3 = boto3.resource('s3')
    
    def lambda_handler(event, context):
        logger.info("New files uploaded to the source bucket.")
    
        key = event['Records'][0]['s3']['object']['key']
    
        source_bucket = event['Records'][0]['s3']['bucket']['name']
        destination_bucket = os.environ['destination_bucket']
    
        source = {'Bucket': source_bucket, 'Key': key}
    
        try:
            response = s3.meta.client.copy(source, destination_bucket, key)
            logger.info("File copied to the destination bucket successfully!")
    
        except botocore.exceptions.ClientError as error:
            logger.error("There was an error copying the file to the destination bucket")
            print('Error Message: {}'.format(error))
    
        except botocore.exceptions.ParamValidationError as error:
            logger.error("Missing required parameters while calling the API.")
            print('Error Message: {}'.format(error))

    **Hinweis:**Suchen Sie den Namen source_bucket aus dem Ereignisobjekt, das die Lambda-Funktion empfängt. Sie können den Namen des destination_bucket als Umgebungsvariable speichern.

  8. Wählen Sie Bereitstellen aus.

Lambda erstellt eine Ausführungsrolle, die der Funktion die Berechtigung erteilt, Protokolle auf Amazon CloudWatch hochzuladen. Weitere Informationen finden Sie unter Erstellen einer Lambda-Funktion mit der Konsole.

Erstellen Sie einen Amazon S3 Trigger für die Lambda-Funktion

Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie die Funktionsseite in der Lambda-Konsole.
  2. Wählen Sie unter Funktionen die Lambda-Funktion aus.
  3. Wählen Sie unter Funktionsübersicht die Option Trigger hinzufügen aus.
  4. Wählen Sie in der Dropdown-Liste Trigger-Konfiguration die Option S3 aus.
  5. Geben Sie in Bucket den Namen Ihres Quell-Buckets ein.
  6. Wählen Sie in der Dropdown-Liste Ereignistyp die Option Alle Ereignisse zum Erstellen von Objekten aus.
    **Hinweis:**Konfigurieren Sie diesen Schritt so, dass Sie entweder den Ereignistyp POST, PUT oder Multipart Upload verwenden, um das Objekt hochzuladen.
  7. Wählen Sie die Vereinbarung Ich bestätige, dass die Verwendung desselben S3 Buckets für Eingabe und Ausgabe nicht empfohlen wird, und wählen Sie dann Hinzufügen aus.

Weitere Informationen finden Sie im Tutorial: Verwendung eines Amazon S3 Triggers zum Aufrufen einer Lambda-Funktion.

Stellen Sie IAM-Berechtigungen für die Ausführungsrolle der Lambda-Funktion bereit

Um Dateien in den Ziel-S3-Bucket zu kopieren, fügen Sie AWS Identity and Access Management (IAM)-Berechtigungen für die Ausführungsrolle der Lambda-Funktion hinzu. Verwenden Sie eine Richtlinie, die der folgenden ressourcenbasierten Richtlinie ähnelt:

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "putObject",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::destination-s3-bucket/*"
      ]
    },
    {
      "Sid": "getObject",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::source-s3-bucket/*"
      ]
    }
  ]
}

Hinweis:

  • Ersetzen Sie destination-s3-bucket durch Ihren S3-Ziel-Bucket und source-s3-bucket durch Ihren S3-Quell-Bucket.
  • Ersetzen Sie**/*** am Ende des Ressourcen-ARN durch den erforderlichen Präfixwert für Ihre Umgebung, um die Berechtigungen einzuschränken.
  • Es hat sich bewährt, Berechtigungen mit den geringsten Rechten zur Ausführung einer Aufgabe zu gewähren.
  • Um Objekte mit Objekt-Tags zu kopieren, muss die Ausführungsrolle über s3:GetObjectTagging- und s3:PutObjectTagging-Berechtigungen verfügen. Sie müssen die s3:GetObjectTagging-Berechtigung für das Quellobjekt im Quell-Bucket und s3:PutObjectTagging-Berechtigung für Objekte im Ziel-Bucket haben.

Weitere Informationen finden Sie unter Gewähren des Funktionszugriffs auf AWS-Services.

Ähnliche Informationen

Wie behebe ich Fehler 403 „Zugriff verweigert“ von Amazon S3?

Wie erlaube ich meiner Lambda-Ausführungsrolle den Zugriff auf meinen Amazon S3 Bucket?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 7 Monaten