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
Para usar Athena para consultar los archivos de Inventario de Amazon S3
-
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.
-
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
por el nombre de la tabla de Athena que ha creado.your_table_name
-
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
de2022-01-01-00-00
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
por el nombre de la tabla de Athena que ha creado.your_table_name
-
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
de2022-01-01-00-00
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" ); -
-
-
Ahora puede realizar varias consultas en su inventario, como se muestra en los siguientes ejemplos. Reemplace cada
por su propia información.user input placeholder
# 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(*) FROMyour_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(*) FROMyour_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.