AWS CloudFront, WAF 등 S3에 저장된 log들은 최종 gz 압축 형태로 보관 된다.
주기적이고, 빠르게 모니터링하고 분석하기 위해서 Python SDK를 이용하여 자동화 할 수 있는 방법을 알아본다.
S3 버킷에 저장된 object 다운로드
Python boto3를 이용하여 S3에서 파일을 다운로드 한다. 일반적으로 날짜 Prefix가 들어가기 때문에 datetime 모듈을 이용하여 일괄 다운로드 받을 수 있으며, 아래에서는 단일 파일만 대상으로 테스트 해본다.
CloudFront 로그가 S3에 저장되어 있고, xxxx.2023-03-15-01.xxxx.gz 라는 압축파일을 다운로드
import boto3
client = boto3.client('s3')
saveFile = 'xxxx.2023-03-15-01.xxxx.gz'
bucket = 'bucket-name'
key = 'xxxx.2023-03-15-01.xxxx.gz'
# key : Local File
# saveFile : S3 object, object는 파일이다.
client.download_file(bucket, key, saveFile)
만약 날짜 Prefix 로 모두 다운로드 받으려면 list_objects 메소드를 이용하여 파일을 목록을 리스트 하면 된다.
prefix = 'xxxxxx.2023-03-'
bucket = 'bucket-name'
res = client.list_objects(Bucket=bucket, Prefix=prefix)
filelist = []
for i in [ filename['Key'] for filename in res['Contents']]:
filelist.append(i)
# filename['Key']는 다운로드 파일명
gzip 모듈을 이용하여 압축파일에 내용 읽기
import gzip
import pandas as pd
with gzip.open(saveFile,'rb') as f:
data = f.readlines()
data = [ x.decode() for x in data ] # Byte형이기 때문에 decode()
col = data[1].split()[1:] # 컬럼 리스트
data = [ x.split('\t') for x in data[1:]] # 데이터 리스트
CloudFront 컬럼 (col) 리스트를 보면 총 33개의 필드로 구성되어 있다.
컬럼명과 데이터의 길이 (len) 가 서로 맞아야 DataFrame에온전히 넣을 수 있겠다.
DataFrame으로 변환
pandas 모듈을 이용하여 DataFrame으로 변환한다.
df = pd.DataFrame(data[1:],columns=col)
df
정상적으로 만들어 졌다면 아래와 같이 만들어 졌을 것이다.
모니터링 활용
Pandas 이용한 시계열 scbytes 통계보기 ( resample을 이용하여 시간대별 Download 양 보기 )
# 컬럼에 -는 _로 대체하였다.
df.columns = df.columns.str.replace('-','_')
# sc_bytes는 집계를 해야하기 때문에 int로 형변환
df['sc_bytes'] = df['sc_bytes'].astype(int)
# logtime 이라는 컬럼을 만들고, 한국시간 UTC +9000으로 조정하여, Index 지정
df['logtime'] = pd.DatetimeIndex(df['date'] + ' ' + df['time']) + timedelta(hours=9)
df = df.set_index('logtime')
# resample 메소드를 이용하여 1시간당 집계. (용량 : G)
df_resamped = df.resample('1H', closed='left', label='left', base=0).sum() / 1000000000
df_resamped
Kibana의 heatmap을 이용한 시계열 콘텐츠별 Download 시각화
'AWS Infra' 카테고리의 다른 글
[ AWS ] Python boto3를 이용하여 RDS Connections 데이터 추출 하기 (0) | 2023.05.11 |
---|---|
[ AWS ] Python boto3를 이용하여 ELB Metric 모니터링 (0) | 2023.05.10 |
[ AWS ] Python boto3를 이용하여 Target Group Health 모니터링 (0) | 2023.04.25 |
[ AWS ] Python boto3를 이용하여 S3 object 스토리지 클래스 변경 (0) | 2023.03.21 |
[ Python ] Python을 이용한 ElastiCache Redis Hash Data Export & Import (0) | 2023.02.28 |
[ AWS ] Python boto3를 이용하여 값 CPUCreditBalance 구하기 (0) | 2023.02.02 |
[ AWS ] Python boto3를 이용하여 EC2 CPU 사용율 구하기 (0) | 2023.02.02 |
[ AWS ] Python Boto3를 이용한 CloudFront Invalidation (무효화) (0) | 2023.01.13 |