¿Cómo puedo copiar objetos de S3 desde otra cuenta de AWS?

Última actualización: 07/01/2022

Quiero copiar objetos de Amazon Simple Storage Service (Amazon S3) entre cuentas de AWS. Luego, quiero asegurarme de que la cuenta de destino sea la propietaria de los objetos copiados. ¿Cómo puedo hacer esto?

Resolución

Importante: Los objetos de Amazon S3 ya no pertenecen automáticamente a la cuenta de AWS que los carga. De forma predeterminada, todos los buckets recién creados ahora tienen habilitada la configuración aplicada por el propietario del bucket. También es una práctica recomendada utilizar la configuración aplicada por el propietario del bucket al cambiar la propiedad del objeto. Sin embargo, tenga en cuenta que esta opción desactiva todas las ACL y ACL de bucket en cualquier objeto de su bucket.

Con la configuración aplicada por el propietario del bucket en S3 Object Ownership, todos los objetos de un bucket de Amazon S3 son automáticamente propiedad del propietario del bucket. La característica aplicada por el propietario del bucket también desactiva todas las listas de control de acceso (ACL), lo que simplifica la administración del acceso a los datos almacenados en S3. Sin embargo, en el caso de los buckets existentes, los objetos de Amazon S3 aún son propiedad de la cuenta de AWS que los cargó, a menos que se desactiven explícitamente las ACL. Para cambiar la propiedad de los objetos en un bucket existente, consulte ¿Cómo se puede cambiar la propiedad de los objetos de propiedad pública en el bucket de S3?

Si su método actual para compartir objetos se basa en el uso de ACL, identifique las entidades principales que usan las ACL para acceder a los objetos. Para obtener más información sobre cómo revisar los permisos antes de desactivar cualquier ACL, consulte Requisitos previos para desactivar las ACL.

Si no puede desactivar las ACL, siga estos pasos para tomar posesión de los objetos hasta que pueda ajustar su política de bucket:

1.    En la cuenta fuente, cree una política administrada por el cliente de AWS Identity and Access Management (IAM) que otorgue los permisos adecuados a una identidad de IAM (usuario o rol). El usuario de IAM debe tener acceso para recuperar objetos del bucket fuente y devolverlos al bucket de destino. Puede utilizar una política de IAM similar a la siguiente:

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

Nota: Este ejemplo de política de IAM incluye solo los permisos mínimos requeridos para listar objetos y copiarlos entre buckets en diferentes cuentas. Debe personalizar las acciones de S3 permitidas según su caso de uso. Por ejemplo, si el usuario debe copiar objetos que tienen etiquetas de objeto, también debe conceder permisos para s3:GetObjectTagging. Si tiene un error, intente seguir estos pasos como usuario administrador.

2.    En la cuenta fuente, adjunte la política administrada por el cliente a la identidad de IAM que desea utilizar para copiar objetos en el bucket de destino.

3.    En la cuenta de destino, establezca la propiedad de los objetos de S3 en el bucket de destino como propietario del bucket preferente. Después de establecer la propiedad de los objetos de S3, los nuevos objetos cargados con la lista de control de acceso (ACL) establecida como bucket-owner-full-control son automáticamente propiedad de la cuenta del bucket.

4.    En la cuenta de destino, modifique la política de bucket del bucket de destino para conceder a la cuenta fuente permisos para cargar objetos. Además, incluya una condición en la política de bucket que requiera que las cargas de objetos establezcan la ACL en bucket-owner-full-control. Puede utilizar una afirmación similar a la siguiente:

Nota: Sustituya destination-DOC-EXAMPLE-BUCKET por el nombre del bucket de destino. A continuación, sustituya arn:aws:iam::222222222222:user/Jane por el nombre de recurso de Amazon (ARN) de la identidad de IAM de la cuenta fuente.

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

Nota: Este ejemplo de política de bucket incluye solo los permisos mínimos necesarios para cargar un objeto con la ACL requerida. Debe personalizar las acciones de S3 permitidas según su caso de uso. Por ejemplo, si el usuario debe copiar objetos que tienen etiquetas de objeto, también debe conceder permisos para s3:GetObjectTagging

5.    Después de configurar la política de IAM y la política de bucket, la identidad de IAM de la cuenta fuente debe cargar objetos en el bucket de destino. Asegúrese de que la ACL esté configurada como bucket-owner-full-control. Por ejemplo, la identidad IAM fuente debe ejecutar el comando cp AWS CLI con la opción --acl:

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

Nota: Si recibe errores al ejecutar comandos de AWS CLI, asegúrese de que utiliza la versión más reciente de AWS CLI.

Con la propiedad de los objetos de S3 establecida en propietario del bucket preferente, los objetos cargados con la ACL bucket-owner-full-control son automáticamente propiedad de la cuenta del bucket de destino.

Importante: Si su bucket de S3 tiene cifrado predeterminado con AWS Key Management Service (AWS KMS) habilitado, también debe modificar los permisos de la clave de AWS KMS. Para obtener instrucciones, consulte Mi bucket de Amazon S3 tiene un cifrado predeterminado que utiliza una clave de AWS KMS personalizada. ¿Cómo puedo permitir a los usuarios hacer cargas y descargas en el bucket?