Come posso usare una funzione Lambda per copiare i file da un bucket Amazon S3 a un altro?

4 minuti di lettura
0

Desidero utilizzare una funzione AWS Lambda per copiare i file da un bucket Amazon Simple Storage Service (Amazon S3) a un altro bucket.

Risoluzione

Segui questi passaggi per creare una funzione Lambda che copi i file da un bucket Amazon S3 di origine a un bucket S3 di destinazione.

Crea i bucket Amazon S3 di origine e di destinazione

Nota: se hai già creato i bucket S3 di origine e di destinazione, salta questo passaggio.

Completa i seguenti passaggi:

  1. Apri la console Amazon S3.
  2. Scegli Crea bucket.
  3. In Nome bucket, inserisci un nome per il bucket di origine.
  4. Dall'elenco a discesa Regione AWS, scegli la tua Regione AWS.
  5. Scegli Crea bucket.
  6. Ripeti i passaggi 1-4 per il bucket di destinazione.

Per ulteriori informazioni, consulta la sezione Creazione di un bucket.

Crea la funzione Lambda

Completa i seguenti passaggi:

  1. Apri la pagina Funzioni nella console Lambda.

  2. Scegli la funzione Crea, quindi scegli Crea da zero.

  3. In Nome funzione, inserisci un nome per la funzione.

  4. Dall'elenco a discesa Runtime, scegli Python 3.11.

  5. Espandi la voce Modifica del ruolo di esecuzione predefinito, quindi scegli Crea un nuovo ruolo con autorizzazioni di base.

  6. Scegli Crea funzione.

  7. Scegli la scheda Codice, quindi incolla il seguente codice Python:

    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))

    Nota: trova il nome source_bucket dall'oggetto dell'evento ricevuto dalla funzione Lambda. È possibile memorizzare il nome destination_bucket come variabile di ambiente.

  8. Scegli Distribuisci.

Lambda creerà un ruolo di esecuzione che conceda alla funzione il permesso di caricare i log su Amazon CloudWatch. Per ulteriori informazioni, consulta la sezione Creare una funzione Lambda con la console.

Crea un trigger Amazon S3 per la funzione Lambda

Completa i seguenti passaggi:

  1. Apri la pagina Funzioni nella console Lambda.
  2. In Funzioni, scegli la funzione Lambda.
  3. In Panoramica della funzione, scegli Aggiungi trigger.
  4. Nell'elenco a discesa Configurazione del trigger, scegli S3.
  5. In Bucket, inserisci il nome del bucket di origine.
  6. Dall'elenco a discesa Tipo di evento, scegli Tutti gli eventi di creazione oggetti.
    Nota: configura questo passaggio per utilizzare il tipo di evento POST, PUT o Caricamento in più parti per caricare l'oggetto.
  7. Seleziona l'opzione Riconosco che l'utilizzo dello stesso bucket S3 sia per l'input che per l'output non è consigliato, quindi scegli Aggiungi.

Per ulteriori informazioni, consulta la sezione Tutorial: uso di un trigger Amazon S3 per richiamare una funzione Lambda.

Fornisci le autorizzazioni IAM per il ruolo di esecuzione della funzione Lambda

Per copiare i file nel bucket S3 di destinazione, aggiungi le autorizzazioni AWS Identity and Access Management (IAM) per il ruolo di esecuzione della funzione Lambda. Utilizza una policy simile alla seguente basata sulle risorse:

{  "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/*"
      ]
    }
  ]
}

Nota:

  • sostituisci destination-s3-bucket con il tuo bucket di destinazione S3 e source-s3-bucket con il tuo bucket di origine S3.
  • Per limitare le autorizzazioni sostituisci /* alla fine dell'ARN della risorsa con il valore del prefisso richiesto per il tuo ambiente.
  • È consigliabile concedere le autorizzazioni con privilegi minimi per eseguire un'attività.
  • Per copiare oggetti che presentano tag dell'oggetto, il ruolo di esecuzione deve disporre delle autorizzazioni s3:GetObjectTagging e s3:PutObjectTagging. È necessario disporre dell'autorizzazione s3:GetObjectTagging per l'oggetto di origine nel bucket di origine e dell'autorizzazione s3:PutObjectTagging per gli oggetti nel bucket di destinazione.

Per ulteriori informazioni, consulta la sezione Concessione dell'accesso alle funzioni ai servizi AWS.

Informazioni correlate

Come posso risolvere gli errori 403 di Accesso negato da Amazon S3?

Come posso consentire alla mia funzione Lambda di accedere al mio bucket Amazon S3?

AWS UFFICIALE
AWS UFFICIALEAggiornata 6 mesi fa