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

Data da última atualização: 7/1/2022

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

Importante: objetos no Amazon S3 não são mais de propriedade automática da conta da AWS que os carrega. Por padrão, todos os buckets recém-criados têm agora a configuração Bucket owner enforced (Aplicada pelo proprietário do bucket) habilitada. Também é uma prática recomendada usar a configuração Bucket owner enforced (Aplicada pelo proprietário do bucket) ao alterar a propriedade do objeto. No entanto, observe que essa opção desabilita todas as ACLs e as ACLs de bucket em qualquer objeto do bucket.

Com a configuração Bucket owner enforced (Aplicada pelo proprietário do bucket) na propriedade do objeto do S3, todos os objetos de um bucket do Amazon S3 agora pertencem automaticamente ao proprietário do bucket. O recurso Bucket owner enforced (Aplicada pelo proprietário do bucket) também desabilita todas as listas de controle de acesso (ACLs), simplificando o gerenciamento de acesso para dados armazenados no S3. No entanto, para buckets existentes, um objeto do Amazon S3 ainda pertencerá à conta da AWS que o carregou, a menos que você desabilite explicitamente as ACLs. Para alterar a propriedade de objetos em um bucket existente, consulte Como alterar a propriedade de objetos de propriedade pública em meu bucket do S3?

Se o método existente de compartilhamento de objetos depender do uso de ACLs, identifique as entidades principais que usam ACLs para acessar objetos. Para obter mais informações sobre como revisar permissões antes de desabilitar qualquer ACL, consulte Pré-requisitos para desabilitar ACLs.

Se você não conseguir desativar suas ACLs, siga estas etapas para assumir a propriedade dos objetos até poder ajustar sua política de bucket:

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?