メタデータテーブルクエリの例
次の例は、標準 SQL クエリを使用して S3 メタデータテーブルからさまざまなタイプの情報を取得する方法を示しています。
これらの例を使用する際は、次の点に注意してください。
-
例は、Amazon Athena で動作するように記述されています。別のクエリエンジンで動作するためには、例を変更する必要がある場合があります。
-
クエリを最適化する方法を理解していることを確認してください。
-
b_
を名前空間の名前に置き換えます。general-purpose-bucket-name
-
サポートされている列の完全なリストについては、「S3 Metadata ジャーナルテーブルスキーマ」および「S3 Metadata ライブインベントリテーブルスキーマ」を参照してください。
目次
ジャーナルテーブルのクエリ例
次のクエリ例を使用して、ジャーナルテーブルをクエリできます。
ファイル拡張子によるオブジェクトの検索
次のクエリは、特定のファイル拡張子 (この場合は .jpg
) を持つオブジェクトを返します。
SELECT key FROM "s3tablescatalog/aws-s3"."
b_
"."journal" WHERE key LIKE '%.jpg' AND record_type = 'CREATE'general-purpose-bucket-name
オブジェクトの削除の一覧表示
次のクエリは、リクエストを行った AWS アカウント ID または AWS サービスプリンシパルを含むオブジェクト削除イベントを返します。
SELECT DISTINCT bucket, key, sequence_number, record_type, record_timestamp, requester, source_ip_address, version_id FROM "s3tablescatalog/aws-s3"."
b_
"."journal" WHERE record_type = 'DELETE';general-purpose-bucket-name
オブジェクトで使用される AWS KMS 暗号化キーの一覧表示
次のクエリは、オブジェクトを暗号化する AWS Key Management Service (AWS KMS) キーの ARN を返します。
SELECT DISTINCT kms_key_arn FROM "s3tablescatalog/aws-s3"."
b_
"."journal";general-purpose-bucket-name
KMS キーを使用しないオブジェクトの一覧表示
次のクエリは、AWS KMS キーで暗号化されていないオブジェクトを返します。
SELECT DISTINCT kms_key_arn FROM "s3tablescatalog/aws-s3"."
b_
"."journal" WHERE encryption_status NOT IN ('SSE-KMS', 'DSSE-KMS') AND record_type = 'CREATE';general-purpose-bucket-name
過去 7 日間の PUT
オペレーションに使用される AWS KMS 暗号化キーの一覧表示
次のクエリは、オブジェクトを暗号化する AWS Key Management Service (AWS KMS) キーの ARN を返します。
SELECT DISTINCT kms_key_arn FROM "s3tablescatalog/aws-s3"."
b_
"."journal" WHERE record_timestamp > (current_date - interval '7' day) AND kms_key_arn is NOT NULL;general-purpose-bucket-name
過去 24 時間以内に削除されたオブジェクトを S3 ライフサイクル別に一覧表示する
次のクエリは、S3 ライフサイクルによって最終日に期限切れになったオブジェクトを一覧表示します。
SELECT bucket, key, version_id, last_modified_date, record_timestamp, requester FROM "s3tablescatalog/aws-s3"."
b_
"."journal" WHERE requester = 's3.amazonaws.com' AND record_type = 'DELETE' AND record_timestamp > (current_date - interval '1' day)general-purpose-bucket-name
Amazon Bedrock が提供するメタデータの表示
一部の AWS サービス (Amazon Bedrock など) は、Amazon S3 にオブジェクトをアップロードします。これらのサービスによって提供されるオブジェクトメタデータをクエリできます。例えば、次のクエリには、Amazon Bedrock によって汎用バケットにアップロードされたオブジェクトがあるかどうかを判断する user_metadata
列が含まれています。
SELECT DISTINCT bucket, key, sequence_number, record_type, record_timestamp, user_metadata FROM "s3tablescatalog/aws-s3"."
b_
"."journal" WHERE record_type = 'CREATE' AND user_metadata['content-source'] = 'AmazonBedrock';general-purpose-bucket-name
Amazon Bedrock がバケットにオブジェクトをアップロードした場合、user_metadata
列には、クエリ結果のオブジェクトに関連付けられた次のメタデータが表示されます。
user_metadata {content-additional-params -> requestid="CVK8FWYRW0M9JW65", signedContentSHA384="38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b", content-model-id -> bedrock-model-arn, content-source -> AmazonBedrock}
オブジェクトの現状の把握
次のクエリは、オブジェクトの現在の状態を判断するのに役立ちます。クエリは、各オブジェクトの最新バージョンを識別し、削除されたオブジェクトを除外し、シーケンス番号に基づいて各オブジェクトの最新バージョンをマークします。結果は、bucket
、key
、および sequence_number
列で順序付けられます。
WITH records_of_interest as ( -- Start with a query that can narrow down the records of interest. SELECT * from "s3tablescatalog/aws-s3"."
b_
"."journal" ), version_stacks as ( SELECT *, -- Introduce a column called 'next_sequence_number', which is the next larger -- sequence_number for the same key version_id in sorted order. LEAD(sequence_number, 1) over (partition by (bucket, key, coalesce(version_id, '')) order by sequence_number ASC) as next_sequence_number from records_of_interest ), -- Pick the 'tip' of each version stack triple: (bucket, key, version_id). -- The tip of the version stack is the row of that triple with the largest sequencer. -- Selecting only the tip filters out any row duplicates. -- This isn't typical, but some events can be delivered more than once to the table -- and include rows that might no longer exist in the bucket (since the -- table contains rows for both extant and extinct objects). -- In the next subquery, eliminate the rows that contain deleted objects. current_versions as ( SELECT * from version_stacks where next_sequence_number is NULL ), -- Eliminate the rows that are extinct from the bucket by filtering with -- record_type. An object version has been deleted from the bucket if its tip is -- record_type==DELETE. existing_current_versions as ( SELECT * from current_versions where not (record_type = 'DELETE' and is_delete_marker = FALSE) ), -- Optionally, to determine which of several object versions is the 'latest', -- you can compare their sequence numbers. A version_id is the latest if its -- tip's sequencer is the largest among all other tips in the same key. with_is_latest as ( SELECT *, -- Determine if the sequence_number of this row is the same as the largest sequencer for the key that still exists. sequence_number = (MAX(sequence_number) over (partition by (bucket, key))) as is_latest_version FROM existing_current_versions ) SELECT * from with_is_latest ORDER BY bucket, key, sequence_number;general-purpose-bucket-name
インベントリテーブルのクエリ例
次のクエリ例を使用して、インベントリテーブルをクエリできます。
特定のタグを使用するデータセットの検出
次のクエリは、指定されたタグを使用するデータセットを返します。
SELECT * FROM "s3tablescatalog/aws-s3"."
b_
"."inventory" WHERE object_tags['key1'] = 'value1' AND object_tags['key2'] = 'value2';general-purpose-bucket-name
SSE-KMS で暗号化されていないオブジェクトの一覧表示
次のクエリは、SSE-KMS キーで暗号化されていないオブジェクトを返します。
SELECT key, encryption_status FROM "s3tablescatalog/aws-s3"."
b_
"."inventory" WHERE encryption_status != 'SSE-KMS';general-purpose-bucket-name
暗号化されていないオブジェクトの一覧表示
次のクエリは、暗号化されていないオブジェクトを返します。
SELECT bucket, key, version_id FROM "s3tablescatalog/aws-s3"."
b_
"."inventory" WHERE encryption_status IS NULL;general-purpose-bucket-name
Amazon Bedrock によって生成されたオブジェクトの一覧表示
次のクエリは、Amazon Bedrock によって生成されたオブジェクトを一覧表示します。
SELECT DISTINCT bucket, key, sequence_number, user_metadata FROM "s3tablescatalog/aws-s3"."
b_
"."inventory" WHERE user_metadata['content-source'] = 'AmazonBedrock';general-purpose-bucket-name
インベントリテーブルとジャーナルテーブルの照合
次のクエリは、バケットの現在のコンテンツを含む最新の inventory-table-like リストを生成します。より正確には、結果のリストはインベントリテーブルの最新スナップショットとジャーナルテーブルの最新イベントを組み合わせます。
このクエリで最も正確な結果を生成するには、ジャーナルテーブルとインベントリテーブルの両方がアクティブステータスである必要があります。
10 億 (10^9) 未満のオブジェクトを含む汎用バケットに、このクエリを使用することをお勧めします。
このクエリ例では、リスト結果に次の簡略化を適用します (インベントリテーブルと比較)。
-
列の省略 – 列
bucket
、is_multipart
、encryption_status
、is_bucket_key_enabled
、kms_key_arn
、checksum_algorithm
は最終結果の一部ではありません。オプションの列のセットを最小限に抑えると、パフォーマンスが向上します。 -
すべてのレコードを含める – クエリは、null バージョン (バージョニングされていないバケットまたはバージョニングが停止されたバケット内) と削除マーカーを含むすべてのオブジェクトキーとバージョンを返します。目的のキーのみを表示するように結果をフィルタリングする方法の例については、クエリの最後にある
WHERE
句を参照してください。 -
高速調整 – クエリは、まれに、バケットになくなったオブジェクトを一時的にレポートすることがあります。これらの不一致は、インベントリテーブルの次のスナップショットが利用可能になるとすぐに削除されます。この動作は、パフォーマンスと精度のトレードオフです。
WITH inventory_time_cte AS ( SELECT COALESCE(inventory_time_from_property, inventory_time_default) AS inventory_time FROM ( SELECT * FROM (VALUES (TIMESTAMP '2024-12-01 00:00')) AS T (inventory_time_default) LEFT OUTER JOIN ( SELECT from_unixtime(CAST(value AS BIGINT) / 1000.0) AS inventory_time_from_property FROM "journal$properties" WHERE key = 'aws.s3metadata.oldest-uncoalesced-record-timestamp' LIMIT 1 ) ON TRUE ) ), working_set AS ( SELECT key, sequence_number, version_id, is_delete_marker, size, COALESCE(last_modified_date, record_timestamp) AS last_modified_date, e_tag, storage_class, object_tags, user_metadata, (record_type = 'DELETE' AND NOT COALESCE(is_delete_marker, FALSE)) AS _is_perm_delete FROM journal j CROSS JOIN inventory_time_cte t WHERE j.record_timestamp > (t.inventory_time - interval '15' minute) UNION ALL SELECT key, sequence_number, version_id, is_delete_marker, size, last_modified_date, e_tag, storage_class, object_tags, user_metadata, FALSE AS _is_perm_delete FROM inventory i ), updated_inventory AS ( SELECT * FROM ( SELECT *, MAX(sequence_number) OVER (PARTITION BY key, version_id) AS _supremum_sn FROM working_set ) WHERE sequence_number = _supremum_sn ) SELECT key, sequence_number, version_id, is_delete_marker, size, last_modified_date, e_tag, storage_class, object_tags, user_metadata FROM updated_inventory -- This filter omits only permanent deletes from the results. Delete markers will still be shown. WHERE NOT _is_perm_delete -- You can add additional filters here. Examples: -- AND object_tags['department'] = 'billing' -- AND starts_with(key, 'reports/') ORDER BY key ASC, sequence_number DESC