[AWS] EC2 Application Logging (with Fluent-Bit)

Jeongtae Kim·2023년 9월 9일
0

AWS

목록 보기
8/13
post-thumbnail

오늘은 EC2 애플리케이션의 로그를 Fluent-Bit로 수집하여 CloudWatch Log, Kinesis Data Stream으로 보내봅시다.

0. 애플리케이션 준비

  1. 일단 간단하게 EC2 인스턴스를 하나 생성합니다. 저는 Amazon Linux 2023 AMI를 사용했습니다.

  1. SSH로 접속해서 애플리케이션 하나를 실행하겠습니다.
pip3 install flask
nohup python3 app.py &
  1. 저는 다음과 같은 로그 포맷을 사용하겠습니다.
[2023-09-09 10:15:58,913] 127.0.0.1 - - GET /v1/color/red HTTP/1.1 200
[시간] 클라이언트_IP주소 - - HTTP_메서드 URL HTTP_버전 HTTP_상태_코드

1. Fluent-Bit 설치

curl https://raw.githubusercontent.com/fluent/fluent-bit/master/install.sh | sh

sudo systemctl start fluent-bit
sudo systemctl enable fluent-bit

sudo ln -s /opt/fluent-bit/bin/fluent-bit /usr/local/bin/fluent-bit

active (running) 이라고 뜨면 성공적으로 설치된 것입니다.

2. Fluent-Bit 설정 파일 수정

  1. Fluent-Bit 설정 파일 위치로 이동합니다.
cd /etc/fluent-bit
  1. fluent-bit.conf 파일을 수정합니다.
sudo vim fluent-bit.conf
  • 기존 INPUT, OUTPUT 설정을 제거하고, 다음과 같은 내용을 추가합니다.
[INPUT]
    Name tail
    Path /home/ec2-user/app/app.log
    Tag i-0dda95ee7ee5db532
    Parser logNoDate

[INPUT]
    Name tail
    Path /home/ec2-user/app/app.log
    Tag kinesis
    Parser logParser
    
[OUTPUT]
    Name cloudwatch_logs
    Match i-*
    region ap-northeast-2
    log_group_name ec2/app/accesslog
    log_stream_prefix ec2_
    auto_create_group On
    
[OUTPUT]
    Name kinesis_streams
    Match kinesis
    region ap-northeast-2
    stream ec2-logStream
    time_key time
    time_key_format %Y-%m-%d %H:%M:%S
  • Before
  • After
  1. parsers.conf 파일에 다음과 같은 내용을 추가합니다.
[PARSER]
    Name logNoDate
    Format regex
    Regex ^\[(?<time>[^\]]*)\] (?<host>[^ ]*) - - (?<method>[^ ]*) (?<path>[^ ]*) (?<HTTP>[^ ]*) (?<code>[^ ]*)

[PARSER]
    Name logParser
    Format regex
    Regex ^\[(?<time>[^\]]*)\] (?<host>[^ ]*) - - (?<method>[^ ]*) (?<path>[^ ]*) (?<HTTP>[^ ]*) (?<code>[^ ]*)
    Time_Key time
    Time_Format %Y-%m-%d %H:%M:%S,%L
    Time_Keep Off

3. AWS 사전 준비

  1. 설정 파일에서 지정한 이름으로 Data Stream을 생성합니다.
  2. EC2용 IAM Role을 생성하고, IAM Policy 2개를 생성하여 적용합니다.
  • CloudWatch Log용 IAM Policy
{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": [
			"logs:CreateLogStream",
			"logs:CreateLogGroup",
			"logs:PutLogEvents"
		],
		"Resource": "*"
	}]
}

  • Kinesis Data Stream용 IAM Policy
{
	"Version": "2012-10-17",
	"Statement": [{
		"Effect": "Allow",
		"Action": [
			"kinesis:PutRecords"
		],
		"Resource": "*"
	}]
}

  • IAM Policy 적용
  1. IAM Role을 EC2 인스턴스에 부착합니다.

4. Fluent-Bit 재시작 및 작동 확인

  1. 설정 파일을 적용하기 위해서 Fluent-Bit를 재시작합니다.
sudo systemctl restart fluent-bit
  1. curl을 해서 로그를 생성합니다.
curl localhost:8080/v1/color/red
curl localhost:8080/v1/color/orange
curl localhost:8080/v1/color/melon
  1. CloudWatch Log Group과 Stream이 생성됐습니다.

로그도 잘 기록됐습니다.

  1. Kinesis Data Stream에 Kinesis Data Firehose를 연결하여 동작을 확인했습니다.

오늘의 글은 여기까지입니다. 감사합니다!

profile
유용할지도 모른다.

0개의 댓글