Je souhaite utiliser une fonction AWS Lambda pour copier des fichiers d’un compartiment Amazon Simple Storage Service (Amazon S3) vers un autre compartiment.
Résolution
Procédez comme suit pour créer une fonction Lambda qui copie les fichiers depuis un compartiment Amazon S3 source vers un compartiment S3 de destination.
Créer les compartiments S3 source et de destination
Remarque : si vous avez déjà créé les compartiments S3 source et de destination, vous pouvez ignorer cette étape.
Procédez comme suit :
- Ouvrez la console Amazon S3.
- Sélectionnez Créer un compartiment.
- Dans Nom du compartiment, saisissez le nom du compartiment source.
- Sélectionnez Créer un compartiment.
- Répétez les étapes 1 à 4 pour le compartiment de destination.
Pour en savoir plus, consultez la page Création d’un compartiment.
Créer la fonction Lambda
Procédez comme suit :
-
Ouvrez la page Fonctions dans la console Lambda.
-
Sélectionnez Créer une fonction, puis Créer à partir de zéro.
-
Dans Nom de la fonction, saisissez le nom de votre fonction.
-
Dans la liste déroulante Exécution, choisissez Python 3.13.
-
Développez la section Modifier le rôle d’exécution par défaut, puis choisissez Créer un nouveau rôle avec des autorisations de base.
-
Sélectionnez Créer une fonction.
-
Choisissez l’onglet Code, puis collez le code Python suivant :
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))
Remarque : vous trouverez le nom source_bucket dans l’objet d’événement reçu par la fonction Lambda. Vous pouvez enregistrer le nom destination_bucket en tant que variable d’environnement.
-
Sélectionnez Déployer.
Lambda crée un rôle d'exécution qui accorde à la fonction l'autorisation de charger des journaux sur Amazon CloudWatch. Pour en savoir plus, consultez la page Créer une fonction Lambda avec la console.
Créer un déclencheur Amazon S3 pour la fonction Lambda
Procédez comme suit :
- Ouvrez la page Fonctions dans la console Lambda.
- Dans le champ Fonctions, choisissez la fonction Lambda.
- Dans le champ Présentation de la fonction, sélectionnez Ajouter un déclencheur.
- Dans la liste déroulante Configuration du déclencheur, choisissez S3.
- Dans le champ Compartiment, saisissez le nom de votre compartiment source.
- Dans la liste déroulante Type d’événement, sélectionnez Tous les événements de création d’objets.
Remarque : configurez cette étape pour utiliser le type d’événement POST, PUT ou Chargement partitionné pour charger l’objet.
- Sélectionnez l’accord Je reconnais que l’utilisation du même compartiment S3 pour les entrées et les sorties n’est pas recommandée, puis sélectionnez Ajouter.
Pour plus d'informations, consultez la section Tutoriel : Utilisation d’un déclencheur Amazon S3 pour appeler une fonction Lambda.
Fournir des autorisations IAM pour le rôle d’exécution de la fonction Lambda
Afin de copier des fichiers vers le compartiment S3 de destination, ajoutez des autorisations AWS Identity and Access Management (AWS IAM) pour le rôle d’exécution de la fonction Lambda. Utilisez une politique basée sur les ressources similaire à la politique suivante :
{
"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/*"
]
}
]
}
Remarque :
- Remplacez destination-s3-bucket par votre compartiment S3 de destination et source-s3-bucket par votre compartiment S3 source.
- Remplacez /* à la fin de l’ARN de la ressource par la valeur de préfixe requise pour votre environnement afin de limiter les autorisations.
- Il est recommandé d’accorder les autorisations de moindre privilège pour effectuer une tâche.
- Pour copier des objets avec des identifications d’objet, le rôle d’exécution doit disposer des autorisations s3:GetObjectTagging et s3:PutObjectTagging. Vous devez disposer de l’autorisation s3:GetObjectTagging pour l’objet source dans le compartiment source et de l’autorisation s3:PutObjectTagging pour les objets du compartiment de destination.
Pour en savoir plus, consultez la section Octroi de l’accès à la fonction Lambda aux services AWS.
Informations connexes
Comment puis-je résoudre les erreurs 403 Accès refusé renvoyées par Amazon S3 ?
Comment puis-je autoriser ma fonction Lambda à accéder à mon compartiment Amazon S3 ?