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 Amazon 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 le champ Nom du compartiment, saisissez le nom du compartiment source.
- Dans la liste déroulante des régions AWS, choisissez votre région AWS.
- 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 choisissez Créer à partir de zéro.
-
Dans le champ Nom de la fonction, saisissez le nom de votre fonction.
-
Dans la liste déroulante Exécution, choisissez Python 3.11.
-
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 télé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 le didacticiel : 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 similaire à la politique basée sur les ressources 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 balises 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 page Octroi de l’accès aux fonctions aux services AWS.
Informations connexes
Comment puis-je corriger les erreurs 403 Accès refusé depuis Amazon S3 ?
Comment puis-je autoriser mon rôle d’exécution Lambda à accéder à mon compartiment Amazon S3 ?