내용으로 건너뛰기

Athena를 사용해 Amazon S3 인벤토리 보고서를 쿼리하려면 어떻게 해야 하나요?

4분 분량
0

Amazon Athena를 사용해 Amazon Simple Storage Service (Amazon S3) 인벤토리 파일을 쿼리하고 싶습니다.

해결 방법

Amazon S3 재고 파일을 ORC 형식, Parquet 형식, 또는 CSV 형식의 인벤토리 보고서로 쿼리하려면 다음 단계를 따르세요.

  1. S3 버킷의 Amazon S3 인벤토리를 구성하세요. 인벤토리 보고서가 저장되는 대상 버킷 값을 기록해 두세요.

  2. Athena 콘솔을 엽니다.
    참고: 첫 번째 쿼리를 실행하기 전에 Amazon S3에 쿼리 결과 위치를 설정해야 할 수 있습니다.

  3. 쿼리 편집기에서 DDL 문을 실행해 데이터베이스를 생성하세요.

    create database s3_inventory_db
  4. 데이터베이스에 테이블 스키마를 생성하세요.

    ORC 형식의 인벤토리 보고서 예제 쿼리:

    참고: 다음 변수를 내 변수로 바꾸세요.

    • your_table_name을 내 Athena 테이블 이름으로 바꾸세요.
    • LOCATION에 단계 1의 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"
      );

    참고: Parquet 형식의 재고 보고서를 쿼리하려면 RROW 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 테이블을 성공적으로 생성한 것입니다. 데이터는 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;

인벤토리 날짜부터 5GB 이상인 개체 수를 세거나 목록으로 표시

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;

공용 액세스가 가능하고 Object 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'

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

Object 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, 'permission') = 'READ';

정식 사용자 ID에 Object 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';

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;

관련 정보

Athena에서 데이터 분할

Athena SQL 사용

인벤토리 목록 찾기

Amazon Athena를 사용하여 Amazon S3 서버 액세스 로그를 분석하려면 어떻게 해야 하나요?

AWS 공식업데이트됨 2년 전
댓글 없음