[EC2] 종료된 인스턴스 tomcat 로그 S3에 올리는 방법

2022-06-24


Photo by Erwi on Unsplash

일반적인 인스턴스 이외의 오토 스케일링된 인스턴스의 경우 로그를 따로 저장해야 하는 경우가 있다 이럴 경우 cloudwatch에 직접 로그 기록을 실시간으로 남긴다거나 아니면, 직접 파일을 s3 버킷에 남길 수 있는 방법이 있다. 이 방법을 알아보자.


- 버킷 권한

{
	"Version": "2012-10-17",
	"Id": "Policy1652407976899",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:ListBucket",
			"Resource": "arn:aws:s3:::자신의버킷명"
		},
		{
			"Sid": "Stmt1652407974937",
			"Effect": "Allow",
			"Principal": "*",
			"Action": [
				"s3:GetObject",
				"s3:PutObject"
			],
			"Resource": "arn:aws:s3:::자신의버킷명/*"
		}
	]
}

우선 버킷 자체의 권한을 확인한다. 버킷에는 기본적으로 퍼블릭 엑세스가 제한되어 있을 텐데, 그럴 경우 위와 같이 권한 설정이 버킷에 되어 있어야 한다. 버킷 > 권한 > 버킷 정책에서 확인 가능하다.


- IAM 계정 권한

 

자신의 ec2 인스턴스에서 위와 같은 명령어를 사용하여 계정이 등록되어 있는지 확인한다.

# aws configure list

 

s3에 계정이 등록이 안되어 있으면 아래 명령어를 통해 등록한다.

	[aws configure 설정]
	# aws configure 
	AWS Access Key ID [None] : 접속한 계정의 Accecss Key ID
	AWS Secret Access Key [None] :접속한 계정의 Secret Key 
	Default region name [None] : 사용중인 region EX) ap-northeast-2
	Default output format [None] : json 또는 text (잘 모르겠으면 json)

 

"해당 계정 IAM 역할에 s3 액세스 권한이 있는지 확인하는 것도 필요하다."


- 인스턴스 설정

인스턴스에서의 설정은 두 가지가 필요하다. 우선적으로 톰캣로그를 백업해서 s3에 올릴 스크립트를 등록해주고 이 후 이를 종료 런타임에 캐치 할 수 있도록 service를 등록해주면 된다.

# cd /usr/local/sbin/
# vi test123.sh
# chmod 755 test123.sh

 

위에 위치에 적당한 스크립트를 작성해준다. 스크립트는 작성은 톰켓 로그의 저장장소 및 s3 구조마다 너무 다르기 때문에 따로 예시는 참고만 한다.

 

보통의 스크립트 플로우는 1. 톰켓 로그가 저장된 디렉터리를 압축 > 2. 해당 압축된 걸 S3 업로드 이과정을 거치면 된다.

#!/bin/bash -e

bucket_name=""
time=$(date "+%Y%m%d%k%M%S-%N")
server_name=""

echo "##########start s3 log backup $bucket_name sync##########"

aws s3 ls $bucket_name

cd /로그 상위 디렉토리 && tar -cvzf $time-$server_name.gz log/ && mv -f $time-$server_name.gz /로그파일이 저장될 위치

aws s3 sync /로그파일이 저장될 위치  s3://$bucket_name/$server_name

cd /로그파일이 저장될 위치 && rm -rf  $time-$server_name.gz

echo "##########end s3 log backup $bucket_name sync##########"

이후 아래 경로로 이동해서

# cd /etc/systemd/system/
# vi test123.service

 

서비스 확장 파일을 스크립트와 동일한 이름으로 만든다. 내용을 아래와 같은 형식으로 넣어 주면 된다.

[Unit]
Description=ec2 log s3 upload
DefaultDependencies=no
Before=shutdown.target halt.target
  
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/자신의스크립트명
  
[Install]
WantedBy=halt.target shutdown.target

 

이후 아래의 명령어를 통해 서비스를 활성화시켜주면 마무리된다.

# systemctl enable test123.service

# 아래 명령어로 시스템 등록 여부 확인
# systemctl list-unit-files | grep 자신의 서비스명

메인 이미지 출처 : Photo by Erwi on Unsplash