안녕하세요!
오늘은 Cloudtrail을 생성하여 AWS에서의 활동로그들을 S3버킷에 저장하여 원하는 로그를 Athena로 조회하는 실습을 진행하겠습니다.
S3에 로그를 보관하는 이유는 Cloudtrail의 로그는 최대 90일까지만 보관이 됩니다. 그래서 버킷에 저장하여 필요할 때 로그를 조회할 목적으로 S3에 로그를 저장합니다.
AWS CloudTrail은 AWS 계정의 운영 및 위험 감사, 거버넌스 및 규정 준수를 활성화하는 데 도움이 되는 AWS 서비스입니다.
사용자, 역할 또는 AWS 서비스가 수행하는 작업들은 CloudTrail에 이벤트로 기록됩니다.
이벤트에는 AWS Management Console, AWS Command Line Interface 및 AWS SDK, API에서 수행되는 작업들이 포함됩니다.
Amazon Athena는 표준 SQL을 사용하여 Amazon S3(Amazon Simple Storage Service)에 있는 데이터를 직접 간편하게 분석할 수 있는 대화형 쿼리 서비스입니다. AWS Management Console에서 몇 가지 작업을 수행하면 Athena에서 Amazon S3에 저장된 데이터를 지정하고 표준 SQL을 사용하여 임시 쿼리를 실행하여 몇 초 안에 결과를 얻을 수 있습니다.
Amazon Athena의 Athena SQL 및 Apache Spark는 서버리스 서비스이므로 설정하거나 관리할 인프라가 없으며 실행한 쿼리에 대해서만 비용을 지불하면 됩니다. Athena는 자동으로 확장되어 쿼리를 병렬로 실행하여 대규모 데이터 세트과 복잡한 쿼리에서도 빠르게 결과를 얻을 수 있습니다.
[ 목 차 ]
1. S3버킷 생성 후 cloudtrai에 로그보관
2. Athena로 쿼리분석
1. S3버킷 생성 후 Cloudtrail에 로그보관
우선 로그를 보관할 S3버킷을 생성해 줍니다.
이렇게 만들어진 버킷에는 어떤 데이터나 로그도 저장되어 있지 않는게 보입니다.
Cloudtrail을 생성하여 생성되는 로그를 s3버킷에 저장되게 구성할 것 입니다.
cloudtrail은 사이드바에 이벤트 기록으로 가보면 로그들이 작업을하면서 생긴 이벤트 로그들이 보입니다.
이렇게 이벤트기록이 자체적으로 생기는데 굳이 s3에 저장하는 이유는 cloudtrail의 로그들은 90까지밖에 저장이 안되기 때문입니다. 그래서 EBS등 요금이 비싼 스토리지 보다는 s3에 로그를 저장하여 저비용으로 사용할 기간만큼 저장하는 것입니다.
cloudtrail을 생성하여 s3에 로그를 저장하게 설정하겠습니다.
이렇게 cloudtrail이 만들어졌습니다. 그럼 이제 s3버킷에 로그데이터가 잘 쌓이는지 확인해보겠습니다.
참고로 저처럼 이제 막 trail을 만들었으면 버킷에 로그가 쌓이는데 5분정도 걸립니다.
이렇게 로그파일들안에 로그가 생긴걸 볼 수 있습니다.
이 로그들은 시간이 지남에 따라 늘어나시는걸 확인할 수 있습니다.
AWS 공식 도큐먼트를 읽어보면 CloudTrail 로그를 S3 버킷에 쌓기 위해선 아래의 내용을 Bucket Policy에 추가해줘야 합니다. 그런데 위 콘솔 작업을 마치고 막상 S3 Buckeet Policy를 확인해보면 이미 자동으로 수정되어 있습니다.
링크는 글 맨 밑에 첨부해 두었습니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AWSCloudTrailAclCheck20150319",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:GetBucketAcl",
"Resource": "arn:aws:s3:::cloudtrail-log-test-1",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudtrail:ap-northeast-2:193432528475:trail/test-cloudtrail"
}
}
},
{
"Sid": "AWSCloudTrailWrite20150319",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::cloudtrail-log-test-1/AWSLogs/193432528475/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudtrail:ap-northeast-2:193432528475:trail/test-cloudtrail",
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}
2. Athena로 쿼리분석
우선 쿼리는 작성하기 전에 쿼리 결과를 저장할 위치를 지정해줘야 합니다.
s3버킷에 쿼리 결과를 저장하는 설정을 해줍니다.
Athena 서비스 화면에 접근하여 쿼리 창에 아래 내용을 입력해줍니다.
CloudTrail 로그 파일에 맞게 Table을 생성하고, 지정한 S3 버킷 경로에 있는 모든 파일의 데이터를 Table 형식에 맞게 불러오겠다는 내용입니다.
맨 윗줄의 테이블이름 (cloudtrail_logs)은 편하신대로 변경이 가능합니다.
또한 맨밑줄의 LOCATION은 S3의버킷의 경로이므로 자신의 경로로 변경 해주셔야 합니다.
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,
requestparameters STRING,
responseelements STRING,
additionaleventdata STRING,
requestid STRING,
eventid STRING,
resources ARRAY<STRUCT<
ARN:STRING,
accountId:STRING,
type:STRING>>,
eventtype STRING,
apiversion STRING,
readonly STRING,
recipientaccountid STRING,
serviceeventdetails STRING,
sharedeventid 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://CloudTrail_bucket_name/AWSLogs/Account_ID/CloudTrail/';
쿼리는 실행시켜보니 Table이 정상적으로 생성되었습니다.
이제 테이블 안에 있는 필요한 데이터만 불러와 확인하면 된다. default 데이터베이스에 new_cloudtrail_logs라는 테이블에서 eventsource가 ec2.amazonaws.com과 일치한 데이터를 모두 불러와 보았다.
SELECT * FROM "default"."new_cloudtrail_logs" WHERE (eventsource='ec2.amazonaws.com');
해당하는 쿼리가 잘 조회되었습니다.
오늘은 이렇게 cloudtrail을 사용하여 s3버킷에 로그를 저장하고 athena를 사용하여 원하는 쿼리를 조회하는 방법을 배워봤습니다.
감사합니다. :)
참고자료