반응형
S3에 저장되어 있는 Flowlogs들은 엄청나게 많이 쌓여 있으며 하나하나 Download하기 굉장히 힘들다.
이러한 이유 때문에 간단한 Script를 짜두면 좋은데 능력이 부족하여 AWS CLI를 통해 간단한 스크립트를 작성하였다.
~/.aws/credentials 파일에 Access Key와 Secret Key가 저장되어 있다고 가정하며 S3 ReadOnly 권한만 있으면 된다.
Bash Shell에서 AWS CLI를 이용하여 S3의 객체들을 Download하여 하나의 파일로 저장한 뒤 모든 Log 파일들은 삭제한다.
아래의 정보를 파악한 후 Script를 돌리면 된다.
Bucket Name
Profile Name ( ~/.aws/credentials)
Region Name
Flowlogs ID
보고 싶은 시간대 지정
(시간대는 여러 시간 대역을 설정할 수 있으며 00, 01, 02, 03으로 설정하면 00:00 ~ 03:59 까지의 Log 파일을 다운로드 한 후 하나의 txt 파일로 생성)
#!/bin/bash
# README
echo "이 스크립트는 AWS Flowlogs를 시간대별로 Download 받은 후 추출하여 하나의 access_logs.txt 파일로
생성하는 Shell Script입니다.
[전제 조건]
1. ~/.aws/credentials에 Profile 등록되어 있어야 함 (자격 증명)
2. IAM User가 s3에 대한 권한이 있어야 함 (Admin 권한일 경우 상관 X)
3. Region 이름
4. Access Log가 보관 중인 Bucket Name
( aws s3 ls --profile {profile name} )
5. Access Logs를 확인할 날짜 (UTC 기준이며, UST = KST - 9)
6. 시간대 ( 00 = 00:00 ~ 00:59까지의 Log를 Download하며, 01 = 01 : 00 ~ 01 : 59까지의 Log를 다운로드
시간대는 여러 시간 대역을 설정할 수 있으며 00, 01, 02, 03으로 설정하면 00:00 ~ 03:59 까지의 Log 파일을 다운로드 한 후 하나의 txt 파일로 생성
Ex) S3에서 Flowlogs는 S3://{S3 Bucket}/{Account Number}/vpcflowlogs/{Region_name}}/2021/06/15/ 식의 경로로 이루어져 있기 때문임
"
sleep 3
# Get variables from user
# Profile Name
echo -e "Profile Name? ex) default, stg_develoer_user"
echo -n "Profile Name: "
read -r profile_name
profile_in_file=$(grep -v access ~/.aws/credentials | grep -E "\[${profile_name}\]")
if [[ -n $profile_in_file ]]
then
echo -e "
Profile name '${profile_name}' exists
"
else
echo "
Profile name ${profile_name} do not exists!
Check ~/.aws/credentials file
"
exit 0
fi
# Region
echo -e "
Region Name? ex) sa-east-1, ap-northeast-2, .."
echo -n "Region Name: "
read region_name
# Bucket
echo -e "
Bucket Name ? ex) my-flowlogs-bucket, .."
echo -n "Bucket Name: "
read bucket_name
# Check s3 buckets
buckets=$(aws s3 ls --profile "${profile_name}" | awk '{print $3}')
bucket_check=$(echo "$buckets" | grep "${bucket_name}")
if [[ -n "${bucket_check}" ]]
then
echo "Bucket '${bucket_check}' exists!"
else
echo -e "Bucket '${bucket_name}' do not exists!
Check Profile ${profile_name}\`s Buckets.
ex) aws s3 ls --profile ${profile_name}"
exit 0
fi
# Account Number
account_number=$(aws sts get-caller-identity --output text --query 'Account' --profile "${profile_name}")
# Flowlogs ID
# echo -e "
# Flowlogs ID ? "
# echo -n "ELB Name: "
# read -r elb_name
# Date
echo -e "
Date? ex) 2021-06-14, 2021-11-10"
echo -n "Date: "
read -r init_date
year=$(echo "$init_date" | awk -F "-" '{print $1}')
month=$(echo "$init_date" | awk -F "-" '{print $2}')
day=$(echo "$init_date" | awk -F "-" '{print $3}')
date=$(echo "$init_date" | awk -F "-" '{print $1$2$3}')
echo ""
# Time (Array)
time_array=()
while IFS= read -r -p "Time (UTC 기준으로 기입할 것, Loop 종료 : Enter 키)
ex) 00 : 00:00 ~ 00:59, 14 : 14:00 ~ 14:59
: " line; do
[[ $line ]] || break # break if line is empty
time_array+=("$line")
done
echo "
Times: "
for (( i=0; i<${#time_array[@]}; i++ )); do
echo "${time_array[i]}:00 ~ ${time_array[i]}:59"
done
s3_path=${bucket_name}/AWSLogs/${account_number}/vpcflowlogs/${region_name}/${year}/${month}/${day}
for (( i=0; i<${#time_array[@]}; i++ )); do
sleep 2
# filtering="*${elb_name}*${date}T${time_array[i]}*"
filtering="${account_number}*${region_name}*${date}T${time_array[i]}*"
aws s3 cp --profile "${profile_name}" s3://"${s3_path}" . --recursive --exclude "*" --include "${filtering}" && echo "Success Download ${time_array[i]}" || echo "Failed Download ${time_array[i]}"
done
sleep 5
# Unzip files
gzip -d *.gz && rm -rf *.gz
# .txt 파일 저장
cat *.log > "${profile_name}-flowlogs-${month}-${day}.txt" && rm -rf *.log
echo "
##############################################"
echo " Finished"
echo "###############################################"
결과는 아래의 파일로 저장된다.
(단 3시간동안의 Flowlogs인데 쌓이는 Log가 어마어마하다.
제대로 Logging을 파악하기 위해서는 ES 등 다른 Tool을 이용하여 분석하는 것이 좋다.)
반응형