Direkt zum Inhalt

Wie verwende ich eine Lambda-Funktion, 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

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

S3-Quell- und -Ziel-Buckets erstellen

**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. Gib als Bucket-Name einen Namen für den Quell-Bucket ein.
  4. Wähle Bucket erstellen.
  5. 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. Öffne die Funktionsseite in der Lambda-Konsole.

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

  3. Gib unter Funktionsname den Namen der Funktion ein.

  4. Wähle in der Runtime-Dropdown-Liste Python 3.13.

  5. Erweitere die Standardausführungsrolle und wähle dann Neue Rolle mit Basisberechtigungen erstellen.

  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 boto3
    import 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. Du kannst den Namen des destination_bucket als Umgebungsvariable speichern.

  8. Wähle Bereitstellen.

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 findest du unter 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üge AWS Identity and Access Management (IAM)-Berechtigungen für die Ausführungsrolle der Lambda-Funktion hinzu. Verwende eine ressourcenbasierte Richtlinie, die der folgenden ä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:

  • Ersetze destination-s3-bucket durch den S3-Ziel-Bucket und source-s3-bucket durch den S3-Quell-Bucket.
  • Ersetze /* am Ende des Ressourcen-ARN durch den erforderlichen Präfixwert für deine 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. Du musst die s3:GetObjectTagging-Berechtigung für das Quellobjekt im Quell-Bucket und s3:PutObjectTagging-Berechtigung für Objekte im Ziel-Bucket haben.

Weitere Informationen findest du unter Der Lambda-Funktion Zugriff auf AWS-Services gewähren.

Ähnliche Informationen

Wie behebe ich Fehler „403 Access Denied“ von Amazon S3?

Wie erlaube ich meiner Lambda-Funktion den Zugriff auf meinen Amazon S3 Bucket?

AWS OFFICIALAktualisiert vor einem Jahr