ECS 서비스 관리
프로젝트 인프라에서 실행되는 일부 애플리케이션은 저희 AWS 계정의 ECS 클러스터에 호스팅되어 있습니다. 이 문서는 이러한 애플리케이션을 운영할 때 따라야 하는 일반적인 유지 관리 절차를 설명합니다. 여기에서 설명하는 작업 대부분은 AWS 접근 권한이 필요합니다.
참고: 저희 ECS 클러스터는 북부 캘리포니아(
us-west-1) AWS 리전에 있습니다. AWS 콘솔을 사용할 때는 이 리전이 선택되어 있는지 확인하십시오.
로그 확인하기
ECS에 호스팅된 애플리케이션의 로그는 CloudWatch Logs에 저장되며 AWS 콘솔에서 확인할 수 있습니다. 콘솔을 열고 CloudWatch Logs로 이동한 뒤 /ecs/<service-name>이라는 로그 그룹을 선택하십시오. 로그를 확인하는 방법은 두 가지입니다:
-
애플리케이션 전체를 살펴봐야 한다면 “View all log events” 버튼(클래식 인터페이스에서는 “Search Log Group”)을 클릭하여 통합된 보기를 확인할 수 있습니다.
-
특정 컨테이너 인스턴스를 디버깅해야 한다면 실행 중인 각 태스크별로 분리된 로그 스트림을 사용할 수 있습니다. 스트림 이름은 컨테이너 이름과 태스크 ID를 따라 지정됩니다.
로그는 주기적으로 삭제됩니다(보존 기간은 애플리케이션에 따라 다릅니다).
애플리케이션 재시작하기
애플리케이션을 재시작하려면 새 코드를 미리 푸시하지 않고도 새 배포를 강제로 실행할 수 있습니다. 이렇게 하려면 다음 명령을 실행하십시오:
aws ecs update-service --cluster rust-ecs-prod --service <service-name> --force-new-deployment
배포 롤백하기
잘못된 배포를 롤백하려면 셸에 AWS 자격 증명이 설정된 상태에서 simpleinfra 저장소에 있는 aws-rollback.py 스크립트를 실행하면 됩니다. 이 스크립트는 ECR 컨테이너 이미지 저장소의 이름을 첫 번째이자 유일한 인수로 받습니다:
./aws-rollback.py <image-repository-name>
스크립트는 저장소에 있는 이미지 목록을 보여 주고, 롤백할 이미지 번호를 묻습니다. 번호를 입력하면 스크립트는 latest 태그가 선택한 이미지를 가리키도록 변경하며, 저장소와 같은 이름의 ECS 서비스가 있으면 해당 서비스도 재시작합니다.
애플리케이션 변경 사항 배포하기
각 애플리케이션은 자체 Docker 컨테이너를 저희 AWS 계정의 ECR 저장소에 저장합니다. 변경 사항은 수동으로도, (GitHub Actions를 사용해) 자동으로도 배포할 수 있습니다.
프로덕션 애플리케이션에는 자동 배포를 설정하는 것을 권장합니다.
수동 배포
로컬 빌드를 수동으로 배포하려면 먼저 빌드한 이미지에 ECR 이름으로 태그를 지정해야 합니다:
docker tag <image-tag> 890664054962.dkr.ecr.us-west-1.amazonaws.com/<repository-name>:latest
그런 다음 ECR에 인증하고 이미지를 푸시할 수 있습니다:
$(aws ecr get-login --no-include-email --region us-west-1)
docker push 890664054962.dkr.ecr.us-west-1.amazonaws.com/<repository-name>:latest
마지막으로 다음 명령으로 ECS 서비스의 새 배포를 강제로 실행해야 합니다:
aws ecs update-service --cluster rust-ecs-prod --service <service-name> --force-new-deployment
GitHub Actions를 사용한 자동 배포
인프라 팀은 CI에서의 배포를 자동화하는 GitHub Actions용 액션을 준비해 두었습니다. 이 액션을 사용하려면 팀 구성원에게 저장소에 AWS 자격 증명을 설정해 달라고 요청한 뒤, 워크플로에 다음 코드 조각을 추가하십시오:
- name: Build the Docker image
run: docker build -t deploy-image .
- name: Deploy to production
uses: rust-lang/simpleinfra/github-actions/upload-docker-image@master
with:
image: deploy-image
repository: <ecr-repository-name>
region: us-west-1
redeploy_ecs_cluster: rust-ecs-prod
redeploy_ecs_service: <service-name>
aws_access_key_id: "${{ secrets.AWS_ACCESS_KEY_ID }}"
aws_secret_access_key: "${{ secrets.AWS_SECRET_ACCESS_KEY }}"
if: github.ref == 'refs/heads/<deploy-branch>'
<ecr-repository-name>, <service-name>, <deploy-branch>를 워크플로에 맞는 올바른 값으로 반드시 바꾸십시오. 배포용으로 선택한 브랜치에 워크플로 변경 사항이 병합되면, 이후 해당 브랜치에 푸시되는 모든 커밋이 ECS 클러스터에 배포됩니다.