POC Sync de bucket S3 en diferentes cuentas

POC Sync de bucket S3 en diferentes cuentas

El escenario es simple, tenemos 2 bucket que necesitamos mantener en sync pero en 2 cuentas de AWS diferentes, qué podemos hacer?

Siganme en esta historia de pruebas sobre el sync de bucket de S3 con la particularidad de que cada uno de ellos está en una cuenta de AWS diferente. (y si, vamos a necesitar policies que nos permitan hacer esto)

Escenario

  • Tenemos 2 cuentas de AWS

    • Cuenta A ORIGEN: AAAAAAAAAAAA
    • Cuenta B DESTINO: BBBBBBBBBBBB
  • Tenemos un bucket S3 en cada una de ellas.

  • Tenemos configurado en nuestro CLI el usuario de IAM de la cuenta B (destino)

Cuenta origen

Sobre el bucket de Origen

Debemos permitir que desde la otra cuenta puedan hacer GET y LIST de los objetos del bucket, para poder luego hacer el sync. Para esto debemos modificar la policy en el bucket.

En la parte de permisos del bucket, buscamos la sección bucket policy y editamos. image.png

Copiamos la siguiente policy Cambiando BBBBBBBBBBBB por la cuenta de destino, y el NOMBRE_BUCKET_ORIGEN por el nombre de nuestro bucket

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::BBBBBBBBBBBB:root"
            },
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetObjectTagging"
            ],
            "Resource": [
                "arn:aws:s3:::NOMBRE_BUCKET_ORIGEN/*",
                "arn:aws:s3:::NOMBRE_BUCKET_ORIGEN"
            ]
        }
    ]
}

Cuenta destino

Policy en usuario de destino

Nos vamos al usuario en la cuenta de destino y le agregamos una política que permita:

  • LIST y GET en el bucket de orignen
  • LIST y PUT en el bucket de destino
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::NOMBRE_BUCKET_ORIGEN",
                "arn:aws:s3:::NOMBRE_BUCKET_ORIGEN/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::NOMBRE_BUCKET_DESTINO",
                "arn:aws:s3:::NOMBRE_BUCKET_DESTINO/*"
            ]
        }
    ]
}

Sync

Por último, y teniendo la CLI configurada con el usuario de destino, ejecutamos el sync de los archivos

aws s3 sync s3://NOMBRE_BUCKET_ORIGEN s3://NOMBRE_BUCKET_DESTINO --source-region NOMBRE_REGION_ORIGEN --region NOMBRE_REGION_DESTINO

Con esta configuración podemos datos en tiempos super bajos ya que evitamos descargar en local para luego subir al otro bucket.

Espero que sea útil! Cualquier consulta dejanos un mensaje, y si te gusó compartilo para que aprendamos entre todos.