AWS Elastic Beanstalk Tomcat log를 CloudWatch로 Streaming 나의 경험담 2018. 6. 21. 21:20

AWS Elastic Beanstalk에서 Java Tomcat Platform을 사용하는 경우 Application 로그를 CloudWatch로 보내려면 .ebextensions의 추가 설정이 필요하다. Tomcat Application 로그를 CloudWatch로 스트리밍하고 필터를 적용하여 특정 문자열이 패턴 검출 될 때 알림을 발생하도록 적용했던 과정을 간단하게 정리해 둔다.


들어가기전, CloudWatch는 왜?

AWS의 CloudWatch는 정말 강력하다. 로그를 모니터링해서 이벤트를 발생시키고 그 이벤트를 기반으로 시작하는 다른 액션을 쉽게 구성할 수 있다. 무엇보다, 가격이 저렴하다. 안 쓸 수가 없다.ㅠ 웹 서비스의 특정 상황을 캐취해서 조치를 취하고 싶은데, 별도의 인스턴스 없이 콘솔에서 설정만으로도 가능하다니! 이건 정말 안 쓰면 무조건 손해다! 활용 방안도 무지 다양하기 때문에 꼭 한번 시간을 투자해서 알아보길 강추.

기본적으로 CloudWatch를 이용하면, 특정 String(e.g. Exception)을 패턴 검출해서, 검출될 경우 즉시 나에게 이 메일을 보내주도록 손쉽게 설정 할 수 있다.

nodejsTomcat의 어플리케이션 로그를 스트리밍 하면서 Exception이나 Error 패턴을 검출해서 이메일로 받으면, 내 서버에 문제가 생겼을때 바로 확인 할 수 있다. 웹 서버를 잘 설계하고 테스트 했더라도 다양한 사용자 환경에서 꼭 문제가 발생하기 마련인데, 그 상황을 잘 캐치할 수 있다는 점이 매력적이다.

예전에 내 개인 서버에 특정 파일을 업로드 하면 Exception이 나는 문제가 있었다. 자주 발생하는 것은 아니여서 모니터링 환경에서도 확인이 되지 않았는데, 우연히 로그를 확인하다 보니 하루에 2~3번씩 문제가 발생하고 있었는데, 6개월 동안 몰랐다.ㅠ 아무래도 전업으로 하는게 아니니까 자주 살펴볼 수 없는 나같은 사람에겐 정말 꼭 필요한 기능이다!

적용하기!

필요한 작업 목록

  1. Tomcat 로그가 CloudWatch로 전달되도록 .ebextensions 설정
  2. Elastic Beanstalk 에 CloudWatch 권한 주기
  3. Elastic Beanstalk 에서 Log를 CloudWatch 로 스트리밍하도록 설정
  4. CloudWatch 에서 원하는 로그 그룹에 Filter 설정
  5. Filter에 알람 추가

.ebextensions 설정하기

Elastic Beanstalk 환경의 Amazon EC2 인스턴스의 로그 보기을 보면, Tomcat Application Log는 기본적으로 스트리밍이 안된다. .ebextensions에 추가 설정이 필요한데, 현재 프로젝트에 사용하고 있지 않다면, 추가하는 방법은 아래 링크를 참조해서 프로젝트 빌드 환경에 맞게 추가 하면 된다.

Where to add .ebextensions in a WAR?

.ebextensions을 추가하면 설정으로 다양한 작업을 할 수 있는데, 지금 필요한건 Files 설정으로 tomcat 로그를 특정 파일로 저장하는 것이다.

files:
    "/etc/awslogs/config/mycustom.conf" :
        mode: "060606"
        owner: root
        group: root
        content: |
            [/var/log/tomcat8/catalina.out]
            log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/tomcat8/catalina.out"]]}`
            log_stream_name = {instance_id}
            file =/var/log/tomcat8/catalina.out*

위와 같이 설정할 경우, /etc/awslogs/config/mycustom.conf의 파일에 [/var/log/tomcat8/mycustomlog.log]부터 아래 내용을 쓴다는 설정이다. /etc/awslogs/config/의 위치는 사전에 정의된 것으로 추가 로그 파일을 스트리밍하기 위해서는 꼭 해당 폴더 아래 위치해야 한다. CloudWatch에서 사용될 log_group_namelog_stream_name도 설정해 준다. 이름은 좋을대로 바꿔도 된다.

Elastic Beanstalk 에 CloudWatch 권한 주기

지금 하려는 작업을 실제 수행하는 인스턴스는 Elastic Beanstalk의 인스턴스이며, 그 인스턴스 내부에 CloudWatch Logs 에이전트가 /etc/awslogs/config/위치에 정의된 내용의 설정대로 로그를 CloudWatch로 스트리밍 해주는 것이다. 따라서, 이 인스턴스가 CloudWatch를 엑세스 할 수 있는 권한을 갖아야 한다.

IAM 콘솔로 접속해서 Elastic Beanstalk에 주어진 Role을 선택하고, CloudWatchLogsFullAccess policy 붙여줬다. 귀찮아서 통으로ㅎ


Elastic Beanstalk 에서 Log를 CloudWatch로 스트리밍하도록 설정

Elastic Beanstalk 콘솔에서 Log 스트리밍 설정을 켠다. 모니터링 쪽에도 헬스체크 로그를 스트리밍하는 것이 있는데, 헷갈리지 말고 Configuration > Software > Instance log streaming to CloudWatch Logs 에서 설정해야 한다. 저장 기간도 설정할 수 있으며, 저장 기간동안 CloudWatch에 저장된다. 중간에 S3로 export 할 수도 있다.

CloudWatch 에서 원하는 로그 그룹에 Filter 설정

이제 CloudWatch로 이동해서 필터를 설정하자! 나는 Exception 패턴 검출...단순;

Filter에 알람 추가

1시간 동안 1회라도 발생하면 나에게 이메일 발송 설정! 저기 Notification 목록은 SNS 콘솔에 접속하면 확인 할 수 있으며, SNS를 이용해서 Lambda를 돌리거나 다른 액션도 트리거 할 수 있다.

발생할 수 있는 문제!

  1. 권한 문제 - Elastic Beanstalk 에 로그 그룹을 생성할 수 있는 권한이 없으면 에러가 난다. /var/log/awslogs.log 에 출력됨
  2. .ebextensions 파일의 문법 오류 http://www.yamllint.com/ 에서 확인해보기
  3. SSH 로 접속해서 /etc/awslogs/config/위치에 파일이 제대로 생성되었는지 내용 확인

참고

Elastic Beanstalk Configuration files(.ebextensions)
Setting up Cloudwatch for Custom logs in AWS Elastic Beanstalk
구성 파일(.ebextensions)을 사용하여 고급 환경 사용자 지정
AWS Elastic Beanstalk: Add custom logs to CloudWatch?
CloudWatch Logs 에이전트 참조

댓글