AWS-S3-Copiar Buckets entre cuentas

En este post, te mostraré cómo copiar objetos de S3 de una cuenta de AWS a otra incluso en diferentes regiones de manera sencilla, como se caracteriza TomoNota 😉

Para el que no conozca S3: Amazon Simple Storage Service (es de donde viene S3) es un servicio de almacenamiento de objetos que ofrece escalabilidad, disponibilidad de datos, seguridad y rendimiento. Es ideal para una amplia variedad de casos de uso, incluyendo sitios web, aplicaciones móviles, respaldo y restauración, archivado, aplicaciones empresariales, dispositivos IoT y análisis de big data, entre otros.

Para hacer la copia entre cuentas usaremos Cloudformation (un servicio de AWS que permite la creación y gestión de recursos a través de plantillas), y Python para llevar a cabo la copia entre cuentas.

Primero, ¿por qué plantillas? Porque una vez que eliminamos las plantillas, ¡también se eliminan los permisos asociados! Esto resulta en un proceso mucho más limpio y eficiente. Si estás interesado en profundizar sobre CloudFormation, te recomiendo visitar el post dedicado a este tema.

Pasos a seguir:

  • Crear la plantilla para la “Cuenta Origen” y para ello necesitaremos la ID de la “Cuenta Destino”.
  • Crear la plantilla para la “Cuenta Destino” y para ello necesitaremos la ID de la “Cuenta Origen”.
  • Copiar los archivos con un script de python.

Empecemos!

Plantilla Origen:
Necesitarás la ID de la “Cuenta Destino”. Aquí tienes un ejemplo de cómo crear una plantilla para la cuenta origen que configura las políticas del bucket para permitir el acceso a una cuenta específica:

AWSTemplateFormatVersion: '2010-09-09'
Description: Crear politicas de bucket para permitir acceso a una cuenta especifica.

Resources:
  BucketPolicy1:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: nombre-bucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              AWS: "arn:aws:iam::IDCuentaDESTINO:root"
            Action:
              - "s3:GetObject"
              - "s3:ListBucket"
            Resource:
              - "arn:aws:s3:::nombre-bucket/*"
              - "arn:aws:s3:::nombre-bucket"

Descripción:
Esta plantilla proporciona los permisos necesarios para listar y copiar archivos desde el bucket de origen. Puedes especificar rutas o archivos concretos según necesites. Para aplicar permisos a varios buckets, duplica BucketPolicy1 como BucketPolicy2, BucketPolicy3, etc., según lo necesites.

Plantilla Destino:
Aquí tienes un ejemplo para la cuenta destino, que básicamente invierte los roles de las cuentas en la plantilla anterior:

AWSTemplateFormatVersion: '2010-09-09'
Description: Crear politicas de bucket para permitir acceso a una cuenta especifica.

Resources:
  BucketPolicy1:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: nombre-bucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              AWS: "arn:aws:iam::IDCuentaORIGEN:root"
            Action:
              - "s3:PutObject"
              - "s3:GetObjectAcl"
            Resource:
              - "arn:aws:s3:::nombre-bucket/*"
              - "arn:aws:s3:::nombre-bucket

Descripción:
Esta plantilla da los permisos necesarios al bucket de destino que permite listar y copiar los archivos nuevos.

Script python para copiar:
El siguiente script Python utiliza la librería Boto3 para interactuar con AWS S3 y copiar objetos de un bucket a otro. Es importante configurar adecuadamente las sesiones para cada cuenta y especificar las regiones correspondientes.

def copiar_objetos(bucket_origen, region_origen, 
                   bucket_destino, region_destino, prefijo=""):
    import boto3
    from decouple import config

    cuentaOrigen = 'IDcuentaORIGEN'
    cuentaDestino = 'IDcuentaDESTINO'

    # Configuración de la sesión y cliente S3 para la cuenta de origen
    session_origen = boto3.Session(region_name=region_origen, profile_name=cuentaOrigen)
    s3 = session_origen.client('s3')


    # Configuración de la sesión y cliente S3 para la cuenta de destino

    session_destino = boto3.Session(region_name=region_destino, profile_name=cuentaDestino)
    s3_dest = session_destino.client('s3')

    # Listar y copiar
    paginator = s3.get_paginator('list_objects_v2')
    for page in paginator.paginate(Bucket=bucket_origen, Prefix=prefijo):
        for obj in page.get('Contents', []):
            copy_source = {'Bucket': bucket_origen, 'Key': obj['Key']}
            s3_dest.copy(copy_source, bucket_destino, obj['Key'])

Descripción:
Este código esta preparado para copiar los archivos, tenéis que adaptarlo adjuntando los datos necesarios
*Antes de ejecutar este script, asegúrate de tener configuradas las credenciales de AWS CLI para ambas cuentas. Si no sabes como puedes pasar por el post aws cli – Boto3 y credenciales

Os dejo el link de la repo GitHub aquí
*Dale una estrella para seguir actualizando la repo.

Y esto es todo amigos. Espero que os sea de ayuda!
Para mantener la web y seguir compartiendo conocimiento, considera invitarme a un café. Siempre se alegra uno 😉

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *