Interrogation d'un inventaire Amazon S3 avec Amazon Athena - Amazon Simple Storage Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interrogation d'un inventaire Amazon S3 avec Amazon Athena

Vous pouvez interroger les fichiers de l'inventaire Amazon S3 en utilisant des requêtes SQL standard à l'aide d'Amazon Athena dans toutes les Régions où Athena est disponible. Pour vérifier la disponibilité de la Région AWS, veuillez consulter la Table Région AWS.

Athena peut interroger les fichiers d'inventaire Amazon S3 dans des colonnes de ligne optimisées (ORC) ApacheApache Parquet ou au format CSV (valeurs séparées par des virgules). Lorsque vous utilisez Athena pour interroger les fichiers d'inventaire, nous vous recommandons d'utiliser des fichiers d'inventaire au format ORC ou Parquet. Les formats ORC et Parquet offrent des performances de requête plus rapides et des coûts de requête réduits. Les formats ORC et Parquet sont des formats auto-descriptifs en colonnes avec prise en charge du type, conçus pour Apache Hadoop. Le format en colonnes permet de lire, décompresser et traiter uniquement les colonnes nécessaires pour traiter la requête actuelle. Les formats ORC et Parquet pour l'inventaire Amazon S3 sont disponibles dans toutes les Régions AWS.

Pour utiliser Athena pour interroger les fichiers d'inventaire Amazon S3
  1. Créez une table Athéna. Pour de plus amples informations sur la création d'une table, veuillez consulter Création de tables dans Athena dans le Guide de l'utilisateur Amazon Athena.

  2. Créez votre requête à l'aide de l'un des exemples de modèles de requête suivants, selon que vous interrogez un rapport d'inventaire au format ORC, Parquet ou CSV.

    • Lorsque vous utilisez Athena pour interroger un rapport d'inventaire au format CSV, utilisez l'exemple de requête suivant en tant que modèle.

      L'exemple de requête suivant comprend tous les champs facultatifs dans le rapport d'inventaire au format ORC.

      Pour utiliser cet exemple de requête, procédez comme suit :

      • Remplacez your_table_name par le nom de la table Athena que vous avez créée.

      • Supprimez les champs facultatifs que vous n'avez pas choisis pour votre inventaire afin que la requête corresponde aux champs sélectionnés pour celui-ci.

      • Remplacez le nom de compartiment et l'emplacement d'inventaire (l'ID de configuration) suivants en fonction de votre configuration.

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

      • Remplacez la date 2022-01-01-00-00 sous projection.dt.range par le premier jour de la plage horaire au cours de laquelle vous partitionnez les données dans Athena. Pour plus d'informations, consultez Partitionnement de données dans 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" );
    • Lorsque vous utilisez Athena pour interroger un rapport d'inventaire au format Parquet, utilisez l'exemple de requête pour un rapport au format ORC. Toutefois, utilisez le SerDe Parquet suivant à la place du SerDe ORC dans la déclaration ROW FORMAT SERDE.

      ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    • Lorsque vous utilisez Athena pour interroger un rapport d'inventaire au format CSV, utilisez l'exemple de requête suivant en tant que modèle.

      L'exemple de requête suivant comprend tous les champs facultatifs dans le rapport d'inventaire au format CSV.

      Pour utiliser cet exemple de requête, procédez comme suit :

      • Remplacez your_table_name par le nom de la table Athena que vous avez créée.

      • Supprimez les champs facultatifs que vous n'avez pas choisis pour votre inventaire afin que la requête corresponde aux champs sélectionnés pour celui-ci.

      • Remplacez le nom de compartiment et l'emplacement d'inventaire (l'ID de configuration) suivants en fonction de votre configuration.

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

      • Remplacez la date 2022-01-01-00-00 sous projection.dt.range par le premier jour de la plage horaire au cours de laquelle vous partitionnez les données dans Athena. Pour plus d'informations, consultez Partitionnement de données dans 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. Vous pouvez désormais exécuter différentes requêtes sur votre inventaire, comme le montrent les exemples suivants. Remplacez chaque user input placeholder par vos propres informations.

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

    Lorsque vous configurez l'inventaire S3 pour ajouter le champ Liste de contrôle d'accès d'objet (Liste ACL d'objet) à un rapport d'inventaire, le rapport affiche la valeur du champ Liste ACL d'objet sous la forme d'une chaîne codée en base64. Pour obtenir la valeur décodée au format JSON pour le champ Liste ACL d'objet, vous pouvez interroger ce champ avec Athena. Consultez les exemples de requête suivants. Pour plus d'informations sur le champ Liste ACL d'objet, consultez Utiliser le champ Liste ACL d'objet.

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

Pour plus d'informations sur l'utilisation d'Athena, consultez le Guide de l'utilisateur Amazon Athena.