Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 서비스가 존재할 경우 해당 서비스도 재시작됩니다.

애플리케이션 변경 사항 배포

각 애플리케이션은 저희 AWS 계정의 ECR 저장소에 자체 Docker 컨테이너를 저장합니다. 변경 사항은 수동으로도, (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 클러스터에 배포됩니다.