AWS S3 Batch Operations
Tags: aws, s3, batch, storage
Published: 2020-10-26 01:49:29

<h2 id="batch-ops-what-is">¿Qué es?</h2>

<p>Batch operations o en español, operaciones por lotes de S3, es una funcionalidad de AWS para realizar acciones por lotes a gran escala en objetos de Amazon S3. Se utiliza para copiar objetos, establecer etiquetas de objetos o listas de control de acceso (ACL), iniciar restauraciones de objetos desde Amazon S3 Glacier o invocar una función de AWS Lambda para realizar acciones personalizadas con los objetos.</p>

<h2 id="batch-ops-prerequisites">Prerequisitos</h2>

<p>Como prerequisito para el uso de esta funcionalidad, es necesario tener lo siguiente:</p>

<ul><li>Listado de los objetos en un archivo CSV o archivo manifiesto JSON generado por la funcionalidad <a href="https://juanc4milo.dev/inventario-aws-s3/">Inventario de AWS S3</a>.</li><li>Política de permisos en IAM.</li><li>Rol en IAM.</li></ul>

<h3 id="batch-ops-prerequisites-list-objects">Listado de los objetos</h3>

<p>Para realizar un trabajo por lotes con objetos de AWS S3, es necesario tener un archivo con el listado de todos los objetos que se requiere realizar alguna acción por lotes. Este listado se puede generar manualmente en formato CSV con la estructura: <code>NombreBucket, LlaveObjeto</code>. Sin embargo, esta tarea puede ser algo compleja, para ello Amazon dispone de una funcionalidad llamada Inventory (Inventario) que permite generar este archivo, el cual para su configuración y uso se puede revisar en la entrada: <a href="https://juanc4milo.dev/inventario-aws-s3/">Inventario AWS S3</a></p>

<h3 id="batch-ops-prerequisites-policy">Política de permisos en IAM</h3>

<p>Para la correcta ejecución de S3 Batch Operation, se debe de contar con una política de permisos que permite al servicio S3 ejecutar las acciones sobre los recursos de la cuenta. Para ello se debe crear una política que luego será asociada a un Rol de IAM.</p>

<p>Para ello se ingresa en IAM y se crea una política:</p>

![create-policy](https://dev-to-uploads.s3.amazonaws.com/i/wcbgbsppcgh3to9ph975.png)

<p>El JSON de la política debe describir los permisos sobre:</p>

<ul><li>Lectura de objetos que servirán de insumo para realizar las acciones por lote (bucket 1)</li><li>Escritura de objetos hacia donde se va dirigida la acción por lote (bucket 2)</li><li>Escritura de objetos donde será ubicado el reporte de generación de resultado de la tarea por lote.</li></ul>

<p>Ejemplo:</p>

<pre>{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::bucket-2/*"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::bucket-1/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-1/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-1/*"
            ]
        }
    ]
}
</pre>

<p>Luego se revisa que la política este bien creada, se le asigna un nombre y una descripción:</p>

![policy-name-description](https://dev-to-uploads.s3.amazonaws.com/i/jf3uzblwb9hfmk9i67rf.png)

<p>Una vez creada la política de permisos se debe ver en el listado de políticas de la cuenta:</p>

![policies-list](https://dev-to-uploads.s3.amazonaws.com/i/lmt38itj2cumt6yzp5vq.png)

<h3 id="batch-ops-prerequisites-role">Configuración Rol en IAM</h3>

<p>Para la correcta ejecución de S3 Batch Operation, se debe de contar con un rol que permite al servicio S3 ejecutar las acciones sobre los recursos de la cuenta según las políticas que tenga asociado el rol.</p>

<p>Para ello se ingresa en IAM y se crea un rol:</p>


![image-5.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513400985/BLrkd_ZFu.png)

<p>Se selecciona que el rol será creado para que <strong>S3 Batch Operation</strong> pueda ejecutar acciones sobre la cuenta:</p>


![image-6.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513417345/w2DvHDA_q.png)

<p>Luego se asocia la política de permisos previamente creada:</p>


![image-7.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513430760/2DYsrNga1.png)

<p>Luego se adicionan los tags al rol:</p>


![image-8.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513447101/ePRyTEC98.png)

<p>Finalmente se verifica que este bien creado el rol, se le asigna un nombre y una descripción:</p>


![image-9.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513460287/N_TDW4RtF.png)

<p>Una vez creado el rol se verifica que este contenga la relación de confianza con S3 Batch Operations:</p>


![image-10.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513473283/ci0-5Gv3P.png)


![image-11.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513487745/0GufARKuz.png)

<h2 id="batch-ops-conf">Configuración de S3 Batch Operation</h2>

<p>Ingresar a Amazon S3 y en el menú seleccionar Batch Operations:</p>


![image-12.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513503900/sh0NMTlfj.png)

<p>Luego Crear Job:</p>


![image-13.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513520855/7WpHRQ0aQ.png)

<p>La creación del job se compone de 4 pasos:</p>

<ol type="1"><li>Escoger la región y el archivo manifiesto con el listado de objetos.</li><li>Escoger la operación por lote a realizar.</li><li>Configuraciones adicionales.</li><li>Verificación.</li></ol>

<p>Se escoge la región donde se quiere crear el job. Para todas las operaciones, excepto para la de copia, se debe escoger la misma región donde se encuentran almacenados los objetos del listado. Para la operación de copia el Job se debe crear en la misma región donde se encuentra el bucket destino.</p>


![image-14.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513542949/qnIzmMt5k.png)

<p>Luego se debe elegir el manifiesto (JSON) donde se referencia el listado de los objetos, este manifiesto es un archivo que se genera con el reporte de la funcionalidad <em><a href="https://juanc4milo.dev/inventario-aws-s3/">Inventario de AWS S3</a></em>. También se puede seleccionar un archivo en formato CSV, que debe tener la estructura <code>BucketName, ObjectKey</code>:</p>


![image-16.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513592245/cfuHu7i57.png)

<p>Luego se selecciona la operación que se quiere ejecutar en el job. Para este caso del ejemplo, la idea es copiar los archivos entre 2 buckets, para ello, se selecciona “Copia”:</p>


![image-17.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513608207/jGFaUlwE1.png)

<p>Como se ha elegido copia, saldrán las opciones de configuración para llevar a cabo esta tarea. Se solicita indicar el bucket destino donde serán copiados los objetos. AWS advierte que si no se tiene habilitado el <em>Versioning </em>en el bucket destino, si llega a encontrar un objeto similar durante la copia, este será sobreescrito.</p>


![image-18.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513622457/rTNBiSz4m.png)

<p>Luego se debe seleccionar el tipo de almacenamiento que serán copiado los archivos en el bucket destino.</p>


![image-19.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513635115/wOymQ20Fl.png)

<p>Luego se debe indicar si los datos se deben proteger con encripción en reposo usando SSE-S3 o AWS KMS:</p>


![image-20.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513647864/aiuHmW9zP.png)

<p>Luego se debe indicar qué se debe hacer con los tags de los objetos durante la copia:</p>

<ul><li>Copiar los mismos tags existentes de cada objeto.</li><li>Reemplazar todos los tags por otros.</li><li>No copiar ningún tag.</li></ul>


![image-21.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513662586/O2b0uXlRq.png)

<p>Luego se debe indicar qué se debe hacer con la metadata de los objetos durante la copia:</p>

<ul><li>Copiar la misma metadata existente de cada objeto.</li><li>Reemplazar toda la metadata con otros valores.</li><li>No copiar ningún valor de metadata.</li></ul>


![image-22.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513676718/Boy0Azl_z.png)

<p>Luego se debe seleccionar los permisos de la lista de control de acceso para cada objeto (permiso de los objetos):</p>


![image-23.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513689773/InrzayUow.png)

<p>Luego se debe asignar una descripción (nombre) al job y una prioridad (en números):</p>


![image-24.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513703421/M8eHagfKk.png)

<p>Luego se debe indicar si se requiere que el Job genere un reporte con el estado de la ejecución de las operaciones por cada uno de los objetos. En caso que si se quiera la generación del reporte, se debe indicar el bucket donde será almacenado el archivo.</p>


![image-25.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513715473/PfOsSgND5.png)

<p>Luego se deben asignar los permisos para el Job. Para ello se debe seleccionar el IAM Rol creado previamente que contiene la política de permisos sobre los recursos que va a usar S3 Batch Operations.</p>


![image-26.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513729189/wnk5T6ERv.png)

<p>Finalmente se verifica todas las configuraciones realizadas anteriormente para revisar que todo esté en orden y al final se da click sobre Crear Job.</p>

<p>Una vez creado el Job, Amazon advierte que va a verificar el manifiesto (o archivo CSV) que contiene el listado de objetos al que se le va a aplicar las operaciones por lotes. Si todo se encuentra en orden, pasa el estado del Job de “<em>Nuevo</em>” a “<em>En espera por ejecución</em>”.</p>


![image-27.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513746133/Dic2F555D.png)

<p>Amazon entrega un ID para el Job creado e indica que los Jobs se borran automáticamente luego de 90 días así se hayan terminado OK o en ERROR.</p>


![image-28.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513758584/6j2PKWUgr.png)


![image-29.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513768934/mai4jva7k.png)

<p>Una vez que Amazon haya terminado de verificar el Job, lo pasa al estado “<em>Pendiente por ejecución</em>” y es aquí donde se puede seleccinar el Job y dar click en “<em>Ejecutar</em>” (Run):</p>


![image-30.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513782555/SiqYcB64T.png)

<p>Cuando se da click en <em>Run Job</em>, muestra nuevamente toda la configuración del job para estar seguros de lo que se va a ejecutar. Al final aparece el botón Run Job para iniciar con la ejecución de la tarea:</p>


![image-31.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513794706/2NDuKP55b.png)

<p>Una vez completado, lo pasa a un estado “<em>Completado</em>”, indicando el 100% de la tarea completada y el % de errores (si los hubiese).</p>


![image-32.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603513807769/2dz88Zdvd.png)

<h2 id="batch-ops-pricing">Costos</h2>

<p>En cuanto a costo por usar esta funcionalidad, están las siguientes cifras:</p>

<ul><li><strong>Por cada job</strong> que se cree en S3 Batch Operation incurrirá en un costo de $0,25 USD.</li><li><strong>Por cada millón de operaciones</strong> realizada sobre los objetos incurre en un costo de $1,00 USD.</li></ul>

<p>Esto quiere decir, que es muy importante definir bien la creación del job, debido a que durante el proceso de su creación si hemos cometido algún error (falta de permisos en el rol, falta de permisos en las políticas, elección de un inventario de objetos que no corresponde, etc.), nos cobran igualmente por crear un job que esté errado en su ejecución.</p>

<p>Por otra parte, se nota el gran beneficio el usar esta funcionalidad, ya que por realizar por ejemplo un copiado de 1 millón de archivos entre 2 buckets, solo nos cobra $1 USD.</p>

### Otros artículos que te podrían interesar...

* [Redis - Instalación y Configuración](https://juanc4milo.dev/redis-instalacion-y-configuracion)
* [AWS S3 Inventory](https://juanc4milo.dev/inventario-aws-s3)
* [Qué ofrece y cómo se configura AWS Elasticache?](https://juanc4milo.dev/aws-elasticache)
* [Qué ofrece y cómo se configura Elasticache en AWS?](https://juanc4milo.dev/aws-elasticache)
*  [How to use Redis with Spring in Java](https://juanc4milo.dev/redis-with-spring-in-java)

**Do you like it?** You can [buy me a beer](https://buymeacoffee.com/juanc4milo) if you want.

> _Originally published at [juanc4milo.dev](https://juanc4milo.dev)_