Comment puis-je copier des objets S3 depuis un autre compte AWS ?

Date de la dernière mise à jour : 19/05/2021

Je souhaite copier des objets Amazon Simple Storage Service (Amazon S3) dans d'autres comptes AWS. Ensuite, je souhaite m'assurer que le compte de destination possède les objets copiés. Comment dois-je procéder ?

Résolution

Par défaut, un objet S3 appartient au compte qui a chargé l'objet. Ceci est vrai même si le compartiment de destination appartient à un autre compte. La propriété des objets est importante pour gérer les autorisations à l'aide d'une stratégie de compartiment. Pour qu'une stratégie de compartiment s'applique à un objet dans le compartiment, l'objet doit être détenu par le compte qui possède le compartiment.

Pour vous assurer qu'un compte de destination possède un objet S3 copié à partir d'un autre compte, procédez comme suit :

1.    Dans le compte source, créez une stratégie gérée par le client AWS Identity and Access Management (IAM) qui accorde des autorisations appropriées à une identité IAM (utilisateur ou rôle). L'utilisateur IAM doit avoir accès pour récupérer des objets du compartiment source et les remettre dans le compartiment de destination. Vous pouvez utiliser une stratégie IAM similaire à la suivante :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::source-DOC-EXAMPLE-BUCKET/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET",
                "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*"
            ]
        }
    ]
}

Remarque : cet exemple de stratégie IAM inclut uniquement les autorisations minimales requises pour lister des objets et copier des objets dans des compartiments de différents comptes. Vous devez personnaliser les actions S3 autorisées en fonction de votre cas d'utilisation. Par exemple, si l'utilisateur doit copier des objets qui ont des balises d'objet, vous devez également accorder des autorisations pour S3:GetObjectTagging. Si vous rencontrez une erreur, essayez de procéder comme suit en tant qu'utilisateur admin.

2.    Dans le compte source, attachez la stratégie gérée par le client à l'identité IAM que vous souhaitez utiliser pour copier des objets dans le compartiment de destination.

3.    Dans le compte de destination, définissez Propriété d'objet S3 sur le compartiment de destination sur le propriétaire du compartiment préféré. Une fois que vous avez défini la propriété d'objet S3, les nouveaux objets téléchargés avec la liste de contrôle d'accès (ACL) définie sur bucket-owner-full control sont automatiquement détenus par le compte du compartiment.

4.    Dans le compte de destination, modifiez la stratégie de compartiment du compartiment de destination pour accorder au compte source les autorisations de téléchargement d'objets. En outre, incluez une condition dans la stratégie de compartiment qui requiert des téléchargements d'objets pour définir la liste ACL sur bucket-owner-full-control. Vous pouvez utiliser une déclaration similaire à celle qui suit:

Remarque : remplacez destination-DOC-EXAMPLE-BUCKET avec le nom du compartiment de destination. Ensuite, remplacez arn:aws:iam::222222222222:user/Jane par le Amazon Resource Name (ARN) de l'identité IAM à partir du compte source.

{
    "Version": "2012-10-17",
    "Id": "Policy1611277539797",
    "Statement": [
        {
            "Sid": "Stmt1611277535086",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:user/Jane"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        },
        {
            "Sid": "Stmt1611277877767",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:user/Jane"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::destination-DOC-EXAMPLE-BUCKET"
        }
    ]
}

Remarque : cet exemple de stratégie de compartiment inclut uniquement les autorisations minimales requises pour télécharger un objet avec la liste ACL requise. Vous devez personnaliser les actions S3 autorisées en fonction de votre cas d'utilisation. Par exemple, si l'utilisateur doit copier des objets qui ont des balises d'objet, vous devez également accorder des autorisations pour S3:getObjectTagging

5.    Après avoir configuré la stratégie IAM et la stratégie de compartiment, l'identité IAM du compte source doit charger des objets dans le compartiment de destination. Assurez-vous que l'ACL est définie sur bucket-owner-full-control. Par exemple, l'identité IAM source doit exécuter la commande AWS CLI cp avec l'option --acl :

aws s3 cp s3://source-DOC-EXAMPLE-BUCKET/object.txt s3://destination-DOC-EXAMPLE-BUCKET/object.txt --acl bucket-owner-full-control

Remarque : Si vous recevez des erreurs lors de l'exécution de commandes AWS CLI, vérifiez que vous utilisez la version la plus récente d'AWS CLI.

Avec la propriété d'objet S3 définie sur propriétaire du compartiment préféré, les objets chargés avec une ACL définie sur bucket-owner-full-control sont automatiquement détenus par le compte du compartiment de destination.

Important : si votre compartiment S3 a un chiffrement par défaut avec AWS Key Management Service (AWS KMS) activé, alors vous devez également modifier les autorisations de la clé AWS KMS. Pour obtenir des instructions, consultez Mon compartiment Amazon S3 a le chiffrement par défaut utilisant une clé AWS KMS personnalisée. Comment puis-je permettre aux utilisateurs de télécharger et de charger vers le compartiment ?