Esecuzione di query sull'inventario Amazon S3 con Amazon Athena - Amazon Simple Storage Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Esecuzione di query sull'inventario Amazon S3 con Amazon Athena

Puoi eseguire una query sui file di Inventario Amazon S3 con query SQL standard utilizzando Amazon Athena in tutte le regioni in cui Athena è disponibile. Per verificare la disponibilità delle Regione AWS, consulta la Tabella delle Regione AWS.

Athena può eseguire query sui file di Inventario Amazon S3 in formato ORC (optimized row columnar) ApacheApache Parquet o in formato CSV. Quando si utilizza Athena per eseguire query sui file dell'inventario, è consigliabile utilizzare file di inventario in formato ORC o Parquet. I formati ORC e Parquet consentono di eseguire query più rapidamente e a costi inferiori. ORC e Parquet sono formati di file a colonne autodescrittivi orientati ai tipi progettati per Apache Hadoop. Il formato colonnare permette al lettore di leggere, decomprimere ed elaborare solo le colonne necessarie per la query in corso. I formati ORC e Parquet per Inventario Amazon S3 sono disponibili in tutte le Regioni AWS.

Come utilizzare Athena per eseguire query sui file di Inventario Amazon S3
  1. Creare una tabella Athena. Per informazioni sulla creazione di una tabella, consultare Creazione di tabelle in Amazon Athena nella Guida per l'utente di Amazon Athena.

  2. Crea la query utilizzando uno dei seguenti modelli di query di esempio, a seconda che esegui la query su un report di inventario in formato ORC, Parquet o CSV.

    • Quando utilizzi Athena per eseguire query su un report di inventario in formato ORC, utilizza la seguente query di esempio come un modello.

      La seguente query di esempio comprende tutti i campi opzionali in un report di inventario in formato ORC.

      Per utilizzare questa query di esempio, effettua le seguenti operazioni:

      • Sostituisci your_table_name con il nome della tabella Athena creata.

      • Rimuovi gli eventuali campi opzionali che non hai scelto per l'inventario in modo che la query corrisponda ai campi scelti.

      • Sostituisci il nome del bucket e la posizione dell'inventario seguenti (l'ID configurazione) come appropriato in base alla configurazione.

        s3://DOC-EXAMPLE-BUCKET/config-ID/hive/

      • Sostituisci la data 2022-01-01-00-00 in projection.dt.range con il primo giorno dell'intervallo di tempo entro il quale esegui la partizione dei dati in Athena. Per ulteriori informazioni, consulta Partizionamento dei dati in 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" );
    • Quando utilizzi Athena per eseguire query su un report di inventario in formato Parquet, utilizza la seguente query di esempio come un report in formato OCR. Tuttavia, utilizza il seguente Parquet SerDe al posto dell'ORC SerDe nell'istruzione ROW FORMAT SERDE.

      ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    • Quando utilizzi Athena per eseguire query su un report di inventario in formato CSV, utilizza la seguente query di esempio come un modello.

      La seguente query di esempio comprende tutti i campi opzionali in un report di inventario in formato CSV.

      Per utilizzare questa query di esempio, effettua le seguenti operazioni:

      • Sostituisci your_table_name con il nome della tabella Athena creata.

      • Rimuovi gli eventuali campi opzionali che non hai scelto per l'inventario in modo che la query corrisponda ai campi scelti.

      • Sostituisci il nome del bucket e la posizione dell'inventario seguenti (l'ID configurazione) come appropriato in base alla configurazione.

        s3://DOC-EXAMPLE-BUCKET/config-ID/hive/

      • Sostituisci la data 2022-01-01-00-00 in projection.dt.range con il primo giorno dell'intervallo di tempo entro il quale esegui la partizione dei dati in Athena. Per ulteriori informazioni, consulta Partizionamento dei dati in 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. Ora puoi eseguire diverse query sull'inventario, come illustrato negli esempi seguenti. Sostituisci ogni user input placeholder con le tue informazioni.

    # 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;

    Quando configuri S3 Inventory per aggiungere il campo Elenco di controllo di accesso dell'oggetto (ACL) a un report di inventario, il report visualizza il valore per il campo ACL oggetto come una stringa con codifica base64. Per ottenere il valore decodificato in JSON per il campo ACL oggetto, puoi eseguire una query su questo campo utilizzando Athena. Fare riferimento agli esempi di query riportati di seguito. Per ulteriori informazioni sul campo ACL oggetto, consulta Utilizzo del campo ACL oggetto.

    # 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;

Per ulteriori informazioni sull'utilizzo di Athena, consulta la Guida per l'utente di Amazon Athena.