[AWS] Elastic Beanstalk Docker + Cloud Watch Custom Log

민수·2023년 9월 6일

Elastic Beanstalk이란

인프라에 대해 자세히 알지 못해도 AWS 클라우드에서 애플리케이션을 쉽게 배포 할 수 있게 해주는 AWS 서비스이다.
GO, Java, .NET, Node.js, PHP, Python 및 Ruby에서 개발한 애플리케이션을 지원한다.
Elastic Beanstalk 서비스 자체에는 요금이 없지만 Elastic Beanstalk 서비스를 이용하면서 만들어지는 리소스에 대해서는 요금이 부과된다.

Cloud Watch란

AWS에서 제공하는 인프라 리소스에 대한 실시간 모니터링 기능과 다양한 이벤트들을 수집하여 로그 파일로 저장, SNS로 알람 전송 등의 기능을 제공하는 서비스이다.

소스 코드 다운로드

git clone https://github.com/cloudcoke/beanstalk_cloudwatch_sample.git
cd beanstalk_cloudwatch_sample/scripts
bash zip_script.sh

스크립트를 실행하면 app.zip 파일이 생성된다.

이 파일은 이후에 생성할 Elastic Beanstalk 애플리케이션에서 사용할 예정이다.

Dockerfile

FROM node:16 AS builder
# node:16 이미지를 builder로 사용한다.
# multi-stage build라는 방법을 이용해 빌드에는 필요하지만 최종 컨테이너 이미지에는 필요 없는 환경을 제거할 수 있다.

WORKDIR /app
# 작업 디렉토리를 지정한다.
COPY . .
# 로컬에 있는 파일을 작업 디렉토리로 복사한다. (COPY local_location docker_location)

RUN npm install
RUN npm run build
# 패키지를 설치하고 빌드를 진행한다.

FROM node:16-alpine
# node 16이 설치되어 있는 alpine 리눅스 이미지를 사용한다.

WORKDIR /app
# 작업 디렉토리를 지정한다.

COPY --from=builder /app/package*.json ./
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
# builder로 부터 필요한 파일들을 작업 디렉토리로 복사한다.

EXPOSE 3000
# 3000번 포트를 외부에 노출한다.

CMD ["npm", "run", "start:prod"]
# 컨테이너가 실행될 때 실행할 명령어를 지정한다.

Dockerrun.aws.json

Docker 이미지를 Elastic Beanstalk 애플리케이션으로 배포하는 방법을 명시하는 파일이다.

{
  "AWSEBDockerrunVersion": "1",
  "Ports": [
    {
      "ContainerPort": 3000,
      "HostPort": 3000
    }
  ],
  "Volumes": [
    {
      "HostDirectory": "/var/log/info",
      "ContainerDirectory": "/app/logs/info"
    },
    {
      "HostDirectory": "/var/log/warn",
      "ContainerDirectory": "/app/logs/warn"
    },
    {
      "HostDirectory": "/var/log/error",
      "ContainerDirectory": "/app/logs/error"
    }
  ]
}

Ports : 컨테이너 포트와 호스트 포트를 3000번 포트로 매핑한다.
Volumes : CloudWatch로 로그를 전송하기 위해 컨테이너에 있는 로그 파일이 필요한데 이를 호스트에 마운트 시켜서 로그 파일을 공유한다.

.ebextensions/logInit.config

Elastic Beanstalk에서는 ebextensions를 통해 환경을 지정하고 구성할 수 있다.
인스턴스 프로비저닝 중에 실행할 명령을 추가하고, 인스턴스에서 파일을 다운로드 하거나 직접 생성할 수 있다.

files:
  "/opt/aws/amazon-cloudwatch-agent/bin/config.json":
    mode: "000600"
    owner: root
    group: root
    content: |
      {
        "agent": {
          "metrics_collection_interval": 30,
          "region": "ap-northeast-2"
        },
        "logs": {
          "logs_collected": {
            "files": {
              "collect_list": [
                {
                  "file_path": "/var/log/info/*.log",
                  "log_group_name": "beanstalk_docker_info.log",
                  "log_stream_name": "beanstalk_docker_stream_info.log"
                },
                  {
                  "file_path": "/var/log/warn/*.log",
                  "log_group_name": "beanstalk_docker_warn.log",
                  "log_stream_name": "beanstalk_docker_stream_warn.log"
                },
                  {
                  "file_path": "/var/log/error/*.log",
                  "log_group_name": "beanstalk_docker_error.log",
                  "log_stream_name": "beanstalk_docker_stream_error.log"
                }
              ]
            }
          }
        }
      }
      
container_commands:
  start_agent:
    command: /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

/opt/aws/amazon-cloudwatch-agent/bin/config.json 파일에 aws cloudwatch agent 설정을 추가하였다.
container_commands에 cloudwatch agent에 설정을 적용하는 명령어를 작성하였다.

Elastic Beanstalk 애플리케이션 생성하기

  • 애플리케이션 생성을 클릭한다.

  • 환경은 웹 서버 환경을 선택한다.

  • 애플리케이션 이름을 작성한다.

  • 애플리케이션 이름을 작성하면 환경 이름은 자동으로 기입된다.

  • 플랫폼 유형으로는 관리형 플랫폼을 선택하고 플랫폼을 Docker로 선택한다.

  • 코드 업로드를 선택하고 버전 레이블을 작성한다.

  • 위에서 생성한 ZIP 파일을 업로드 한다.

  • 단일 인스턴스를 사용한다.

  • 새 서비스 역할 생성 및 사용을 선택해 Beanstalk이 사용할 서비스 역할을 생성한다.

  • EC2 인스턴스 프로파일에 사용할 역할을 생성하기 위해 IAM 서비스로 이동한다.

  • 역할 만들기를 선택한다.

  • AWS 서비스를 선택하고 일반 사용 사례에서 EC2를 선택하고 다음을 선택한다.

  • 권한 정책에서 CloudWatchAgentServerPolicy를 선택한다.

  • EC2에서 CloudWatch로 로그를 전송하기 위한 정책이다.

  • 다음을 선택한다.
  • 이름을 지정한다.
  • 선택한 권한이 맞는지 확인한다.
  • 역할 생성을 선택한다.
  • 추가로 권한을 추가하기 위해서 생성한 역할을 선택한다.
  • 권한 추가를 선택한다.
  • 정책 연결을 선택한다.
  • AWSElasticBeanstalkWebTier를 선택하고 권한 추가를 선택한다.
  • 권한이 추가된 것을 확인한다.
  • 다시 Elastic Beanstalk 애플리케이션 생성으로 돌아와서 서비스 역할 이름과 EC2 키 페어, EC2 인스턴스 프로파일을 지정한 뒤 검토 단계로 건너뛰기를 선택한다.
  • 제출을 선택한다.
  • 배포가 완료되면 상태가 아래와 같이 OK가 나온다.
  • CloudWatch 서비스로 이동해 beanstalk_docker_info.log 로그 그룹이 생성되었는지 확인하고 생성되었다면 선택해 자세한 정보를 확인한다.
  • beanstalk_docker_stream_info.log라는 로그 스트림도 생성이 잘 되었는지 확인하고 선택해 자세한 정보를 확인한다.
  • 로그가 정상적으로 저장된 것을 확인할 수 있다.
  • Elastic Beanstalk으로 돌아와 도메인에 접속해본다.
  • 아래와 같은 메시지가 나온다.
  • 로그를 다시 확인해 보면 새로운 로그가 추가 된 것을 확인할 수 있다.

0개의 댓글