[AWS & Docker] Docker 컨테이너 로그를 AWS CloudWatch로 보내기
기존에는 EC2 우분투 환경에서 운영되는 프로그램들의 로그를 AWS CloudWatch에 전송할 수 있도록, 우분투에서 CloudWatch Agent 패키지를 설치하고 관련 설정을 진행했다.
이번에는 EC2(마찬가지로 우분투 환경)에서 Docker 컨테이너로 띄운 프로그램의 로그를 AWS CloudWatch에 전송할 수 있도록 설정을 해보자.
관련 공식 자료는 여기를 참고하자. (딱히 좋은 글인 것 같지는 않다...)
Credentials
EC2 상에서 운영되는 Docker 컨테이너의 로그를 AWS CloudWatch에 전송하기 위해서는 `awslogs` 로깅 드라이버를 사용해야 한다. 이를 위해 자격 증명(credentials)이 필요하며, 해당 자격 증명을 Docker 데몬에 전달해야 한다. 자격 증명이 필요한 이유는 EC2에 CloudWatch에 접근할 수 있는 역할(Role)을 부여해야 하기 때문이다.
제공할 수 있는 자격 증명은 다음과 같다.
- `AWS_ACCESS_KEY_ID`
- `AWS_SECRET_ACCESS_KEY`
- `AWS_SESSION_TOKEN`
- 기본 AWS 공유 자격 증명 파일(root 사용자의 `~/.aws/credentials`)
또는 AWS EC2 인스턴스 상에서 Docker 데몬을 실행하고 있다면, EC2 인스턴스 프로필로 충분한 것 같다(이 부분은 정확히 어떻게 번역을 해야 할지 모르겠다).
Instance Profile
인스턴스 프로필은 IAM Role(역할)을 저장하는 컨테이너로, EC2 인스턴스를 시작하면 인스턴스 프로필을 읽어서 설정된 IAM Role을 작동시킨다. 예를 들어, A 리소스에 접근가능한 IAM Role을 갖고 있는 인스턴스 프로필이 있다고 하자. 해당 인스턴스 프로필을 EC2에 연결하면 A 리소스에 접근할 수 있다.
이러한 이유로 Docker 데몬이 실행되고 있는 EC2에 인스턴스 프로필이 연결되어 있다면, 충분한 자격 증명이 되는 것 같다.
IAM Role(역할)
IAM Role은 계정에서 생성할 수 있는 특정 권한을 가진 임시 자격 증명이다. 권한은 AWS에서 제공하고 있는 클라우드 서비스와 그 서비스로 할 수 있는 작업, 행동에 관한 범위를 의미한다. IAM Role의 권한은 IAM Policy(정책)에 JSON 형식으로 정의된 문서로, 정책에 나열된 서비스와 작업에 의해 부여된다.
IAM Role 생성
AWS 콘솔에 접속 후 IAM 서비스로 이동한다.
IAM 대시보드의 왼쪽 메뉴에서 액세스 관리 > 역할을 클릭한다.
역할 생성 버튼을 클릭한다. 클릭 시 역할을 생성하기 위한 화면으로 이동한다.
1단계 신뢰할 수 있는 엔터티 선택은 생성할 IAM역할을 연결할 수 있는 서비스 또는 사용자 계정 등을 의미한다. 아래 신뢰할 수 있는 엔터티 유형 중에서 AWS 서비스를 선택한다.
사용 사례 - 서비스 또는 사용 사례에서 EC2를 선택하고, 선택 후 나오는 사용 사례에서 EC2를 선택한다. 이후 하단의 다음을 클릭한다.
다음을 클릭하면 2단계 화면으로 넘어간다. 2단계에서는 IAM Role에 IAM Policy를 추가하여 권한을 부여한다. Docker 공식 문서에서는 `logs:CreateLogStream`과 `logs:PutLogEvents` 정책을 적용해야 한다고 한다. 아래 화면에서 필터를 걸어 검색하니 나오지 않아서, 우선 여기서는 정책을 추가하지 않고 다음으로 넘어갔다.
다음으로 넘어가면 3단계가 나온다. 여기에서는 IAM 역할에 이름을 지정하고 설명과 태그를 추가할 수 있다. 이름은 해당 역할이 어떤 목적으로 생성되었는지 설명할 수 있도록 짓는다. 이후 아래로 스크롤을 내려 역할 생성을 클릭한다.
이후 생성한 역할을 클릭하고, 아래 권한 정책에서 권한 추가 > 인라인 정책 생성을 클릭한다.
아래와 같이 권한 지정 화면이 나오면, JSON 형식으로 정책을 편집할 수 있도록 JSON을 클릭한다.
그리고 아래와 같이 Action에 Docker 공식 문서에서 지정한 정책을 추가한다. 이후 스크롤을 내려 다음을 클릭한다.
다음을 클릭하면 방금 정의한 정책을 검토하는 화면이 나온다. 틀린 부분이 없다면 변경 사항 저장을 클릭한다.
이제 생성한 역할을 Docker 데몬이 실행되고 있는 EC2에 연결해야 한다. EC2 서비스로 이동한다. 역할을 연결할 EC2를 선택하고 작업 > 보안 > IAM 역할 수정을 클릭한다.
아래 화면에서 방금 생성한 IAM 역할을 선택하고 IAM 역할 업데이트를 클릭한다.
지금까지는 로그를 AWS CloudWatch로 보내는 역할과 정책을 설정했다. 이제 받은 로그를 보관할 공간을 생성하자.
CloudWatch
CloudWatch로 이동하여, 왼쪽 메뉴에서 로그 > 로그 그룹을 클릭한다.
로그 그룹 화면에서 로그 그룹 생성을 클릭한다.
아래 화면에서 로그 그룹 이름을 설정하고, 보존 설정은 원하는 대로 설정하면 된다. 다만 저장된 로그 용량이 크면 요금이 청구될 수 있다. 이 부분은 정확하지 않으니, 찾아보고 적절한 기간을 설정하자. 이름과 보존 설정 이후 스크롤을 내려 생성 버튼을 클릭한다.
방금 생성한 로그 그룹을 클릭하고 아래를 보면 로그 스트림 탭이 있다. 로그 스트림 생성을 클릭한다.
그룹 내에서 각 도커 컨테이너 또는 프로그램 별 로그를 식별할 수 있는 이름을 지정하고 Create을 클릭한다.
이제 AWS 설정은 완료되었다.
Docker
EC2 인스턴스 상에서 실행되는 Docker 컨테이너의 docker-compose.yml에 아래와 같이 내용을 추가한다.
version: '3'
services:
app:
...
logging:
driver: awslogs
options:
awslogs-group: "CloudWatch에서 설정한 로그 그룹 이름"
awslogs-region: "EC2 인스턴스가 존재하는 리전"
awslogs-stream: "로그 그룹 내에서 생성한 로그 스트림 이름"
위와 같이 설정하고 컨테이너를 다시 빌드하면 된다.
이후 5~10분 정도 기다리고, AWS CloudWatch에서 `awslogs-group`에 입력한 로그 그룹 > `awslogs-stream`에 입력한 로그 스트림으로 이동하면 컨테이너 로그를 확인할 수 있다.
🔖참고