BLOG

Realtor.com이 AWS CloudTrail 및 Amazon QuickSight을 이용해서 Amazon Athena 사용을 모니터링하는 방법
작성일: 2018년 3월 12일

이것은 Realtor.com의 데이터 엔지니어인 Ajay Rathod가 게시한 고객 게시물입니다.

 

Realtor.com은 그들 자신의 말로 하자면, Move 회사에서 운영하는 Realtor.com®은 가정 구매자, 판매자 및 꿈을 꾸는 사람들을 위한 신뢰할 수 있는 자료입니다. 경쟁 국가 사이트들 가운데 가장 포괄적인 매도 가능 부동산의 데이터베이스를 제공하고 있으며, 사람들이 집으로 가는 모든 단계를 통해 자신감 있게 움직일 수 있도록 돕기 위한 정보, 도구 및 전문적인 전문 지식을 제공합니다.

 

Move 회사에서는 수백 개의 테라바이트의 데이터를 요일과 시간으로 분할하여 처리합니다. 여러 팀이 이 데이터에 대해 수백 개의 쿼리를 실행합니다. Move 회사는 AWS 서비스를 사용하여 데이터를 수집하고 분석하기 위한 인프라를 구축했습니다.

 

  • 그 자료는 여러 출처에서 얻은 것입니다.
  • 데이터는 Amazon S3 데이터 레이크에 Amazon KinesisAWS 데이터 파이프라인과 함께 로드됩니다.
  • 스토리지의 효과를 높이고 이후 쿼리를 수행하기 위해 데이터가 Parquet 형식으로 변환되고 S3에 다시 저장됩니다.
  • Amazon Athena는 S3의 데이터를 쿼리하기 위한 SQL(구조화된 쿼리 언어)엔진으로 사용됩니다. Athena는 사용하기 쉽고 종종 다양한 팀들에 의해 빠르게 채택됩니다.
  • 팀은 Amazon QuickSight에 있는 쿼리 결과를 시각화합니다. Amazon QuickSight는 사용자 계정에서 다른 사용자와 신속하고 손쉽게 데이터를 시각화하고 협업할 수 있는 비즈니스 분석 서비스입니다.
  • 데이터 액세스는 AWS Identity and Access Management(IAM)역할에 의해 제어됩니다.

 

이 아키텍처는 데이터 플랫폼으로 알려져 있으며 조직 내에서 데이터 과학, 데이터 엔지니어링 및 데이터 운영 팀과 공유됩니다. Move 회사는 또한 다른 여러 부서를 아우르는 팀들이 Athena를 사용할 수 있도록 합니다. 많은 사용자들이 Athena를 사용할 때, Athena의 사용을 모니터링하는 것이 비용 효과를 보장하는데 도움이 됩니다. 이는 다음에 대한 세부 정보를 제공할 수 있는 Athena 메트릭의 강력한 필요성으로 이어집니다.

 

  • 사용자
  • 스캔한 데이터 양 (AWS 서비스 사용 비용 모니터링)
  • 쿼리에 사용되는 데이터베이스
  • 팀에서 실행하는 실제 쿼리

 

현재 Move 회사 팀은 단일 툴에서 이러한 모든 메트릭을 손쉽게 얻을 수 있는 방법이 없습니다. 이렇게 하는 방법을 사용하면 모니터링 작업을 크게 간소화할 수 있습니다. 예를 들어, 데이터 운영 팀은 Athena에서 실행되는 데이터에 대한 쿼리를 통해 매일 얻은 여러 메트릭을 수집하고자 합니다. 이러한 구성 요소에는 다음 메트릭이 필요합니다.

 

  • 각 사용자가 스캔한 데이터 양
  • 각 사용자별 조회 수
  • 각 사용자가 액세스하는 데이터베이스

 

이 포스트에서, Athena의 사용을 모니터링 하기 위한 해결책을 만드는 방법에 대해 논할 것입니다. 이 솔루션을 구축하려면 AWS CloudTrail에 의존해야 합니다. CloudTrail은 AWS 계정에 대한 AWS API 호출을 기록하고 S3 버켓에 로그 파일을 제공하는 웹 서비스입니다.

 

해결책

다음은 대략적인 개요입니다.

 

  1. CloudTrail API를 사용하여 사용자 쿼리를 감사한 다음, Athena를 사용하여 CloudTrail 로그로 테이블을 만듭니다.
  2. AWS CLI를 사용하여 Athena API를 쿼리하여 사용자 쿼리에서 스캔한 데이터에 대한 메트릭을 수집하고 이 정보를 Athena의 다른 테이블에 저장합니다.
  3. 이 두 개의 표를 결합하여 이 두 출처에서 나온 정보를 결합합니다.
  4. 결과 데이터를 사용하여 분석하고, 통찰력을 구축하고, 조직 내 다른 팀에서 사용자의 Athena 사용을 보여 주는 대시보드를 만들 수 있습니다.

 

이 솔루션의 아키텍처는 다음 다이어그램에 나와 있습니다.

 

 

 

이 솔루션을 단계적으로 살펴보십시오.

 

IAM 및 권한 설정
이 솔루션은 CloudTrail, Athena 및 S3를 사용합니다. 다음 스크립트와 단계를 실행하는 사용자에게 적절한 IAM 역할 및 정책이 있는지 확인하십시오. 자세한 내용은 IAM역할을 사용한 AWS계정의 접근 권한을 위임하는 내용의 자습서를 참조하십시오.

 

1단계: CloudTrail 안에 데이터로 사용할 테이블을 Athena에서 생성하기

CloudTrail API는 조직 내의 여러 팀에서 실행하는 모든 Athena 쿼리를 기록합니다. 이 로그들은 S3에 저장됩니다. 가장 관심 있는 필드는 다음과 같습니다.

 

  • 사용자 ID
  • API 호출의 시작 시간
  • 소스 IP주소
  • 요청 매개 변수
  • 서비스에서 반환하는 응답 요소

 

최종 사용자가 Athena에서 쿼리를 하면, 이러한 쿼리는 Athena 웹 서비스 호출의 응답으로 CloudTrail에 의해 기록됩니다. 이러한 응답에서 각 조회는 JSON(자바 스크립트 객체 표기법) 문자열로 나타납니다.

 

다음 CREATE TABLE문장을 사용하여 Athena에 cloudtrail_logs 테이블을 생성할 수 있습니다. 자세한 내용은 Athena 설명서의 Querying CloudTrail 로그를 참조하십시오.

 

CREATE EXTERNAL TABLE cloudtrail_logs (

         eventversion STRING,

         userIdentity STRUCT< type:STRING,

         principalid:STRING,

         arn:STRING,

         accountid:STRING,

         invokedby:STRING,

         accesskeyid:STRING,

         userName:String,

         sessioncontext:STRUCT< attributes:STRUCT< mfaauthenticated:STRING,

         creationdate:STRING>,

         sessionIssuer:STRUCT< type:STRING,

         principalId:STRING,

         arn:STRING,

         accountId:STRING,

         userName:STRING>>>,

         eventTime STRING,

         eventSource STRING,

         eventName STRING,

         awsRegion STRING,

         sourceIpAddress STRING,

         userAgent STRING,

         errorCode STRING,

         errorMessage STRING,

         requestId STRING,

         eventId STRING,

         resources ARRAY<STRUCT< ARN:STRING,

         accountId:STRING,

         type:STRING>>,

         eventType STRING,

         apiVersion STRING,

         readOnly BOOLEAN,

         recipientAccountId STRING,

         sharedEventID STRING,

         vpcEndpointId STRING,

         requestParameters STRING,

         responseElements STRING,

         additionalEventData STRING,

         serviceEventDetails STRING

)

ROW FORMAT SERDE ‘com.amazon.emr.hive.serde.CloudTrailSerde’

STORED AS INPUTFORMAT ‘com.amazon.emr.cloudtrail.CloudTrailInputFormat’

OUTPUTFORMAT ‘org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat’

LOCATION ‘s3://<s3 location of the CloudTrail logs>’;

 

2단계: API 출력 데이터를 위한 테이블을 Amazon Athena에서 생성하기

Athena는 특정 쿼리 ID의 정보를 얻기 위해 질문할 수 있는 API를 제공합니다. 또한 최대 50개의 쿼리 ID가 포함된 쿼리 ID 일괄 정보를 얻을 수 있는 API도 제공합니다.

 

이 API 호출을 사용하여 관심 있는 Athena 쿼리에 대한 정보를 얻고 이 정보를 S3 위치에 저장할 수 있습니다. S3에서 이 데이터를 나타낼 Athena 테이블을 만듭니다. 이 게시물에서 관심 있는 응답 필드는 다음과 같습니다.

 

  • 실행 ID쿼리
  • 데이터베이스
  • 엔진 작동 시간(밀리초)
  • 데이터 검색(바이트)
  • 상황
  • 제출 날짜/시간
  • 완료 날짜 시간

 

athena_api_output의 CREATE TABLE문장은 다음과 같습니다.

 

CREATE EXTERNAL TABLE IF NOT EXISTS athena_api_output(

  queryid string,

  querydatabase string,

  executiontime bigint,

  datascanned bigint,

  status string,

  submissiondatetime string,

  completiondatetime string

  )

ROW FORMAT SERDE ‘org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe’

WITH SERDEPROPERTIES (

  ‘serialization.format’ = ‘,’,

  ‘field.delim’ = ‘,’

) LOCATION ‘s3://<s3 location of the output from the API calls>’

TBLPROPERTIES (‘has_encrypted_data’=’false’)

 

쿼리 ID 및 사용자 정보를 마지막 날에 검사할 수 있습니다. 조회는 다음과 같습니다.

 

with data AS (

    SELECT

            json_extract(responseelements,

            ‘$.queryExecutionId’) AS query_id,

            (useridentity.arn) AS uid,

            (useridentity.sessioncontext.sessionIssuer.userName) AS role,

            from_iso8601_timestamp(eventtime) AS dt

    FROM    cloudtrail_logs

    WHERE   eventsource=’athena.amazonaws.com’

            AND eventname=’StartQueryExecution’

            AND json_extract(responseelements, ‘$.queryExecutionId’) is NOT null)

SELECT *

FROM   data

WHERE  dt > date_add(‘day’,-1,now() )

 

3단계: Athena API로부터 쿼리 통계 가져오기

간단한 Python 스크립트를 작성하여 50개의 일괄적인 쿼리를 반복 실행하고 쿼리 통계를 위해 Athena API를 쿼리 할 수 있습니다. 이러한 찾아보기 위해서는 Boto 라이브러리를 이용할 수 있습니다. Boto는 AWS 개발 환경과 쉽게 소통하고 자동화할 수 있는 방법을 제공하는 라이브러리입니다. Boto API의 응답은 2단계에서 설명한 대로 구문 분석을 통해 필요한 필드를 추출할 수 있습니다.

 

Python 스크립트를 Athenametrics GitHub repo에서 사용할 수 있는 예시입니다.

 

각 쿼리 ID에 대해 이러한 필드를 CSV 문자열로 포맷하고 S3 버킷에 전체 배치 응답을 위해 저장합니다. 이 S3 버킷은 2단계에서 cloudtrail_logs에 생성된 표로 표시됩니다.

 

Python 코드에서 sql_query라는 변수를 만들고 2단계에서 정의한 SQL 쿼리를 나타내는 문자열을 할당합니다. s3_query_folder는 Athena가 쿼리 결과를 저장하기 위해 사용하는 S3의 위치입니다. 코드는 다음과 같습니다.

 

sql_query =

“””

with data AS (

    SELECT

            json_extract(responseelements,

            ‘$.queryExecutionId’) AS query_id,

            (useridentity.arn) AS uid,

            (useridentity.sessioncontext.sessionIssuer.userName) AS role,

            from_iso8601_timestamp(eventtime) AS dt

    FROM    cloudtrail_logs

    WHERE   eventsource=’athena.amazonaws.com’

            AND eventname=’StartQueryExecution’

            AND json_extract(responseelements, ‘$.queryExecutionId’) is NOT null)

SELECT *

FROM   data

WHERE  dt > date_add(‘day’,-1,now() )

“””

athena_client = boto3.client(‘athena’)

query_execution = self.client.start_query_execution(

    QueryString=sql_query,

    ClientRequestToken=str(uuid.uuid4()),

    ResultConfiguration={

        ‘OutputLocation’: s3_staging_folder,

    }

)

query_execution_id = query_execution[‘QueryExecutionId’]

 

### Allow query to complete, check for status response[“QueryExecution”][“Status”][“State”]

response = athena_client.get_query_execution(QueryExecutionId=query_execution_id)

if response[“QueryExecution”][“Status”][“State”] == “SUCCEEDED”:

  results = athena_client.get_query_results(QueryEecutionId=query_exection_id)

 

응답 개체의 결과를 반복하고 50개의 결과 묶음으로 통합할 수 있습니다. 각 배치에 대해 Athena API, batch-get-query-execution을 호출할 수 있습니다.
2단계에서 athena_api_out테이블을 위한 CREATE TABLE 정의가 가리킨 S3 위치에 출력을 저장합니다. 위의 SQL문장은 최근 24시간 동안 실행된 쿼리만 반환합니다. 더 오랜 기간에 걸쳐 사용률을 높이는 것을 원할 수도 있습니다. 이 API 호출의 코드 조각은 다음과 같습니다.

 

response = athena_client.batch_get_query_execution(

    QueryExecutionIds=batchqueryids

)

 

배치 쿼리 id 값은 SELECT 쿼리 시 조회 ID를 추출한 50개의 쿼리 ID배열입니다. 이 스크립트는 두 번째 테이블에 필요한 데이터인 athena_api_out을 생성하며 이제 Athena에서 두 테이블을 모두 사용할 준비가 되었습니다.


4
단계: CloudTrail 및 Athena API 데이터에 참여하기

이제 필요한 데이터에 대해 두 테이블을 사용할 수 있으므로 다음 Athena 쿼리를 실행하여 사용자가 사용하는 정보를 볼 수 있습니다. 이 쿼리의 출력을 최근 5일로 제한할 수 있습니다.

 

SELECT

c.useridentity.arn,

json_extract(c.responseelements, ‘$.queryExecutionId’) qid,

a.datascanned,

a.querydatabase,

a.executiontime,

a.submissiondatetime,

a.completiondatetime,

a.status

FROM  cloudtrail_logs c

JOIN  athena_api_output a

ON    cast(json_extract(c.responseelements, ‘$.queryExecutionId’) as varchar) = a.queryid

WHERE eventsource = ‘athena.amazonaws.com’

AND   eventname = ‘StartQueryExecution’

AND   from_iso8601_timestamp(eventtime) >  date_add(‘day’,-5 ,now()  )

 

5단계: 결과 분석 및 시각화
이 단계에서는 QuickSight를 사용하여 다음 메트릭을 표시하는 대시보드를 생성할 수 있습니다.

 

  • 사용자 및 데이터베이스가 스캔한 평균 데이터 양(MB)
  • 사용자당 조회 수
  • 데이터베이스별 쿼리 수

 

자세한 내용은 대시보드 작업을 참조하십시오.

 

 

 

결론

이 포스트에 기술된 해결책을 사용하면, 여러분은 다양한 팀들에 의한 Athena의 사용을 지속적으로 감시할 수 있습니다. 이 단계를 더 진행하면 팀의 Athena 사용자가 특정 기간 내에 쿼리 할 수 있는 데이터 양에 대한 사용자 제한을 자동화하고 설정할 수 있습니다. 또한 특정 사용자의 사용량이 지정된 힌계점을 초과할 경우 알림을 추가하도록 선택할 수도 있습니다. 이를 통해 조직 내 여러 팀에서 발생하는 비용을 관리할 수 있습니다.

 

Realtor.com은 이 게시물을 작성하는 데 도움을 준 AWS 서비스 내 빅 데이터 및 분석 분야의 수석 컨설턴트인 Hemant Borole에게 엄청난 지원과 지침을 받은 것을 인정합니다.

 

원문 URL: https://aws.amazon.com/ko/blogs/big-data/analyzing-amazon-athena-usage-by-teams-within-a-real-estate-company/

 

** 메가존 TechBlog는 AWS BLOG 영문 게재글중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.