상세 컨텐츠

본문 제목

경력 0개월차 개발자의 고래 해체 작업 썰 - 3 [ECS task-definitions]

소프트웨어/인프라

by moonionn 2021. 10. 4. 21:28

본문

오늘의 차례

 

1. 테스트용 EC2 서버 생성

2. 테스트용 EC2 위 redash 환경 구성

3. 기존 데이터베이스 백업 및 RDS로 이전 (+ PostgreSQL 버젼 업그레이드)

* 4. ElastiCache 생성 및 연동

5. ECS Cluster 생성

6. docker-compose를 기반으로 Task-definitions 작성

7. NLB 적용

8. CORS 처리

9. 도메인 적용

 

* ElastiCache보다 docker로 redis 띄우는 게 더 경제적이기 때문에 패스하게 되었습니다.

 


5. ECS Cluster 생성

클러스터를 생성하는 것 자체는 매우 간단합니다.

 

AWS에서 ECS를 검색하면 바로 Elastic Container Service가 뜹니다.

 

저희는 Fargate 기반의 서비스를 띄울 것이니 네트워킹 전용 옵션을 누르면 끝.

짠 클러스터 완성.

다만 현재 이 클러스터는 빈박스에 불과한 상태입니다.

이 클러스터의 내용물을 정의하는 게 바로 작업 정의(task definitions)입니다.

왼쪽 사이드 메뉴를 보면 클러스터 바로 아래 작업 정의가 있네요.

 


6. Task-definitions 작성

저는 현재 root 계정으로 테스트 작업중이라 태스크 역할을 패스했는데, IAM 계정이라면 다를 수 있습니다.

 

작업 크기를 정해줘야 합니다. 저의 경우 EC2의 스펙과 동일하게 갔습니다.

redash가 메모리를 꽤 많이 잡아먹는 프로그램이기 때문에 8기가 메모리정도는 되어야 하더군요.

이제 아래 컨테이너 추가 버튼을 눌러 컨테이너를 하나씩 추가해봅시다.

 

작업정의를 작성하려면 redash의 docker-compose.yml 파일을 참고해야 합니다.

docker-compose.yml 파일의 일부분을 보자면

services:
  server:
    <<: *redash-service
    command: dev_server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
      - "5678:5678"
    environment:
      <<: *redash-environment
      PYTHONUNBUFFERED: 0
  scheduler:
    <<: *redash-service
    command: dev_scheduler
    depends_on:
      - server
    environment:
      <<: *redash-environment
  worker:
    <<: *redash-service
    command: dev_worker
    depends_on:
      - server
    environment:
      <<: *redash-environment
      PYTHONUNBUFFERED: 0

이렇게 생겼는데요, services가 포함하고 있는 서비스 하나하나가 하나의 컨테이너이며, 각 서비스마다 command, dependency, environment가 별도로 존재합니다. 우선 메인 프로그램인 server 먼저 컨테이너에 적용해 보겠습니다.

 

컨테이너 이름은 명시된대로 server로 하고, 이미지는 도커 허브에 있는 redash 이미지를 가져다 쓰겠습니다. docker-compose.yml에 있는 scheduler, worker와 같은 프로그램도 전부 해당 이미지를 사용할 것입니다.

 

포트 매핑또한 yml 파일에 나와있는 것처럼 5000포트와 5678 포트를 열어줍니다. 다만 현재 이 작업 정의는 Fargate 기반이기 때문에 EC2처럼 호스트 컴퓨터의 포트와 매핑된다기 보다는, 추후 연결될 로드 밸런서에 열어줄 포트를 명시하는 것이라 이해하면 되겠습니다.

 

진입점과 명령 부분은 각자 entrypoint와 command를 의미합니다. 여기도 마찬가지로 docker-compose.yml 파일에 나와있는대로 적어주면 됩니다.

 

이제 환경 변수를 설정해줄 차례입니다. 편하게 key: value를 그냥 적어놓으면 편하겠지만.. 이런 방법은 AWS에서도 권장하는 방법은 아니며 (당연한 말이지만, 보안 문제 때문에...), 안전하게 환경변수를 컨테이너로 전달해주기 위해 우리는 세 가지 방법을 사용할 수 있습니다.

 

1. S3에 env 파일을 올려놓고 불러오기

2. Secrets Manager에서 환경 변수 불러오기

3. 그 외 환경 변수 제공 서비스 사용하기

 

저는 여기서 2번 방법을 써보도록 하겠습니다.

 

redash의 env 파일 내용은 아래와 같습니다.

REDASH_DATABASE_URL은 AWS RDS로 옮겼으니 해당 RDS의 엔드포인트로 설정되어 있습니다.

PYTHONUNBUFFERED=0
REDASH_LOG_LEVEL=INFO
REDASH_REDIS_URL=redis://redis:6379/0
POSTGRES_PASSWORD=password
REDASH_COOKIE_SECRET=cookie-secret-123
REDASH_SECRET_KEY=secret-key-123
REDASH_DATABASE_URL=postgresql://postgres:password@rds-name.123456789012.ap-northeast-2.rds.amazonaws.com/postgres

 

암호 유형을 '다른 유형의 보안 암호' 로 설정하고, 키/값에 해당 env 파일의 내용들을 적어줍니다.

몇 줄 예시로 적어보았는데, redis 서버의 경우, 기존에는 redis://redis:6379/0였지만 우리는 fargate 기반 ECS를 사용할 것이기 때문에 localhost:6379/0으로 변경해줍니다. fargate 기반 클러스터 내의 모든 컨테이너들은 서로 localhost로 통신할 수 있기 때문입니다.

 

보안 암호 이름을 설정해주고 저장합니다.

 

이제 생성된 보안 암호의 ARN을 복사해줍니다.

 

그리고 다시 컨테이너 정의로 돌아와서, 아래와 같이 기입해주면 됩니다.

 

* 이 방법이 통하지 않을 수 있습니다.

바로 제가 그랬는데요... 왜인지 secrets manager에서 해당 값을 불러오지 못했습니다. 이때 우선적으로 확인해야 하는 것은 secrets manager의 접근 권한 policy가 잘 설정되었는지 체크하는 것입니다.

저는 이런 문제는 아니었고... 여전히 원인을 찾지 못했지만... 그래서 다른 방법으로 우회해보았습니다.

 

S3에서 해당 파일을 불러오는 방법을 사용할 수도 있습니다.

마찬가지로 env파일을 저장하고 있는 S3 ARN을 붙여넣는 방식으로 사용할 수 있습니다.

 

여기서 잠깐, 다시 docker-compose.yml 파일을 보면 depends_on 부분이 눈에 들어오는데요,

services:
  server:
    <<: *redash-service
    command: dev_server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
      - "5678:5678"
    environment:
      <<: *redash-environment
      PYTHONUNBUFFERED: 0

이는 server라는 프로그램이 실행되기 전 redis와 postgres가 실행되어야 함을 의미합니다. 따라서 지금 작성하고 있는 server container definitions는 redis container definitions가 먼저 작성되어야 완성됩니다. (postgres는 rds니까 패스)

 

그러니 redis 컨테이너를 먼저 명시해 주도록 합니다.

 

이제 다른 컨테이너에서 redis 컨테이너를 바라보게 할 수 있습니다. 종속 관계 순서에서 이 관계를 설정할 수 있는데요, redis 프로그램이 시작해야 server 프로그램이 실행되도록 설정해주었습니다.

 

이제 아래처럼 네 개의 컨테이너가 띄워졌습니다.

 

완료를 누르면 redash:1 이라는 이름으로 작업 정의가 생성됩니다.

cli 환경에서 유용하게 쓰이는 JSON 파일도 여기서 참고해 쓸 수 있습니다.

관련글 더보기

댓글 영역