고스락 티켓 예매 프로젝트에서 이번에 배포는 각 프로젝트 레포지토리(어드민, 프론트 , 백엔드)에서 main 브런치에서 github action 을 통해 도커를 빌드하고, deploy 레포지토리에서 github-action을 통해 도커 이미지를 배포하고 있다.
elasticbeanstalk은 로깅까지 자동으로 설정해 주지만, 이번 프로젝트는 ec2 에 docker를 깔고 (ligthsails는 안그래도될지도..) docker-compose를 이용해서 배포를 하고 있다.
환경변수 다음으로 중요한게 로깅아니겠는가... 아무리 프로젝트라도 로깅 방법은 알아보는게 좋을것 같아 시도하게 되었다. 필자는 쿠버네티스에서 fluentd 를 이용해 json format의 로그만 필터링해 elasticsearch로 보내 검색이 가능하게 설정한 적은 있다. 각설하고 방법부터 알아보자.
이글을 통해서 얻을 수 있는 것들.
- docker-compose로 aws ec2에 배포시에 cloudwatch에서 로그를 받을 수있는 방법
credentials
막상 할려고 찾아보니 좋은 글이 보이지 않아 오늘도 도큐멘트를 봤다.
끝에보면 (제일 중요한 내용을 빼먹다니, 싫어요가 좋아요의 2배이상인 이유를 알았다. 나도 눌렀다.)
간단하다. if you are running the docker daemon on an ec2, ec2 instance profile. 이대목을 보면 된다. 인스턴스 프로파일은 어세스, 시크릿 토큰 필요없이 해당 ec2에 바로 역할을 연결 할 수 있다고 보면 될것 같다. 만일 저 credentials를 설정을 안하면
위와 같은 에러를 보게 될것이다. 결국 여러분이 운영하는 ec2에 cloudwatch에 접근을 할 수 있는 role을 부여을 해야하는데 instance profile 이란건, aws ec2 내부에 보안 파일을 aws 에서 알아서 관리해준다는 것이다. 즉 여러분은 cli든 콘솔이든 iam을 ec2에 부여해주게 되면 해당 ec2 내부에 credential이 자동으로 부여되고, docker는 친절하게도 해당 credentials 인증 정보를 가지고 cloudwatch에 요청을 awslog driver과 함께 전달해 준다고 보면된다.
자 그럼 ec2에 role을 부여해보자.
iam
여러분들의 ec2 인스턴스를 클릭하고 우측 상단의 작업 -> 보안에 들어가보면 iam 역할 수정을 들어갈 수 있을 것이다.
들어가보면 아직 iam을 만들지 않았으므로 역할 만들기를 들어가 역할 생성에 들어가야한다.
들어가게되면 ec2 사례를 클릭하고, 권한 설정을 해야한다. 역할이있으면 그 역할에 권한을 부여하는 것이다. 들어가게 되면 아직 여러분은 ( 물론 cloudewatch log fullaccess) 가 있지만 docker의 공식문서에서 CreateLogStream, PutLogEvents 두개의 권한을 요구하고있다.
해당정책을 생성한뒤에 만들었던 권한을 iam에 연결해주면 끝이다. 옆에 새로고침 버튼있으니 누르시라.
이로써 iam과 , iam에 cloudwatch에 로그를 보낼 수 있는 권한을 연결했으니 남은건 ec2에 iam을 연결하고, docker-compose에 log설정, 그리고 cloudwatch에 로그를 담을 공간과 스트림을 설정 해주면 되는것이다.
cloudwatch log stream
로그를 보내는 역할 까진 설정했는데 로그를 담을 공간이 필요하지 않는가. aws cloudwatch 콘솔에 들어가서 로그 그룹과 스트림( 이거 지정안하면 docker 컨테이너id로 들어가버림)을 만들면된다. 버튼.. 만 클릭하면되니 길게 설명안하고 사진한장 첨부하겠다.
docker-compose
이제... 로그 담을 공간을 설정했겠다. 필자는 nginx 로그 까지는 필요없구 백엔드 로그 하나만 필요했었다.
version: "3.7"
services:
backend:
image: water0641/ticket-backend:main
container_name: backend
hostname: backend
environment:
- MONGO_URI=${MONGO_URI}
- JWT_KEY_ADMIN_ACCESS=${JWT_KEY_ADMIN_ACCESS}
- JWT_KEY_MESSAGE=${JWT_KEY_MESSAGE}
- JWT_KEY_FRONT_ACCESS=${JWT_KEY_FRONT_ACCESS}
- NAVER_SERVICE_ID=${NAVER_SERVICE_ID}
- NAVER_ACCESS_KEY=${NAVER_ACCESS_KEY}
- NAVER_SECRET_KEY=${NAVER_SECRET_KEY}
- NAVER_CALLER=${NAVER_CALLER}
expose:
- "5000"
logging:
driver: awslogs
options:
awslogs-group: "gosrock-backend-log"
awslogs-region: "ap-northeast-2"
awslogs-stream: "backend"
logging 부분을 보면 ,드라이버를 awslogs로 설정하고, 아까 설정했던 그룹이름과 , 스트림을 적어주면 된다. 백엔드로그말고 다른 nginx를 받고싶다면 스트림만 변경하면 된다.
이로써 클라우드 와치에 로깅을 설정하는 방법을 알아보았다. 실은 이렇게 하는건 거의 쓸모없는거랑 마찬가지다. json 로그 포멧으로 남겨야하는데 winston 같은걸 사용해서 로그포맷을 json으로 남겨야 분석에 활용 할 수가있다. 필자는 일반 console 로그(개발용)와 winston으로 남긴 중요한 로그를 fluentd 를 이용해서 json 포맷만 받아들여 elasticsearch로 보내 분석에 활용한적이 있는데 아마 fluentd를 하나 띄워놓고, json 로그 포맷만 받아들이면 중요한 로그들만 받아볼 수있을것이다.
'프로젝트' 카테고리의 다른 글
[고스락 티켓 2.0] 두번째 프로젝트는 어떻게 달라졌을까요? (4) | 2022.08.13 |
---|---|
Github labels github action으로 설정하기 (0) | 2022.08.12 |
디프만 11기 지도 위 실시간 채팅 앱 티키타카 개발기 (1) | 2022.08.11 |
고스락 티켓예매 프로젝트 (0) | 2022.01.26 |
NCP kubernetes docker desktop context 설정하기 (5) | 2022.01.24 |