728x90
ECS 배포 실패해도 서버가 다운 안되는 이유 - ECS 서비스 롤링 업데이트 방식
ECS와 Secrets Manager를 연동해서 환경 변수 설정하는 작업을 하다가 Spring Boot 기동에 실패해도 DNS로 접속하면 접속이 되는 모습을 확인했다. Spring Boot의 기동이 실패해도 서버가 다운되지 않는 이유를 함께 살펴보자.
AWS ECS는 "롤링 업데이트(rolling update)"라는 방식을 사용한다.
이것은 서비스를 업데이트할 때 모든 태스크(컨테이너 인스턴스)를 한 번에 교체하는 게 아니라, 단계적으로 새로운 버전으로 교체하는 방법이다.
이 과정에서 중요한 두 가지 설정이 있다:
minimumHealthyPercent (최소 실행 작업 비율)
- 이 값은 서비스가 정상적으로 작동하기 위해 최소한 유지해야 하는 태스크의 비율을 정의한다.
- 예를 들어, 이 값이 50%라면, 서비스가 실행 중인 태스크의 절반은 항상 정상 작동해야 한다는 뜻이다. 이는 새로운 버전의 배포가 실패하더라도 최소한 절반의 태스크는 여전히 이전 버전으로 안정적으로 운영될 수 있도록 보장한다.
- 나는 서비스를 생성할 때 배포 옵션은 건들지 않았기 때문에 최소 실행 작업 비율이 100%로 설정되어 있었다.
- 최소 실행 작업 비율이 100%로 설정되어 있으면, 서비스가 정상적으로 작동하기 위해서는 모든 태스크가 건강해야 한다는 의미다.
- 나처럼 태스크가 하나뿐인 경우에 이 설정은 중요한 의미를 갖는다.
- ECS가 새로운 태스크를 시작하고, 새로운 태스크가 건강 검사를 통과해야만 서비스로 트래픽을 받을 수 있다.
- 만약 새로운 태스크가 건강 검사를 통과하지 못하면, ECS는 그 태스크를 서비스에서 제외하고 이전 버전의 태스크를 계속 유지한다.
- 따라서 최소 실행 작업 비율이 100%고, 태스크가 하나뿐인 경우, 새 배포가 실패하면 ECS는 자동으로 이전 버전의 태스크를 계속 운영하게 된다.
- 실질적으로 서비스에 중단이 발생하지 않도록 보장하는 것이다.
maximumPercent (최대 실행 작업 비율)
- 이 값은 서비스의 태스크가 업데이트 중에 최대로 늘어날 수 있는 비율을 정의한다.
- 예를 들어, 이 값이 200%라면, 업데이트 중에 태스크의 수를 최대 두 배까지 늘릴 수 있다는 의미 한다. 이렇게 하면 새로운 태스크를 충분히 시작한 후, 건강 검사를 통과한 태스크만을 서비스에 포함시켜 나간다.
(아래는 ECS > 서비스 생성 화면에서 배포 옵션을 설정하는 화면이다.)
배포 과정은 대략 다음과 같다.
- 새로운 태스크 정의에 따라 ECS가 새 태스크를 시작한다.
- 새로운 태스크가 건강 검사를 통과하면, ECS는 설정된 비율에 맞춰 새로운 태스크와 기존 태스크를 혼합한다.
- 새 태스크의 배포가 성공하면, ECS는 점차적으로 기존 태스크를 새 버전으로 교체한다.
- 만약 새로운 태스크가 건강 검사에 실패하거나 배포 중 문제가 발생하면, ECS는 다음과 같이 대응한다.
- 새 태스크의 배포를 멈추고, minimumHealthyPercent 설정에 따라 동작 중인 기존 태스크를 계속 운영한다.
- 필요에 따라 자동으로 이전 버전으로 롤백하거나 수동으로 롤백할 수 있다.
- 이런 방식으로 AWS ECS는 새로운 배포가 실패해도 사용자가 서비스를 지속해서 안정적으로 사용할 수 있도록 한다.
Secrets Manager 이용해서 환경변수 적용하기(IAM 정책, Spring Boot 코드 수정)
'AWS' 카테고리의 다른 글
[AWS] IAM MFA 설정하기 (1) | 2023.11.05 |
---|---|
[AWS] ECS, ALB - 동적 포트 매핑 활성화와 DNS 접속 (1) | 2023.11.05 |
[AWS] ECS와 RDS 연동하기 (4) - Secrets Manager 이용해서 환경변수 적용하기(IAM 정책, Spring Boot 코드 수정) (1) | 2023.11.04 |
[AWS] ECS와 RDS 연동하기 (3) - Secrets Manager 이용해서 환경변수 적용하기 (0) | 2023.11.03 |
[AWS] ECS와 RDS 연동하기 (2) - SpringBoot와 PostgreSQL 연동하기 (0) | 2023.11.03 |