Amazon ECS 블루/그린 배포 문제 해결 - Amazon Elastic Container Service

Amazon ECS 블루/그린 배포 문제 해결

다음은 Amazon ECS에서 블루/그린 배포를 사용할 때 발생할 수 있는 일반적인 문제에 대한 솔루션을 제공합니다. 블루/그린 배포 오류는 다음과 같은 단계에서 발생할 수 있습니다.

  • 동기 경로: CreateService 또는 UpdateService API 직접 호출에 대한 응답으로 즉시 나타나는 오류입니다.

  • 비동기 경로: DescribeServiceDeploymentsstatusReason 필드에 나타나며 배포 롤백을 유발하는 오류입니다.

로드 밸런서 구성 문제

로드 밸런서 구성은 Amazon ECS에서 블루/그린 배포의 중요한 구성 요소입니다. 성공적인 배포를 위해서는 리스너 규칙, 대상 그룹 및 로드 밸런서 유형을 올바르게 구성해야 합니다. 이 섹션에서는 블루/그린 배포 실패가 일어날 수 있는 일반적인 로드 밸런서 구성 문제를 다룹니다.

로드 밸런서 문제를 해결할 때는 리스너 규칙과 대상 그룹 간의 관계를 이해하는 것이 중요합니다. 블루/그린 배포에서:

  • 프로덕션 리스너 규칙은 트래픽을 현재 활성(블루) 서비스 개정으로 전달함

  • 프로덕션 트래픽을 이동하기 전에 테스트 리스너 규칙을 사용하여 새 (그린) 서비스 개정 검증 가능

  • 대상 그룹은 각 서비스 개정의 컨테이너 인스턴스를 등록하는 데 사용됨

  • 배포 중에 리스너 규칙에서 대상 그룹의 가중치를 조정하여 트래픽이 블루 서비스 개정에서 그린 서비스 개정으로 점진적으로 이동함

리스너 규칙 구성 오류

다음 문제는 블루/그린 배포에 대한 잘못된 리스너 규칙 구성과 관련된 사항입니다.

리스너 규칙 ARN 대신 Application Load Balancer 리스너 ARN 사용

오류 메시지: productionListenerRule has an invalid ARN format. Must be RuleArn for ALB or ListenerArn for NLB. Got: arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-alb/abc123/def456

해결 방법: Application Load Balancer를 사용하는 경우 리스너 ARN이 아닌 productionListenerRuletestListenerRule에 대한 리스너 규칙 ARN을 지정해야 합니다. Network Load Balancer의 경우 리스너 ARN을 사용해야 합니다.

리스너 ARN을 찾는 방법에 대한 자세한 정보는 Application Load Balancers 사용 설명서Application Load Balancer에 대한 리스너 생성을 참조하세요. 규칙의 ARN은 arn:aws:elasticloadbalancing:region:account-id:listener-rule/app/... 형식입니다.

프로덕션 리스너와 테스트 리스너 모두에 동일한 규칙 사용

오류 메시지: The following rules cannot be used as both production and test listener rules: arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-alb/abc123/def456/ghi789

해결 방법: 프로덕션 및 테스트 트래픽에는 서로 다른 리스너 규칙을 사용해야 합니다. 테스트 대상 그룹으로 라우팅되는 테스트 트래픽에 대해 별도의 리스너 규칙을 생성합니다.

Network Load Balancer에 대한 테스트 리스너 규칙 누락

오류 메시지: TestListenerRule is required for NLB with arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/nlb-targetgroup/abc123

해결 방법: Network Load Balancer를 사용하는 경우 productionListenerRuletestListenerRule을 모두 지정해야 합니다. 유효한 리스너 ARN이 있는 testListenerRule을 구성에 추가합니다. 자세한 내용은 Network Load Balancer 사용 설명서Network Load Balancer에 대한 리스너 생성을 참조하세요.

대상 그룹이 리스너 규칙과 연결되지 않음

오류 메시지: Service deployment rolled back because of invalid networking configuration: Target group arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/myAlternateTG/abc123 is not associated with either productionListenerRule or testListenerRule.

해결 방법: 기본 대상 그룹과 대체 대상 그룹은 모두 프로덕션 리스너 규칙 또는 테스트 리스너 규칙과 연결되어야 합니다. 로드 밸런서 구성을 업데이트하여 두 대상 그룹이 리스너 규칙과 올바르게 연결되도록 합니다.

Application Load Balancer에서 테스트 리스너 규칙 누락

오류 메시지: For Application LoadBalancer, testListenerRule is required when productionListenerRule is not associated with both targetGroup and alternateTargetGroup

해결 방법: Application Load Balancer를 사용할 때 두 대상 그룹이 모두 프로덕션 리스너 규칙과 연결되지 않은 경우 테스트 리스너 규칙을 지정해야 합니다. 구성에 testListenerRule을 추가하고 두 대상 그룹이 프로덕션 또는 테스트 리스너 규칙과 연결되어 있는지 확인합니다. 자세한 내용은 Application Load Balancer 사용 설명서Application Load Balancers용 리스너를 참조하세요.

대상 그룹 구성 문제

다음 문제는 블루/그린 배포에 대한 잘못된 대상 그룹 구성과 관련된 사항입니다.

리스너 규칙에 트래픽이 있는 여러 대상 그룹

오류 메시지: Service deployment rolled back because of invalid networking configuration. productionListenerRule arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-alb/abc123/def456/ghi789 should have exactly one target group serving traffic but found 2 target groups which are serving traffic

해결 방법: 블루/그린 배포를 시작하기 전에 리스너 규칙에서 하나의 대상 그룹만 트래픽을 수신하고 있는지(가중치가 0이 아닌지) 확인합니다. 트래픽을 수신하지 않아야 하는 대상 그룹의 가중치를 0으로 설정하도록 리스너 규칙 구성을 업데이트합니다.

로드 밸런서 항목 간에 대상 그룹 복제

오류 메시지: Duplicate targetGroupArn found: arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/myecs-targetgroup/abc123

해결 방법: 각 대상 그룹 ARN은 서비스 정의의 모든 로드 밸런서 항목에서 고유해야 합니다. 구성을 검토하고 각 로드 밸런서 항목에 대해 서로 다른 대상 그룹을 사용하고 있는지 확인합니다.

프로덕션 리스너 규칙의 예상치 못한 대상 그룹

오류 메시지: Service deployment rolled back because of invalid networking configuration. Production listener rule is forwarding traffic to unexpected target group arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/random-nlb-tg/abc123. Expected traffic to be forwarded to either targetGroupArn: arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/nlb-targetgroup/def456 or alternateTargetGroupArn: arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/nlb-tg-alternate/ghi789

해결 방법: 프로덕션 리스너 규칙이 서비스 정의에 지정되지 않은 대상 그룹에 트래픽을 전달하고 있습니다. 리스너 규칙이 서비스 정의에 지정된 대상 그룹으로만 트래픽을 전달하도록 구성되어 있는지 확인합니다.

자세한 내용은 Application Load Balancer 사용 설명서전달 작업을 참조하세요.

로드 밸런서 유형 구성 오류

다음 문제는 블루/그린 배포에 대한 잘못된 로드 밸런서 유형 구성과 관련된 사항입니다.

Classic Load Balancer 및 Application Load Balancer 또는 Network Load Balancer 구성 혼합

오류 메시지: All loadBalancers must be strictly either ELBv1 (defining loadBalancerName) or ELBv2 (defining targetGroupArn)

참고

Classic Load Balancer는 Elastic Load Balancing 이전 세대의 로드 밸런서입니다. 현재 세대의 로드 밸런서로 마이그레이션하는 것이 좋습니다. 자세한 내용은 Classic Load Balancer 마이그레이션을 참조하세요.

해결 방법: 모든 Classic Load Balancer 또는 모든 Application Load Balancer 및 Network Load Balancer를 사용합니다.

Application Load Balancer 및 Network Load Balancer의 경우 targetGroupArn 필드만 지정합니다.

Classic Load Balancer에서 고급 구성 사용

오류 메시지: advancedConfiguration field is not allowed with ELBv1 loadBalancers

해결 방법: 블루/그린 배포를 위한 고급 구성은 Application Load Balancer 및 Network Load Balancer에서만 지원됩니다. Classic Load Balancer(loadBalancerName으로 지정됨)를 사용하는 경우 advancedConfiguration 필드를 사용할 수 없습니다. Application Load Balancer로 전환하거나 advancedConfiguration 필드를 제거합니다.

로드 밸런서 간 일관되지 않은 고급 구성

오류 메시지: Either all or none of the provided loadBalancers must have advancedConfiguration defined

해결 방법: 로드 밸런서를 여러 개 사용하는 경우 모든 로드 밸런서에 대해 advancedConfiguration을 정의하거나 어느 로드 밸런서에도 정의하지 않아야 합니다. 모든 로드 밸런서 항목에서 일관성을 보장하도록 구성을 업데이트합니다.

블루/그린 배포에서 고급 구성 누락

오류 메시지: advancedConfiguration field is required for all loadBalancers when using a non-ROLLING deployment strategy

해결 방법: Application Load Balancer에서 블루/그린 배포 전략을 사용하는 경우 모든 로드 밸런서 항목에 advancedConfiguration 필드를 지정해야 합니다. 로드 밸런서 구성에 필요한 advancedConfiguration을 추가합니다.

권한 문제

다음 문제는 블루/그린 배포에 대한 권한 부족과 관련된 사항입니다.

인프라 역할에 대한 신뢰 정책 누락

오류 메시지: Service deployment rolled back because of invalid networking configuration. ECS was unable to manage the ELB resources due to missing permissions on ECS Infrastructure Role 'arn:aws:iam::123456789012:role/Admin'.

해결 방법: 로드 밸런서 리소스를 관리하기 위해 지정된 IAM 역할에 올바른 신뢰 정책이 없습니다. 서비스에서 역할을 위임할 수 있도록 역할의 신뢰 정책을 업데이트합니다. 신뢰 정책은 다음을 포함해야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ecs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
로드 밸런서 역할에 대한 읽기 권한 누락

오류 메시지: service myService failed to describe target health on target-group myTargetGroup with (error User: arn:aws:sts::123456789012:assumed-role/myELBRole/ecs-service-scheduler is not authorized to perform: elasticloadbalancing:DescribeTargetHealth because no identity-based policy allows the elasticloadbalancing:DescribeTargetHealth action)

해결 방법: 로드 밸런서 리소스 관리에 사용되는 IAM 역할에 대상 상태 정보를 읽을 수 있는 권한이 없습니다. 역할 정책에 elasticloadbalancing:DescribeTargetHealth 권한을 추가합니다. Elastic Load Balancing 권한에 대한 자세한 내용은 로드 밸런서에 대한 Amazon ECS 인프라 IAM 역할 섹션을 참조하세요.

로드 밸런서 역할에 대한 쓰기 권한 누락

오류 메시지: service myService failed to register targets in target-group myTargetGroup with (error User: arn:aws:sts::123456789012:assumed-role/myELBRole/ecs-service-scheduler is not authorized to perform: elasticloadbalancing:RegisterTargets on resource: arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/myTargetGroup/abc123 because no identity-based policy allows the elasticloadbalancing:RegisterTargets action)

해결 방법: 로드 밸런서 리소스 관리에 사용되는 IAM 역할에 대상을 등록할 수 있는 권한이 없습니다. 역할 정책에 elasticloadbalancing:RegisterTargets 권한을 추가합니다. Elastic Load Balancing 권한에 대한 자세한 내용은 로드 밸런서에 대한 Amazon ECS 인프라 IAM 역할 섹션을 참조하세요.

리스너 규칙을 수정할 수 있는 권한 누락

오류 메시지: Service deployment rolled back because TEST_TRAFFIC_SHIFT lifecycle hook(s) failed. User: arn:aws:sts::123456789012:assumed-role/myELBRole/ECSNetworkingWithELB is not authorized to perform: elasticloadbalancing:ModifyListener on resource: arn:aws:elasticloadbalancing:us-west-2:123456789012:listener/app/my-alb/abc123/def456 because no identity-based policy allows the elasticloadbalancing:ModifyListener action

해결 방법: 로드 밸런서 리소스 관리에 사용되는 IAM 역할에 대상을 수정할 수 있는 권한이 없습니다. 역할 정책에 elasticloadbalancing:ModifyListener 권한을 추가합니다. Elastic Load Balancing 권한에 대한 자세한 내용은 로드 밸런서에 대한 Amazon ECS 인프라 IAM 역할 섹션을 참조하세요.

블루/그린 배포의 경우 로드 밸런서 리소스 관리에 필요한 모든 권한이 포함된 AmazonECS-ServiceLinkedRolePolicy 관리형 정책을 인프라 역할에 연결하는 것이 좋습니다.

수명 주기 후크 문제

다음 문제는 블루/그린 배포의 수명 주기 후크와 관련된 사항입니다.

Lambda 후크 역할에 대한 잘못된 신뢰 정책

오류 메시지: Service deployment rolled back because TEST_TRAFFIC_SHIFT lifecycle hook(s) failed. ECS was unable to assume role arn:aws:iam::123456789012:role/Admin

해결 방법: Lambda 수명 주기 후크에 지정된 IAM 역할에 올바른 신뢰 정책이 없습니다. 서비스에서 역할을 위임할 수 있도록 역할의 신뢰 정책을 업데이트합니다. 신뢰 정책은 다음을 포함해야 합니다.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ecs.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
Lambda 후크가 FAILED 상태를 반환함

오류 메시지: Service deployment rolled back because TEST_TRAFFIC_SHIFT lifecycle hook(s) failed. Lifecycle hook target arn:aws:lambda:us-west-2:123456789012:function:myHook returned FAILED status.

해결 방법: 수명 주기 후크로 지정된 Lambda 함수가 FAILED 상태를 반환했습니다. Amazon CloudWatch Logs에서 Lambda 함수 로그를 확인하여 실패 이유를 파악하고 배포 이벤트를 올바르게 처리하도록 함수를 업데이트합니다.

Lambda 함수를 호출할 수 있는 권한 누락

오류 메시지: Service deployment rolled back because TEST_TRAFFIC_SHIFT lifecycle hook(s) failed. ECS was unable to invoke hook target arn:aws:lambda:us-west-2:123456789012:function:myHook due to User: arn:aws:sts::123456789012:assumed-role/myLambdaRole/ECS-Lambda-Execution is not authorized to perform: lambda:InvokeFunction on resource: arn:aws:lambda:us-west-2:123456789012:function:myHook because no identity-based policy allows the lambda:InvokeFunction action

해결 방법: Lambda 수명 주기 후크에 사용되는 IAM 역할에 Lambda 함수를 호출할 수 있는 권한이 없습니다. 특정 Lambda 함수 ARN에 대한 역할 정책에 lambda:InvokeFunction 권한을 추가합니다. Lambda 권한에 대한 자세한 내용은 Amazon ECS 블루/그린 배포에서 Lambda 함수에 필요한 권한 섹션을 참조하세요.

Lambda 함수 시간 초과 또는 잘못된 응답

오류 메시지: Service deployment rolled back because TEST_TRAFFIC_SHIFT lifecycle hook(s) failed. ECS was unable to parse the response from arn:aws:lambda:us-west-2:123456789012:function:myHook due to HookStatus must not be null

해결 방법: Lambda 함수가 시간 초과되었거나 잘못된 응답을 반환했습니다. Lambda 함수가 hookStatus 필드가 SUCCEEDED 또는 FAILED로 설정된 유효한 응답을 반환하는지 확인합니다. 또한 Lambda 함수 시간 초과가 검증 로직에 맞게 적절하게 설정되었는지 확인합니다. 자세한 내용은 Amazon ECS 서비스 배포에 대한 수명 주기 후크 섹션을 참조하세요.

유효한 Lambda 응답의 예:

{ "hookStatus": "SUCCEEDED", "reason": "Validation passed" }