Inventario AWS S3
Tags: aws, s3, inventory, storage
Published: 2020-10-25 23:48:13

## AWS S3 Inventory

<p>En ocasiones cuando tenemos un repositorio de documentos con miles o millones de objetos, como por ejemplo AWS S3, Google Cloud Storage o Azure Blob Storage, es probable que perdamos la noción de todo lo que se tiene almacenado en ese repositorio.</p>

<p>Para ello, en el caso de AWS, se dispone de una funcionalidad llamada Inventory, la cual nos permite generar un listado de todos los archivos alojados en determinada ubicación y sobre ese listado incluir ciertos parámetros que nos permite obtener más información sobre lo que tenemos almacenado.</p>

<p>Este listado  de inventario de objetos (archivos) en el bucket S3 de Amazon, se puede generar por medio de esta funcionalidad <em>Inventory </em>(Inventario) la cual por defecto nos genera un archivo en formato CSV con la siguiente estructura:</p>

<pre><code>BucketName, KeyObject</code></pre>

<p>Para generar este listado, se ingresa al servicio de S3 en la consola de AWS, se selecciona el bucket donde se encuentras los objetos que queremos listar, luego se selecciona <em>Management</em> y luego <em>Inventory</em>:</p>


![image-1.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603487893090/4NuAeNRCS.png)

<p>Una vez ubicados en este punto, se puede elegir adicionar una nueva tarea de generación de listado de inventario de nuestros objetos:</p>

![image-13.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603488004961/Lm32koOke.png)

<p>Al seleccionar la opción de crear una nueva tarea de creación de inventario, la página nos solicita los siguientes campos:</p>

<ul><li><strong>Inventory name</strong>: Nombre de la tarea de inventario.</li><li><strong>Filters</strong>: Prefijo S3 desde donde se va a generar el listado de objetos (carpeta desde donde se requiere el listado de archivos).</li><li><strong>Destination Bucket</strong>: Nombre del bucket donde se quiere crear el listado.</li><li><strong>Destination Prefix</strong>: Prefijo donde se quiere crear el listado.</li><li><strong>Frequency</strong>: Frecuencia con la que se quiere generar el reporte (diaria o semanal).</li></ul>


![image-3.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603488068367/_ofP6Jx_h.png)

<p>En opciones avanzadas se puede seleccionar lo siguiente:</p>

<ul><li><strong>Output format</strong>: Formato de salida del listado. El formato puede ser: CSV, Apache ORC, Apache Parquet.</li><li><strong>Object versions</strong>: Seleccionar si quiere el listado solo con las versiones actuales del objeto o con todas las versiones (si se tiene habilitado el versioning).</li><li><strong>Optional fields</strong>: Campos adicionales que va a contener el reporte. Por defecto está: NombreBucket y KeyObject.</li><li><strong>Encryption</strong>: Método de encripción para el listado de objetos. Puede ser Ninguno, AES-256, AWS-KMS.</li></ul>


![image-4.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603488101510/MPYayAUlw.png)

<p>Una vez diligenciado todos los campos, se debe ver algo como lo siguiente:</p>


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

<p>Amazon advierte que el primer reporte de listado de objetos, podría tardar en generarse 48 horas, aunque, dependiendo de la cantidad de objetos que debe listar en el reporte, podría tomar mucho menos tiempo. Para este caso que solo se ha seleccionado generar la carpeta de un cliente (200 objetos), el reporte se generó en 24 horas.</p>


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

<p>Adicional, al crear la tarea de generación de reporte de inventario, Amazon automáticamente crea una política de Bucket para tener permisos de escritura sobre el bucket seleccionado para la entrega del listado.</p>


![image-7.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603488171067/F5AZrLl-F.png)

<pre >{
    "Sid": "S3PolicyStmt-DO-NOT-MODIFY-160xxxxxxxxxx",
    "Effect": "Allow",
    "Principal": {
        "Service": "s3.amazonaws.com"
    },
    "Action": [
        "s3:PutObject"
    ],
    "Resource": [
        "arn:aws:s3:::prueba-de-copiado-de-inventory-job/*"
    ],
    "Condition": {
        "ArnLike": {
            "aws:SourceArn": [
                "arn:aws:s3:::prueba-de-copiado-de-inventory-job"
            ]
        },
        "StringEquals": {
            "aws:SourceAccount": [
                "97xxxxxxxxx"
            ],
            "s3:x-amz-acl": "bucket-owner-full-control"
        }
    }
}</pre>

<p>Una vez transcurridas las primeras 24 horas a partir de que se crea la tarea de generación del listado de objetos, en el bucket se puede observar que se crea una carpeta donde se ubica el reporte:</p>


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

<p>Una vez ingresado en el prefijo donde se indicó que debía ubicar los reportes diarios, aparecerán 3 carpetas inicialmente. Para el caso de la imagen anterior, las carpetas adicionales nombradas por una fecha, corresponde a los días de generación del reporte, en este casi diario.</p>

<p>La primer carpeta con la <em>fecha de generación</em> del reporte, contiene el manifiesto de generación del reporte en formato .json. Este manifiesto alberga la metadata del archivo de inventario generado por AWS, que nos indica fecha de generación, ubicación del reporte, tamaño, extensión, etc.</p>


![image-10.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603488229122/w11wiKnOb.png)

<pre >{
  "sourceBucket" : "prueba-de-copiado-de-inventory-job",
  "destinationBucket" : "arn:aws:s3:::prueba-de-copiado-de-inventory-job",
  "version" : "2016-11-30",
  "creationTimestamp" : "1581379200000",
  "fileFormat" : "CSV",
  "fileSchema" : "Bucket, Key",
  "files" : [ {
    "key" : "prueba-de-copiado-de-inventory-job/data/6fbf1c72-aded-47ff-91e4-2448addfd5a5.csv.gz",
    "size" : 127,
    "MD5checksum" : "60aee2df4caf7f4b00a7375bc978d1c8"
  } ]
}</pre>

<p>La segunda carpeta, <em>data</em> contiene el archivo de reporte en formato CSV con todo el listado de los documentos ubicados en la ruta que se haya especificado para listar los objetos.</p>


![image-11.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1603488250875/R_eoJxIJR.png)

<p>La tercer carpeta, <em>hive</em> con un archivo de texto que contiene la URL completa de donde está ubicado el reporte en nuestro bucket.</p>


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

<p>Como se puede apreciar, la funcionalidad de AWS S3 Inventory nos permite generar un listado de todos los objetos y es de gran ayuda cuando tenemos millones de archivos en él. Adicional, estos listados son indispensables para automatizar procesos sobre estos objetos, como por ejemplo tareas de copiado de archivos entre buckets, cambiar el tipo de almacenamiento, cambiar la metadata o los tags de los objetos, entre otros. </p>

<p>Un dato adicional a tener en cuenta es que esta funcionalidad tiene un costo que oscila entre los $0,0025 USD y $0,0035 USD por millón de objetos enumerados, dependiendo de la región donde se realice la ejecución del inventario. También, los archivos resultantes como los manifiestos y la data (archivos CSV) almacenados en el bucket, deben incurrir en los costos asociados de solicitudes sobre el bucket de estos objetos y en el tamaño/tiempo de almacenamiento.</p>

<p>Toda esta configuración que hemos visto por medio de la consola web de AWS, se puede realizar a través de la herramienta de línea de comando AWS cli, usando el comando <code>put-bucket-inventory-configuration</code>. Para más detalle se puede revisar la documentación en su sitio web oficial <a rel="noreferrer noopener" href="https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-inventory-configuration.html" target="_blank">https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-inventory-configuration.html</a></p>

<p>De igual forma, se puede realizar por medio del AWS SDK disponible para todos los lenguajes de programación soportados por Amazon, el cual se puede ver mayor detalle en su documentación: <a rel="noreferrer noopener" href="https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html" target="_blank">https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html</a></p>


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

* [Redis - Instalación y Configuración](https://juanc4milo.dev/redis-instalacion-y-configuracion)
* [AWS S3 Batch Operations](https://juanc4milo.dev/aws-s3-batch-operations)
* [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)_