Dev/DevOps, Infra

[Docker, AWS] Docker log를 AWS Cloudwatch에서 보기

HJChung 2021. 10. 22. 12:29

EC2에서 docker를 실행시키는 경우 container의 log가 EC2 자체에 저장된다.

즉, container의 로그는 /var/lib/docker/containers/[contianer ID]/container-cached.log 에 모이게 되는데,

이렇게 되면 instance에 직접 들어가서 docker logs [container ID] 로 확인하거나 저 파일에 들어가서 로그를 하나하나 확인해야 한다. 

 

그래서 효율적인 로그 관리를 위해서는 container의 log를 cloudwatch로 실시간 export 하는 과정이 필요하다. 

그리고 추가적으로 

Cloudwatch에는 Log groups이 있고 그 안에 Log Streams이 있고 각 stream안에 log들이 모이게 되는데 

이 때 Log Streams 이름을 각각의 instance id로 해줘서 어느 instance에서 발생한 컨테이너의 로그인지 구분 가능하게 해주고 싶었다. 

 

그러기 위해 Log Streams를 건드릴수 있는 방법은 

 

방법 1) instance에서 cloudwatch agent 설치를 해주고 conf파일에 /var/lib/docker/containers/[contianer ID]/container-cached.log를 cloudwatch로 보내게 한다. 그 때의 stream은 instance_id가 되게 한다.

참고 자료) https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/QuickStartEC2Instance.html 

장점) instance_id로 로그 식별 가능(즉, 어느 instance에서 발생한 특정 container의 log인지 바로 알 수 있음)

단점) instance 각각 하나씩 들어가서 cloudwatch agent 설정을 해주어야 하고, /var/lib/docker/containers/[contianer ID]/container-cached.log에 있는 내용 중 binary(?) 로 보이는 내용은 깨져서 나옴.

하지만 위의 방법은 instance마다 또 매번 설정을 해주어야 한다는 점이 불편하고 관리가 쉽지 않을 것이라 생각해서 사용에 적절하지 않다고 판단했다. 

 

그래서 

 

방법 2) docker-compose에 awslogs 적어주기

참고자료) Amazon CloudWatch Logs logging driver https://docs.docker.com/config/containers/logging/awslogs/

장점)

1. instance마다 들어가서 cloud watch agent 설치나 conf파일을 작성해주지 않아도 되고 코드만 작성 해두면 docker-compose할 때 자동으로 로그가 cloudwatch로 보내짐.

2. docker logs [container ID]로 봤을 때와 같은 형태로 cloudwatch에 저장되기 때문에 보기도 예쁨

단점) instance_id를 식별가능하게 stream을 지정해줄 수 없기 때문에 어느 instance에서 발생한 로그인지 containerID로 하나하나 찾아봐야함.

이러한 단점을 보완하기 위해 Log Streams 말고, log메세지 자체에 instance_id를 명시하여 어떤 instance의 로그인지 구분 가능하게 하였다. 

 

Instance id를 가져오는 방법은 https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html방법을 사용할 수 있다. 

isntance_id = urllib.request.urlopen(
    'http://169.254.169.254/latest/meta-data/instance-id').read().decode()
logger = logging.getLogger(f”{instance_id}-[LOG]")