AWS ECS(with Fargate), GitHub, DockerHub, CircleCI를 활용해 서비스 자동 배포 하기(2)
Published in
10 min readDec 3, 2019
기존 서비스 배포 시 프로세스의 불편함 점을 파악하고 개선하기 위해 도입한 과정을 총 3편에 걸쳐서 소개하려고 한다.
- 문제점 파악 및 개선방안
- AWS ECS 설정
- 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