Athena を使用して Amazon S3 インベントリレポートをクエリする方法を教えてください。
Amazon Athena を使用して Amazon Simple Storage Service (Amazon S3) インベントリファイルをクエリしたいと考えています。
解決策
以下の手順に従って、ORC 形式、Parquet 形式、または CSV 形式のインベントリレポートを使用して Amazon S3 インベントリファイルをクエリします。
-
S3 バケットの Amazon S3 インベントリを設定します。インベントリレポートが保存される送信先バケットの値をメモします。
-
Athena コンソールを開きます。
注: 最初のクエリを実行する前に、場合によっては、Amazon S3 にクエリ結果の場所を設定します。 -
[クエリエディタ] で、DDL ステートメントを実行してデータベースを作成します。
create database s3\_inventory\_db
-
データベースにテーブルスキーマを作成します。
ORC 形式のインベントリレポートのクエリ例:
**注:**次の変数を該当する変数に置き換えます。
- your_table_name には、Athena テーブル名を入力します。
- [LOCATION] に、S3 バケットとプレフィックスのパスを入力します。プレフィックスの末尾にはフォワードスラッシュ (/) を含めてください (例: s3://doc-example-bucket/prefix/)。プレフィックスを使用しない場合は、バケット名の末尾にフォワードスラッシュ (/) を含めてください (例: s3://doc-example-bucket/)。
- projection.dt.range の 2022-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" );
-
左側のペインの [テーブル] で、テーブル名の横にある省略記号を選択し、[テーブルのプレビュー]を選択します。[結果] ウィンドウにサーバーアクセスログのデータが表示されていれば、Athena テーブルは正常に作成されています。データは、bucket、key、version_id、size、および 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;
関連情報
関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 5年前lg...
- 質問済み 5年前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 1年前
- AWS公式更新しました 1年前
- AWS公式更新しました 3年前