Athena を使用して Amazon S3 インベントリレポートをクエリする方法を教えてください。

所要時間3分
0

Amazon Athena を使用して Amazon Simple Storage Service (Amazon S3) インベントリファイルをクエリしたいと考えています。

解決策

以下の手順に従って、ORC 形式、Parquet 形式、または CSV 形式のインベントリレポートを使用して Amazon S3 インベントリファイルをクエリします。

  1. S3 バケットの Amazon S3 インベントリを設定します。インベントリレポートが保存される送信先バケットの値をメモします。

  2. Athena コンソールを開きます。
    注: 最初のクエリを実行する前に、場合によっては、Amazon S3 にクエリ結果の場所を設定します

  3. [クエリエディタ] で、DDL ステートメントを実行してデータベースを作成します。

    create database s3\_inventory\_db
  4. データベースにテーブルスキーマを作成します。

    ORC 形式のインベントリレポートのクエリ例:

    **注:**次の変数を該当する変数に置き換えます。

    • your_table_name には、Athena テーブル名を入力します。
    • [LOCATION] に、S3 バケットとプレフィックスのパスを入力します。プレフィックスの末尾にはフォワードスラッシュ (/) を含めてください (例: s3://doc-example-bucket/prefix/)。プレフィックスを使用しない場合は、バケット名の末尾にフォワードスラッシュ (/) を含めてください (例: s3://doc-example-bucket/)。
    • projection.dt.range2022-01-01-00-00 の日付については、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"
      );

    **注:**パーケット形式のインベントリレポートをクエリするには、ROW FORMAT SERDE ステートメントで ORC SerDe の代わりに次の Parquet SerDe を使用します。

    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'

    CSV 形式のインベントリレポートのクエリの例:

    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"
      );
  5. 左側のペインの [テーブル] で、テーブル名の横にある省略記号を選択し、[テーブルのプレビュー]を選択します。[結果] ウィンドウにサーバーアクセスログのデータが表示されていれば、Athena テーブルは正常に作成されています。データは、bucketkeyversion_idsize、および objectowner などの値のようになります。

Amazon S3 インベントリファイルをクエリできるようになりました。

Amazon S3 インベントリファイルをクエリする方法の詳細については、「Amazon Athena を使用して Amazon S3 インベントリをクエリする」を参照してください。

クエリの例

次のサンプルクエリを使用して Amazon S3 インベントリレポートを実行します。ユースケースに合わせて独自のクエリを作成することもできます。

サイズおよびレポート別にオブジェクトをソートする

SELECT DISTINCT size FROM your_table_name ORDER BY 1 DESC limit 10;
SELECT size, count(*) FROM your_table_name GROUP BY size;

暗号化ステータスを確認してセキュリティ上のリスクを特定し、暗号化を有効にする

SELECT encryption_status, count(*) FROM your_table_name GROUP BY encryption_status;

最終更新日を基準にカウントしてアクティブなデータを確認する

SELECT last_modified_date, count(*) FROM your_table_name GROUP BY last_modified_date;

インベントリ日付から 5 GB 以上のオブジェクトをカウントまたは一覧表示する

SELECT COUNT(*) FROM your_table_name WHERE size >= 5000000000;
SELECT bucket,key,size FROM your_table_name WHERE size>5000000000;

アクセス頻度の低いデータを階層別にレポートする

SELECT intelligent_tiering_tier,count (*) FROM your_table_name GROUP BY intelligent_tiering_tier;

パブリックアクセスでオブジェクト ACL 権限が付与されている S3 キーを取得する

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'

オブジェクト ACL の付与者とオブジェクト所有者がいる S3 キーを取得する

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;

オブジェクト ACL で付与されている READ 権限で S3 キーを取得する

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

正規ユーザ ID にオブジェクト ACL が付与されている S3 キーを取得する

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

オブジェクト ACL の被付与者数を取得する

SELECT key,
object_access_control_list,
json_array_length(json_extract(object_access_control_list,'$.grants')) AS grants_count
FROM your_table_name;

関連情報

Athena でのデータのパーティション化

Athena SQL を使用する

インベントリリストを検索する

Amazon Athena で Amazon S3 サーバーアクセスログを分析する方法を教えてください。

AWS公式
AWS公式更新しました 7ヶ月前
コメントはありません