Pourquoi est-ce que je reçois des erreurs d'accès refusé lorsque j'utilise une fonction Lambda pour charger des fichiers vers un compartiment Amazon S3 d'un autre compte AWS ?

Lecture de 4 minute(s)
0

Un message d'erreur d'accès refusé s'affiche lorsque j'utilise une fonction AWS Lambda pour charger des fichiers vers un compartiment Amazon Simple Storage Service (Amazon S3). Le compartiment Amazon S3 se trouve dans un autre compte AWS. 

Brève description

Si les autorisations entre une fonction Lambda et un compartiment Amazon S3 sont incomplètes ou incorrectes, Lambda renvoie une erreur d'accès refusé.

Pour configurer les autorisations entre une fonction Lambda d'un compte (compte 1) et un compartiment S3 d'un autre compte (compte 2), procédez comme suit :

1.    (Dans le compte 1) Créez un rôle d’exécution Lambda pour permettre à la fonction Lambda de charger des objets vers Amazon S3.

2.    (Dans le compte 2) Modifiez la politique de compartiment du compartiment S3 pour permettre à la fonction Lambda de télécharger des objets dans le compartiment.

Résolution

**Important :**la solution suivante nécessite une fonction Lambda dans un compte AWS et un compartiment S3 dans un autre compte.

Exemple de code pour une fonction Lambda qui télécharge des fichiers vers un compartiment S3 (Python version 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

**Remarque :**avant de transmettre l'ACL de contrôle total du propriétaire du compartiment dans la demande de téléchargement, assurez-vous que les ACL ne sont pas désactivées sur le compartiment. Pour ce faire, utilisez les paramètres de propriété du compartiment S3. Pour en savoir plus, consultez Contrôle de la propriété des objets et désactivation des ACL pour votre compartiment.

(Dans le compte 1) Créez un rôle d'exécution Lambda qui permet à la fonction Lambda de charger des objets vers Amazon S3

1.    Créez un rôle AWS Identity and Access Management (IAM) pour votre fonction Lambda.

2.    Copiez le Nom de ressource Amazon (ARN) du rôle IAM.

**Remarque :**vous devez obtenir l'ARN du rôle IAM avant de pouvoir mettre à jour la politique de compartiment du compartiment S3. L'un des moyens d'obtenir l'ARN du rôle IAM consiste à exécuter la commande get-role de l'interface de ligne de commande AWS (AWS CLI). Si des erreurs surviennent lors de l'exécution des commandes de l'AWS CLI, vérifiez que vous utilisez la version la plus récente de l'AWS CLI.

3.    Attachez une politique au rôle IAM qui accorde l'autorisation de télécharger des objets (s3:PutObject) dans le compartiment du compte 2.

Exemple de politique IAM qui accorde à un rôle IAM les autorisations S3:PutObject et S3:PutObjectAcl

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

4.    Remplacez le rôle d'exécution de votre fonction Lambda par le rôle IAM que vous avez créé. Pour obtenir des instructions, consultez la rubrique Configuration des options des fonctions Lambda.

(Dans le compte 2) Modifiez la politique de compartiment du compartiment S3 pour permettre à la fonction Lambda de télécharger des objets dans le compartiment

Mettez à jour la politique de compartiment afin qu'elle spécifie l'ARN du rôle d'exécution Lambda en tant que principal ayant accès à l'action** s3:PutObject**.

Exemple de politique de compartiment S3 qui permet à une fonction Lambda de télécharger des objets dans le compartiment

Remarque :la politique suivante accorde également au rôle d'exécution de la fonction Lambda l'autorisation s3:PutObjectAcl.

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

Informations connexes

Comment résoudre les erreurs 403 d'accès refusé depuis Amazon S3 ?

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an