ECS 무중단 배포하기 - Rolling update 배포 설정

지니박박구리·2024년 7월 16일
0

Intro

먼저 ECS Service는 다음 3가지 배포가 가능합니다. (공식문서)

  1. ECS (Rolling Update)
    • ECS에서 기본적으로 서비스 생성시 사용
  2. CODE_DEPLOY (Blue/Green Update)
    • AWS CodeDeploy 서비스를 통해 배포시 사용
  3. EXTERNAL
    • third-party deployment controller 로 배포시 사용

이중 기본 Rolling Update 배포하면

  • 새로운 Deployment를 생성하고,
  • 해당 Deployment 파라미터 설정에 따라 새로운 Task가 상이하게 배포됩니다.

따라서 각 파라미터를 정확하게 이해해야 ECS에서 효과적인 인프라 운영이 가능합니다.

크게 Deployment 파라미터 3개가 존재합니다.
1. deploymentCircuitBreaker: "너 만약에 배포 실패하면 어떻게 할래?"
2. maximumPercent: "배포할 때 task 얼마나 늘릴까?"
3. minimumHealthyPercent: "아니 적어도 task가 이정도는 있어야지"

각 파라미터의 자세한 설명과, 설정 방법에 대해서는 아래에 순차적으로 작성했습니다.





deploymentCircuitBreaker

"너 만약에 배포 실패하면 어떻게 할래?"

  • 배포가 정상적으로 이뤄지지 않고 있을 때, 신규 배포를 중단하고, 선택적으로 롤백할 수 있는 기능입니다.

역할

  1. 다음 리소스에 대한 health check를 수행합니다.

    • Elastic Load Balancing load balancers
    • AWS Cloud Map service
    • Amazon ECS container health checks
  2. 실패시 threshold 동안 재시작하고, Deployment 를 FAILED 상태로 전환합니다.

    • ECS Service에 정의된 desired-count 에 따라 Failure threshold 을 자동으로 계산 (문서)
      - 최소 3 - 최대 200
    • 만약 CircuitBreaker 가 설정되어 있지 않다면 Failure threshold 설정되지 않아 계속 배포를 진행할 수 있습니다.
  3. Rollback

    • Deployment 가 FAILED 일 때 가장 최근 성공한 Deployment로 롤백 가능
    • 하지만 최근에 성공한 배포가 없다면 배포가 중단됩니다.

설정 방법

ECS 서비스 생성 시, "Deployment failure detection" 란에서 설정이 가능합니다.


또한 기존 서비스는 다음과 같은 CLI 명령어를 통해 설정 정보를 확인할 수 있습니다.

$ aws ecs describe-services --cluster <CLUSTER NAME> --services <SERVICE NAME>

"DeploymentConfiguration": { 
	"DeploymentCircuitBreaker": { 
		"Enable": "true",   ### !!!
		"Rollback": "false"  ### !!!
		 }, 
	...
 }, 

설정이 완료된 후, CircuitBreaker 에 의해 배포가 차단되면 다음과 같은 오류가 발생됩니다.

Error occurred during operation 'ECS Deployment Circuit Breaker was triggered ...







maximumPercent, minimumHealthyPercent

maximumPercent: "배포할 때 task 얼마나 늘릴까?"
minimumHealthyPercent: "아니 적어도 task가 이정도는 있어야지"

공식문서를 확인해 보면 더욱 정확한 정의를 확인할 수 있다.

  • maximumPercent
    - 배포 중 RUNNING , PENDING or STOPPING 상태 최대 task 개수 (반내림, default는 200%)
  • minimumHealthyPercent
    - 배포 중 RUNNING 상태로 남아 있어야 하는 최소 task 개수 (반올림, default는 200%)




적용 예시 1 (무중단 배포 성공)

  • desiredCount: 4
  • maximumPercent: 200%
    - 최대 8개의 task 가 허용됨
  • minimumHealthyPercent: 100%
    - 최소 4개의 task는 running 중이여야 함




적용 예시 2 (무중단 배포 성공)

  • desiredCount: 4
  • maximumPercent: 100%
    - 최대 4개의 task 가 허용됨
  • minimumHealthyPercent: 50%
    - 최소 2개의 task는 running 중이여야 함




적용 예시 3 (무중단 배포 실패!)

  • desiredCount: 1
  • maximumPercent: 100%
    - 최대 1개의 task 가 허용됨
  • minimumHealthyPercent: 50%
    - 최소 1개의 task는 running 중이여야 함 (반올림 적용)

=> 배포중 최대 task 수가 1개이기 때문에, 무중단 배포가 불가능한 것을 확인할 수 있습니다.






설정 방법

ECS 생성 시 "Deployment options" 에서 설정합니다.
(Rolling update 만 커스텀 설정 가능, Blue/Green는 기본설정으로 적용됨)

또한 기존 서비스는 다음과 같은 CLI 명령어를 통해 설정 정보를 확인할 수 있습니다.

$ aws ecs describe-services --cluster <CLUSTER NAME> --services <SERVICE NAME>

... 
"DeploymentConfiguration": { 
	"MaximumPercent": "200", 
	"MinimumHealthyPercent": "100", 
	...
 }, 
...








결론

ECS 무중단 배포를 위한 배포 설정에 대하여 알아보았습니다.

  1. CircuitBreaker 을 설정하여 운영상의 이슈가 있는 리소스를 처리하는 로직을 추가합니다.
  2. 서비스의 desired count 을 고려하여 배포중 서비스 중단이 일어나지 않도록 적절한 maximumPercent, minimumHealthyPercent 를 설정합니다.




Reference
1. ECS | Amazon ECS 서비스 정의 파라미터
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/service_definition_parameters.html
2. ECS | DeploymentConfiguration
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/APIReference/API_DeploymentConfiguration.html

profile
킹왕짱 Cloud Engineer 지니박박구리 블로그

0개의 댓글