본문 바로가기

AWS

[Bash] S3에 저장되어 있는 AWS FlowLogs 추출하는 Shell Script

반응형

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을 이용하여 분석하는 것이 좋다.)

 

 

반응형