Amazon Athena로 Amazon S3 인벤토리 조회

Amazon Athena로 Amazon S3 인벤토리 조회

Athena를 사용할 수 있는 모든 리전에서 Amazon Athena로 표준 SQL 쿼리를 사용해 Amazon S3 인벤토리 파일을 조회할 수 있어요. AWS 리전 가용성을 확인하려면 AWS 리전 표를 참고하세요.

출처: 문서

본문

Athena는 Apache 최적화 행 열(ORC), Apache Parquet, 또는 쉼표로 구분된 값(CSV) 형식의 Amazon S3 인벤토리 파일을 조회할 수 있어요. 최상의 쿼리 속도와 더 낮은 비용을 위해 ORC 형식 또는 Parquet 형식 인벤토리 파일을 사용해요. ORC와 Parquet는 Apache Hadoop용으로 설계된 컬럼 형식 파일 형식이에요. 컬럼 형식 덕분에 읽기 도구가 현재 쿼리에 필요한 열만 읽고, 압축 해제하고, 처리할 수 있어요. Amazon S3 인벤토리의 ORC와 Parquet 형식은 모든 AWS 리전에서 사용할 수 있어요.

Athena로 Amazon S3 인벤토리 파일을 조회하려면 다음을 수행해요.

  1. Athena 테이블을 만들어요. 테이블 생성에 대한 자세한 내용은 Amazon Athena User Guide의 Amazon Athena에서 테이블 생성을 참고하세요.
  2. ORC 형식 인벤토리 보고서인지 Parquet 형식인지 CSV 형식인지에 따라 다음 샘플 쿼리 템플릿 중 하나를 사용해 쿼리를 만들어요. Athena로 ORC 형식 인벤토리 보고서를 조회할 때는 다음 샘플 쿼리를 템플릿으로 사용해요. 다음 샘플 쿼리는 ORC 형식 인벤토리 보고서의 모든 선택적 필드를 포함해요. 이 샘플 쿼리에는 다음을 수행해요.
    • your_table_name을 만든 Athena 테이블 이름으로 바꿔요.
    • 인벤토리에서 선택하지 않은 선택적 필드는 제거해 쿼리가 인벤토리에 선택된 필드와 일치하도록 해요.
    • 버킷 이름과 인벤토리 위치(구성 ID)를 구성에 맞게 바꿔요: s3://amzn-s3-demo-bucket/config-ID/hive/.
    • projection.dt.range 아래의 2022-01-01-00-00 날짜를 Athena에서 데이터를 파티셔닝하는 시간 범위의 첫날로 바꿔요. 자세한 내용은 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,
  object_lock_event_hold_status string,
  object_lock_event_hold_duration int,
  object_lock_event_hold_duration_unit string,
  intelligent_tiering_access_tier string,
  bucket_key_status string,
  checksum_algorithm string,
  object_access_control_list string,
  object_owner string,
  lifecycle_expiration_date timestamp
)
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://amzn-s3-demo-bucket/config-ID/hive/'
TBLPROPERTIES (
  'projection.enabled' = 'true',
  'projection.dt.type' = 'date',
  'projection.dt.range' = '2022-01-01-00-00,NOW',
  'projection.dt.format' = 'yyyy-MM-dd-HH-mm',
  'projection.dt.interval' = '1',
  'projection.dt.interval.unit' = 'HOURS',
  'storage.location.template' = 's3://amzn-s3-demo-bucket/config-ID/hive/dt=${dt}'
);
  1. 이제 다음 예시처럼 인벤토리에 대해 다양한 쿼리를 실행할 수 있어요. 각 user input placeholder를 자신의 정보로 바꾸세요.
# 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;

S3 인벤토리 구성에서 인벤토리 보고서에 Object ACL(객체 접근 제어 목록) 필드를 추가하면, 보고서는 Object ACL 필드 값을 base64로 인코딩된 문자열로 표시해요. Object ACL 필드의 JSON 디코딩 값을 얻으려면 Athena로 이 필드를 조회할 수 있어요. 다음 쿼리 예시를 참고하세요. Object ACL 필드에 대한 자세한 내용은 Object ACL 필드 사용을 참고하세요.

# 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, object_owner FROM grants, UNNEST(grants_array) AS t(grant)

Athena 사용에 대한 자세한 내용은 Amazon Athena User Guide를 참고하세요.

더 알아보기 (Learn more)