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 *

Warning: Undefined array key "rerror" in /volume1/web/WebTomoNota/wp-content/plugins/wp-recaptcha-bp/recaptcha.php on line 300 Call Stack: 0.0001 360792 1. {main}() /volume1/web/WebTomoNota/index.php:0 0.0001 361104 2. require('/volume1/web/WebTomoNota/wp-blog-header.php') /volume1/web/WebTomoNota/index.php:17 0.5067 14464744 3. require_once('/volume1/web/WebTomoNota/wp-includes/template-loader.php') /volume1/web/WebTomoNota/wp-blog-header.php:19 0.5159 14633136 4. include('/volume1/web/WebTomoNota/wp-content/themes/yuki/index.php') /volume1/web/WebTomoNota/wp-includes/template-loader.php:106 2.9019 19011568 5. yuki_do_elementor_location($elementor_location = 'single', $template_part = 'template-parts/special', $name = 'single') /volume1/web/WebTomoNota/wp-content/themes/yuki/index.php:20 2.9019 19011568 6. get_template_part($slug = 'template-parts/special', $name = 'single', $args = ???) /volume1/web/WebTomoNota/wp-content/themes/yuki/inc/helpers.php:34 2.9019 19012144 7. locate_template($template_names = [0 => 'template-parts/special-single.php', 1 => 'template-parts/special.php'], $load = TRUE, $load_once = FALSE, $args = []) /volume1/web/WebTomoNota/wp-includes/general-template.php:206 2.9019 19012256 8. load_template($_template_file = '/volume1/web/WebTomoNota/wp-content/themes/yuki/template-parts/special-single.php', $load_once = FALSE, $args = []) /volume1/web/WebTomoNota/wp-includes/template.php:745 2.9022 19018368 9. require('/volume1/web/WebTomoNota/wp-content/themes/yuki/template-parts/special-single.php') /volume1/web/WebTomoNota/wp-includes/template.php:812 2.9356 19025024 10. do_action($hook_name = 'yuki_action_after_single_post') /volume1/web/WebTomoNota/wp-content/themes/yuki/template-parts/special-single.php:58 2.9356 19025400 11. WP_Hook->do_action($args = [0 => '']) /volume1/web/WebTomoNota/wp-includes/plugin.php:517 2.9356 19025400 12. WP_Hook->apply_filters($value = '', $args = [0 => '']) /volume1/web/WebTomoNota/wp-includes/class-wp-hook.php:348 3.0323 19131216 13. yuki_show_post_comments('') /volume1/web/WebTomoNota/wp-includes/class-wp-hook.php:324 3.0325 19131216 14. comments_template($file = ???, $separate_comments = ???) /volume1/web/WebTomoNota/wp-content/themes/yuki/inc/template-functions.php:354 3.0347 19146888 15. require('/volume1/web/WebTomoNota/wp-content/themes/yuki/comments.php') /volume1/web/WebTomoNota/wp-includes/comment-template.php:1631 3.0347 19146888 16. comment_form($args = ['class_form' => 'comment-form yuki-form form-default'], $post = ???) /volume1/web/WebTomoNota/wp-content/themes/yuki/comments.php:66 3.0442 19158608 17. do_action($hook_name = 'comment_form', ...$arg = variadic(1385)) /volume1/web/WebTomoNota/wp-includes/comment-template.php:2896 3.0442 19158984 18. WP_Hook->do_action($args = [0 => 1385]) /volume1/web/WebTomoNota/wp-includes/plugin.php:517 3.0442 19158984 19. WP_Hook->apply_filters($value = '', $args = [0 => 1385]) /volume1/web/WebTomoNota/wp-includes/class-wp-hook.php:348 3.0444 19159736 20. ReCAPTCHAPlugin->show_recaptcha_in_comments(1385) /volume1/web/WebTomoNota/wp-includes/class-wp-hook.php:324