Como posso copiar objetos do S3 de outra conta da AWS?

Última atualização: 19-05-2021

Desejo copiar objetos do Amazon Simple Storage Service (Amazon S3) entre contas da AWS. Depois, quero garantir que os objetos copiados pertençam à conta de destino. Como posso fazer isso?

Resolução

Por padrão, os objetos do S3 pertencem à conta que carregou o objeto. Isso vale inclusive se o bucket de destino pertencer a outra conta. A propriedade do objeto é importante para gerenciar permissões usando uma política de buckets. Para uma política de buckets ser aplicada a um objeto no bucket, o objeto deve pertencer à conta que é proprietária do bucket.

Para garantir que uma conta de destino é proprietária de um objeto do S3 copiado de outra conta, siga as seguintes etapas:

1.    Na conta de origem, crie uma política gerenciada do cliente do AWS Identity and Access Management (IAM) que conceda as devidas permissões a uma identidade do IAM (usuário ou função). O usuário do IAM deve ter acesso para recuperar objetos do bucket de origem e devolver os objetos ao bucket de destino. Você pode usar uma política do IAM semelhante para:

{
    "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/*"
            ]
        }
    ]
}

Observação: este exemplo de política do IAM contém apenas as permissões mínimas necessárias para listar objetos e copiar objetos entre buckets em diferentes contas. É necessário personalizar as ações permitidas do S3 de acordo com seu caso de uso. Por exemplo, se o usuário precisa copiar objetos que contenham etiquetas de objeto, também é necessário conceder permissões para s3:GetObjectTagging. Se você receber um erro, tente executar estas etapas como usuário administrador.

2.    Na conta de origem, anexe a política gerenciada do cliente para a identidade do IAM que você deseja usar para copiar objetos para o bucket de destino.

3.    Na conta de destino, configure S3 Object Ownership (Propriedade do objeto do S3) no bucket de destino para o proprietário do bucket preferencial. Após você configurar S3 Object Ownership (Propriedade do objeto do S3), os novos objetos carregados com a lista de controle de acesso (ACL) configurados como bucket-owner-full-control automaticamente pertencerão à conta do bucket.

4.    Na conta de destino, modifique a política de buckets do bucket de destino para conceder à conta de origem permissões para carregar objetos. Além disso, inclua uma condição na política do bucket que exija que os objetos sejam carregados para configurar a ACL para bucket-owner-full-control. Você pode usar uma declaração semelhante para:

Observação: substitua destination-DOC-EXAMPLE-BUCKET pelo nome do bucket de destino. Depois, substitua arn:aws:iam::222222222222:user/Jane pelo nome do recurso da Amazon (ARN) da identidade do IAM da conta de origem.

{
    "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"
        }
    ]
}

Observação: este exemplo de política de buckets contém apenas o mínimo de permissões necessárias para carregar um objeto com a ACL necessária. É necessário personalizar as ações permitidas do S3 de acordo com seu caso de uso. Por exemplo, se o usuário precisar copiar objetos que contenham etiquetas de objeto, também será necessário conceder permissões para s3:GetObjectTagging

5.    Depois que você configurar a política do IAM e a política de buckets, a identidade do IAM da conta de origem deverá carregar objetos para o bucket de destino. Verifique se a ACL está configurada para bucket-owner-full-control. Por exemplo, a identidade do IAM de origem deve executar o comando cp da AWS CLI com a opção --acl:

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

Observação: se você receber erros ao executar comandos da AWS CLI, certifique-se de estar usando a versão mais recente da AWS CLI.

Com a opção S3 Object Ownership (Propriedade do objeto do S3) configurada para o proprietário do bucket preferencial, os objetos carregados com a ACL bucket-owner-full-contro pertencerão automaticamente à conta do bucket de destino.

Importante: se seu bucket do S3 possuir uma criptografia padrão com o AWS Key Management Service (AWS KMS) habilitado, também será necessário modificar as permissões de chave do AWS KMS. Para obter instruções, consulte Meu bucket do Amazon S3 possui criptografia padrão usando uma chave personalizada do AWS KMS. Como posso permitir que usuários baixem/carreguem de/para o bucket?