본문 바로가기
데브옵스

Fluentd로 S3에 로그 저장하기

by __Minnie_ 2024. 11. 1.

이 글은 fluentd가 설치되었다는 것을 전제로 진행합니다.

만약 아직 fluentd를 설치하지 않았다면 fluentd 설치글을 참고하여 설치를 진행한 후 다시 진행해주시면 됩니다. 

 

먼저 S3에 로그를 전송하기 위해서 EC2에 iam역할을 생성해서 할당해줍니다.

 

IAM -> 역할에 접속한 후 역할 생성을 클릭합니다. 

 

 

엔터티의 경우, AWS 서비스 EC2를 선택하고 다음 단계로 넘어갑니다. 

 

 

S3FullAccess권한을 선택한 후 다음 단계로 넘어갑니다. 

 

 

그 다음 아래처럼 역할의 이름을 지정한 후 설정한 내용들이 맞는지 확인하고 iam역할을 생성합니다. 저는 AmazonS3FullAccess라는 이름을 사용하였는데, 각자의 네이밍 규칙에 맞게 설정해주시면 될 것 같습니다. 

 

이제 생성된 역할을 ec2에 연결해봅시다.

 

ec2 인스턴스에 접속하여 iam을 연결할 ec2를 선택하고 iam역할 수정 메뉴를 클릭합니다. (fluentd가 실행되고 있는 ec2입니다.)

 

 

여기서 방금 생성한 s3 full access 역할을 연결합니다. 

 

 

이제 ec2로 접속해서 fluentd를 설정해봅시다.

vi /etc/fluent/fluentd.conf
<source>
  @type tail
  tag nginx.log
  path /var/log/nginx/access.log
  pos_file /var/log/nginx/access.log.pos
  <parse>
    @type nginx
  </parse>
</source>

<match nginx.log>
  @type s3
  s3_bucket [버킷 이름]
  s3_region [region이름] 
  <buffer time>
    timekey 60
  </buffer>
</match>

저는 nginx로그를 올리기 위해서 source type은 tail로 설정해주었고, path는 nginx 로그의 기본 경로를 설정해주었습니다. tag는 nginx.log로 설정해주었습니다. pos_file은 log와 동일한 경로로 설정해주었습니다 (pos_file은 log 파일을 어디까지 읽었는지에 대한 정보를 저장하는 파일입니다). parse는 nginx 플러그인을 사용하도록 설정해주었습니다. 해당 플러그인을 사용하면 기존 string형태의 로그가 아니라 각 변수별로 값이 파싱되어 저장됩니다. 자세한 형식은 fluentd설치글의 제일 하단 부분을 참고하시면 됩니다. 

match부분에서 nginx.log태그를 가지고 있는 경우 s3 플러그인을 사용하여 업로드 하도록 하였고, buffer는 time으로 설정하여 60초에 한번씩 로그 데이터를 s3에 저장하도록 하였습니다. (일정 용량이 모이면 업로드 하도록 하는 것도 가능함)

 

fluentd --dry-run -c ./fluentd.conf
sudo systemctl restart fluentd.service

먼저 작성한 conf파일 문법에 문제가 없는지 확인하고 서비스를 재시작합니다.

 

그리고 1분 후 S3에 들어가보면 데이터가 잘올라오고 있는 것을 확인할 수 있습니다.