Consulta de Amazon S3 Inventory con Amazon Athena - Amazon Simple Storage Service

Consulta de Amazon S3 Inventory con Amazon Athena

Puede consultar archivos del Inventario de Amazon S3 con consultas SQL estándar utilizando Amazon Athena en todas las regiones donde Athena está disponible. Para verificar la disponibilidad de la Región de AWS, consulte la Tabla de Región de AWS.

Athena puede consultar los archivos de Inventario de Amazon S3 en el formato Optimized Row Columnar (ORC) de Apache, Apache Parquet o en el formato de valores separados por comas (CSV). Cuando se utiliza Athena para consultar archivos del inventario, es recomendable que se usen archivos de inventario con formato ORC o Parquet. Los formatos ORC y Parquet proporcionan mayor velocidad y menores costes de las consultas. ORC y Parquet son formatos de archivo ordenados en columnas autodescriptivos y con reconocimiento de tipos diseñados para Apache Hadoop. El formato en columnas permite al lector leer, descomprimir y procesar solo las columnas necesarias para la consulta actual. Los formatos ORC y Parquet del Inventario de Amazon S3 están disponibles en todas las Regiones de AWS.

Para usar Athena para consultar los archivos de Inventario de Amazon S3
  1. Crear una tabla de Athena. Para obtener información sobre cómo crear una tabla, consulte Creación de tablas en Amazon Athena en la guía del usuario de Amazon Athena.

  2. Cree su consulta mediante una de las siguientes plantillas de consulta de ejemplo, en función de si está consultando un informe de inventario con formato ORC, Parquet o CSV.

    • Si utiliza Athena para consultar un informe de inventario con formato ORC, use la siguiente consulta de ejemplo como plantilla.

      La siguiente consulta de ejemplo incluye todos los campos opcionales del informe de inventario en formato ORC.

      Para utilizar esta consulta de ejemplo, haga lo siguiente:

      • Sustituya your_table_name por el nombre de la tabla de Athena que ha creado.

      • Elimine todos los campos opcionales que no haya seleccionado para su inventario para que la consulta se corresponda con los campos seleccionados para su inventario.

      • Reemplace el siguiente nombre de bucket y la ubicación de inventario (el ID de configuración) según corresponda a su configuración.

        s3://amzn-s3-demo-bucket/config-ID/hive/

      • Sustituya la fecha 2022-01-01-00-00 de projection.dt.range por el primer día del intervalo de tiempo dentro del cual va a particionar los datos en Athena. Para obtener más información, consulte Partitioning data in Athena (Particiones de datos en Athena).

      CREATE EXTERNAL TABLE your_table_name( bucket string, key string, version_id string, is_latest boolean, is_delete_marker boolean, size bigint, last_modified_date timestamp, e_tag string, storage_class string, is_multipart_uploaded boolean, replication_status string, encryption_status string, object_lock_retain_until_date bigint, object_lock_mode string, object_lock_legal_hold_status string, intelligent_tiering_access_tier string, bucket_key_status string, checksum_algorithm string, object_access_control_list string, object_owner string ) PARTITIONED BY ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://source-bucket/config-ID/hive/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.dt.type" = "date", "projection.dt.format" = "yyyy-MM-dd-HH-mm", "projection.dt.range" = "2022-01-01-00-00,NOW", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "HOURS" );
    • Si utiliza Athena para consultar un informe de inventario con formato Parquet, use la siguiente consulta de ejemplo para un informe con formato ORC. Sin embargo, utilice el siguiente SerDe de Parquet en lugar del SerDe de ORC en la instrucción de ROW FORMAT SERDE.

      ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    • Si utiliza Athena para consultar un informe de inventario con formato CRV, use la siguiente consulta de ejemplo como plantilla.

      La siguiente consulta de ejemplo incluye todos los campos opcionales del informe de inventario en formato CSV.

      Para utilizar esta consulta de ejemplo, haga lo siguiente:

      • Sustituya your_table_name por el nombre de la tabla de Athena que ha creado.

      • Elimine todos los campos opcionales que no haya seleccionado para su inventario para que la consulta se corresponda con los campos seleccionados para su inventario.

      • Reemplace el siguiente nombre de bucket y la ubicación de inventario (el ID de configuración) según corresponda a su configuración.

        s3://amzn-s3-demo-bucket/config-ID/hive/

      • Sustituya la fecha 2022-01-01-00-00 de projection.dt.range por el primer día del intervalo de tiempo dentro del cual va a particionar los datos en Athena. Para obtener más información, consulte Partitioning data in Athena (Particiones de datos en Athena).

      CREATE EXTERNAL TABLE your_table_name( bucket string, key string, version_id string, is_latest boolean, is_delete_marker boolean, size string, last_modified_date string, e_tag string, storage_class string, is_multipart_uploaded boolean, replication_status string, encryption_status string, object_lock_retain_until_date string, object_lock_mode string, object_lock_legal_hold_status string, intelligent_tiering_access_tier string, bucket_key_status string, checksum_algorithm string, object_access_control_list string, object_owner string ) PARTITIONED BY ( dt string ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 's3://source-bucket/config-ID/hive/' TBLPROPERTIES ( "projection.enabled" = "true", "projection.dt.type" = "date", "projection.dt.format" = "yyyy-MM-dd-HH-mm", "projection.dt.range" = "2022-01-01-00-00,NOW", "projection.dt.interval" = "1", "projection.dt.interval.unit" = "HOURS" );
  3. Ahora puede realizar varias consultas en su inventario, como se muestra en los siguientes ejemplos. Reemplace cada user input placeholder por su propia información.

    # Get a list of the latest inventory report dates available. SELECT DISTINCT dt FROM your_table_name ORDER BY 1 DESC limit 10; # Get the encryption status for a provided report date. SELECT encryption_status, count(*) FROM your_table_name WHERE dt = 'YYYY-MM-DD-HH-MM' GROUP BY encryption_status; # Get the encryption status for inventory report dates in the provided range. SELECT dt, encryption_status, count(*) FROM your_table_name WHERE dt > 'YYYY-MM-DD-HH-MM' AND dt < 'YYYY-MM-DD-HH-MM' GROUP BY dt, encryption_status;

    Al configurar el inventario de S3 para añadir el campo de la lista de control de acceso del objeto (ACL de objeto) a un informe de inventario, el informe muestra el valor del campo ACL del objeto como una cadena codificada en base64. Para obtener el valor descodificado en JSON para el campo ACL del objeto, puede consultar este campo en Athena. Vea los siguientes ejemplos de consultas. Para obtener más información acerca del campo ACL del objeto, consulte Uso del campo de objeto de ACL.

    # Get the S3 keys that have Object ACL grants with public access. WITH grants AS ( SELECT key, CAST( json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR)) ) AS grants_array FROM your_table_name ) SELECT key, grants_array, grant FROM grants, UNNEST(grants_array) AS t(grant) WHERE element_at(grant, 'uri') = 'http://acs.amazonaws.com/groups/global/AllUsers'
    # Get the S3 keys that have Object ACL grantees in addition to the object owner. WITH grants AS (SELECT key, from_utf8(from_base64(object_access_control_list)) AS object_access_control_list, object_owner, CAST(json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR))) AS grants_array FROM your_table_name) SELECT key, grant, objectowner FROM grants, UNNEST(grants_array) AS t(grant) WHERE cardinality(grants_array) > 1 AND element_at(grant, 'canonicalId') != object_owner;
    # Get the S3 keys with READ permission that is granted in the Object ACL. WITH grants AS ( SELECT key, CAST( json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR)) ) AS grants_array FROM your_table_name ) SELECT key, grants_array, grant FROM grants, UNNEST(grants_array) AS t(grant) WHERE element_at(grant, 'permission') = 'READ';
    # Get the S3 keys that have Object ACL grants to a specific canonical user ID. WITH grants AS ( SELECT key, CAST( json_extract(from_utf8(from_base64(object_access_control_list)), '$.grants') AS ARRAY(MAP(VARCHAR, VARCHAR)) ) AS grants_array FROM your_table_name ) SELECT key, grants_array, grant FROM grants, UNNEST(grants_array) AS t(grant) WHERE element_at(grant, 'canonicalId') = 'user-canonical-id';
    # Get the number of grantees on the Object ACL. SELECT key, object_access_control_list, json_array_length(json_extract(object_access_control_list,'$.grants')) AS grants_count FROM your_table_name;

Para obtener más información sobre el uso de Athena, consulte la Guía del usuario de Amazon Athena.