Pourquoi l’erreur Access Denied (Accès refusé) s’affiche-t-elle lorsque j’utilise une fonction Lambda pour charger des fichiers dans un compartiment Amazon S3 dans un autre compte ?

Dernière mise à jour : 2-11-2020

Je souhaite utiliser une fonction AWS Lambda pour charger des fichiers dans un compartiment Amazon Simple Storage Service (Amazon S3) dans un autre compte AWS, mais je reçois l’erreur Access Denied (Accès refusé). Comment résoudre ce problème ?

Brève description

Vous recevez cette erreur lorsque les autorisations entre la fonction AWS Lambda et le compartiment Amazon S3 sont incomplètes ou incorrectes.

Pour définir les autorisations correctes entre une fonction Lambda dans un compte (Compte A) et un compartiment S3 dans un autre compte (Compte B), procédez comme suit :

1.    Dans le compte A, créez un rôle AWS Identity and Access Management (IAM) (rôle d'exécution) pour que la fonction Lambda puisse charger des objets vers Amazon S3.

2.    Dans le compte B, mettez à jour la stratégie de compartiment pour que la fonction Lambda puisse télécharger des objets.

Solution

Avant de commencer, assurez-vous que vous avez déjà créé :

Dans le compte A, créez un rôle IAM (rôle d'exécution) pour que la fonction Lambda puisse charger des objets vers Amazon S3

1.    Créez un rôle IAM pour la fonction Lambda.

2.    Notez l’Amazon Resource Name (ARN) du rôle IAM pour une étape ultérieure. Une façon d'obtenir l'ARN est d'exécuter la commande get-role dans l’interface de ligne de commande (CLI AWS).

Remarque : si vous recevez des erreurs lors de l'exécution des commandes depuis l’interface de ligne de commande AWS (CLI AWS), assurez-vous que vous utilisez la version de cette dernière.

3.    Associez une stratégie au rôle IAM qui autorise le chargement d’objets (S3:PutObject) dans le compartiment dans le compte B. Par exemple, cette stratégie accorde au rôle l'autorisation à la fois sur S3:PutObject et S3:PutObject :

{
    "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 la fonction Lambda par le rôle IAM que vous avez créé. Vous pouvez modifier le rôle d'exécution en définissant les paramètres de la fonction.

Dans le compte B, mettez à jour la stratégie de compartiment pour permettre à la fonction Lambda charger des objets

Mettez à jour la stratégie de compartiment pour qu’elle spécifie l'ARN du rôle IAM de la fonction Lambda (rôle d'exécution) en tant que mandataire ayant accès à l'action S3:PutObject. Vous pouvez utiliser une stratégie de compartiment analogue à celle-ci :

Remarque : cette stratégie accorde également au rôle d'exécution 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/*"
            ]
        }
    ]
}

Cet article vous a-t-il été utile?


Besoin d'aide pour une question technique ou de facturation ?