AWS ECS(with Fargate), GitHub, DockerHub, CircleCI를 활용해 서비스 자동 배포 하기(2)

modolee
Day34 Inc.
Published in
10 min readDec 3, 2019

기존 서비스 배포 시 프로세스의 불편함 점을 파악하고 개선하기 위해 도입한 과정을 총 3편에 걸쳐서 소개하려고 한다.

  1. 문제점 파악 및 개선방안
  2. AWS ECS 설정
  3. Circle CI 설정 및 자동 배포 적용

AWS ECS 설정

  • AWS > 서비스 > Amazon ECS 메뉴를 선택해서 ECS 서비스 화면으로 이동

클러스터 생성

  • 클러스터 생성
  • 클러스터 템플릿 선택 : 네트워킹 전용 (AWS Fargate 제공)
  • 클러스터 구성
    - 클러스터 이름 : boilerplate
  • 클러스터 생성 완료

작업 정의 생성

  • 새 작업 정의 생성
  • 시작 유형 호환성 선택 : Fargate
  • 작업 및 컨테이너 정의 구성
    - 작업 정의 이름 : boilerplate-nodejs
    - 호환성 요구 사항 FARGATE
    - 작업 역할 : 없음
    - 네트워크 모드 : awsvpc
  • 작업 실행 IAM 역할
    - 작업 정의를 처음으로 생성하는 경우 새 역할 생성 을 선택하면 ecsTaskExecutionRole 이 생성 된다.
    - 이 후에 작업 정의를 생성할 때는 ecsTaskExecutionRole을 선택하면 된다.
  • 작업 크기
    - 샘플 프로젝트 이기 때문에 최소한으로 설정. 실제 프로젝트에서는 컨테이너가 필요한 만큼 할당하면 된다.
    - 작업 메모리(GB) : 0.5GB
    - 작업 CPU(vCPU) : 0.25 vCPU
  • 컨테이너 정의
    - 컨테이너 추가
  • 컨테이너 구성 (표준)
    - 컨테이너 이름 : boilerplate-nodejs
    - 이미지 : day34/boilerplate-nodejs
    - 포트 매핑 : 80 / tcp
  • 컨테이너 구성 (고급)
    - 환경 > 환경변수 : 컨테이너에서 사용할 환경 변수 설정 (이 포스트에서는 day34/boilerplate-nodejs 이미지를 컨테이너로 만들 때 필요한 환경변수를 포함하고 있다)
    - SERVER_HOST : 0.0.0.0
    - SERVER_PORT : 80
    - API_END_POINT : http://localhost
  • 설명 완료 후 추가 버튼 클릭
  • 컨테이너 추가 완료 후 생성 클릭
  • 작업 정의 생성 확인
    - 작업 정의에 boilerplate-nodejs가 생성되고 최종 개정 상태가 ACTIVE인 것을 확인

LoadBalancer 생성

  • AWS > 서비스 > EC2 > 로드밸런싱 > 로드밸런서
  • 로드 밸런서 생성
  • 로드 밸런서 유형 선택 : Application Load Balancer
    - 생성버튼 클릭
  • 기본 로드 밸런서 구성
    - 이름 : boilerplate-alb
    - 가용 영역 : 아무거나 2개 선택
    - 다음: 보안 설정 구성 클릭
  • 보안 설정 구성
    - 리스너에 HTTP만 있어서 별도로 구성할 것이 없다.
    - 리스너에 HTTPS를 포함되어 있다면, 인증서를 선택해야 한다.
  • 보안 그룹 구성
    - 보안 그룹 할당 : 기존 보안 그룹 선택
    - default 보안 그룹을 선택
  • 라우팅 구성
    - ECS에서 새롭게 대상 그룹을 생성해서 LB에 연결할 것이기 때문에 아무렇게나 입력해도 상관 없다.
    - 대상 그룹 : 새 대상 그룹
    - 이름 : LoadBalancer 생성 후 삭제할 것이기 때문에 아무 이름이나 상관 없다.
    - 다음: 대상 등록 클릭
  • 대상 등록
    - ECS에서 자동으로 등록해 줄 것이므로 그냥 넘어간다.
  • 로드 밸런서 생성 상태
    - 생성 완료
  • 기본 등록 된 리스너 삭제
  • 기본 등록 된 대상 그룹 삭제

서비스 생성

  • AWS > 서비스 > Amazon ECS > 클러스터 > 아까 생성 한 boilerplate 클러스터 상세 정보로 이동
  • 서비스 생성
    - 서비스 탭의 생성 버튼 클릭
  • 서비스 구성
    - 시작 유형 : FARGATE
    - 작업 정의 : boilerplate-nodejs
    - 버전 : 1 (latest) — 캡쳐 화면은 여러 번 테스트 하면서 버전이 올라간 것
    - 클러스터 : boilerplate
    - 서비스 이름 : boilerplate-nodejs
    - 작업 개수 : 2 — Load Balancer 가 정상적으로 동작하는 지 확인하기 위해서 2개로 설정
  • 배포 : 롤링 업데이트
    - 블루/그린 배포를 사용하게 되면 AWS CodeDeploy를 사용해야 되기 때문에 기본으로 설정되어 있는 롤링 업데이트를 선택
    - 다음 단계 버튼 클릭
  • 네트워크 구성 — VPC 및 보안 그룹
    - 클러스터 VPC : default VPC
    - 서브넷 : 아무거나 하나 선택
    - 보안 그룹 : 기존 보안 그룹 선택해서 default 보안 그룹 선택
    - 자동 할당 퍼블릿 IP : ENABLED
  • 네트워크 구성 — 로드 밸런싱
    - 로드 밸런서 유형 : Application Load Balancer
    - 서비스의 IAM 역할 선택 — 로드 밸런서 이름 : boilerplate-alb
  • 네트워크 구성 — 로드 밸런싱 할 컨테이너
    - 컨테이너 선택 : boilerplate-nodejs:80:80
    - 로드 밸런서에 추가 버튼 클릭
  • 네트워크 구성 — 로드 밸런싱 할 컨테이터 구성
    - 프로덕션 리스너 포트 : 새로 생성 / 80
    - 프로덕션 리스너 프로토콜 : HTTP
    - 대상 그룹 이름 : 새로 생성 / boilerplate-routing
    - 대상 그룹 프로토콜 : HTTP
    - 상태 확인 경로 : GET 으로 호출 했을 때 정상적인 경우 http status 200을 반환하는 페이지 URL (day34/boilerplate-nodejs 의 경우에는 /api/sample/item)
  • 서비스 검색 (선택 사항)
    - 비활성화
    - 다음 단계 버튼 클릭
  • AutoScaling (선택 사항)
    - AutoScaling 설정을 그냥 예시며 AutoScaling 설정에 대한 부분을 확인하고, 본인의 서비스에 알맞게 설정해야 됨
    - 서비스 Auto Scaling : 서비스 Auto Scaling을 구성하여 원하는 서비스 개수를 조정합니다.
    - 최소 작업 개수 : 1
    - 원하는 작업 개수 : 1
    - 최대 작업 개수 : 2
    - 서비스 Auto Scaling을 위한 IAM 역할 : 새 역할 생성 (이미 있는 경우 ecsAutoScaleRole 를 선택)
  • 자동 작업 조정 정책 (그냥 샘플에 불과함)
    - 조정 정책 유형 : 대상 추적
    - 정책 이름 : boilerplate-as-policy
    - ECS 서비스 측정치 : ALBRequestCountPerTarget
    - 대상 값 : 500
    - 확장 휴지 기간 : 300
    - 축소 휴지 기간 : 300
  • 검토 후 서비스 생성
  • 작업 상태 확인
    - boilerplate 클러스터 > boilerplate-nodejs 서비스 > 작업 탭

- AWS > 서비스 > EC2 > 로드 밸런싱 > 로드 밸런서 > boilerplate-alb > DNS 이름 확인 후 접속

- 여기에서는 DNS/api/sample/item 으로 접속해서 API 테스트 함
- 아래와 같이 나오면 정상적으로 ECS 설정이 완료 된 것

IAM 사용자 추가

  • AWS > 서비스 > IAM > 사용자 > 사용자 추가
  • 사용자 세부 정보 설정
    - 사용자 이름 : CircleCI (다른 이름으로 지정 가능)
    - AWS 액세스 유형 선택 : 프로그래밍 방식 액세스
  • 권한 설정
    - 기존 정책 직접 연결
    - ECS 검색
    - AmazonECS_FullAccess 체크
  • 검토 후 만들기
    - 내용 검토 후 사용자 만들기 버튼 클릭
  • 액세스 키 만들기
    - 액세스 키 만들기 버튼 클릭

>> 아래에 나오는 키들을 잘 기록해 놓고, 차후 CircleCI의 환경 변수로 등록해야 함 <<

  • 액세스 키 확인
    - 액세스 키 ID
    - 비밀 액세스 키
  • AWS Account 확인 : IAM 메뉴에서 확인 가능
    - AWS Account 옆에 괄호 안에 들어 있는 숫자
  • 기본 Region 확인 : IAM URL에서 확인 가능
    - region= 다음에 나오는 것이 기본 region을 나타내는 문자열
    - 아시아(서울) : ap-northeast-2

참고

--

--