Amazon ECS에서 블루/그린 배포 관련 문제를 해결하려면 어떻게 해야 합니까?
Amazon Elastic Container Service(Amazon ECS)에서 호스팅되는 서비스의 블루/그린 배포와 관련한 문제를 해결하고 싶습니다.
간략한 설명
Amazon ECS에서 호스팅되는 서비스의 블루/그린 배포와 관련하여 가장 많이 발생하는 문제는 다음과 같습니다.
AWS Identity and Access Management(IAM) 관련 문제:
- **Please create your Service role for CodeDeploy(CodeDeploy에 대한 서비스 역할을 생성하세요.)**라는 오류가 발생하여 ECS 서비스를 생성할 수 없습니다.
- **service
failed to launch a task with (error ECS was unable to assume the role
that was provided for this task.(<service_name> 서비스에서 ECS가 이 태스크에 제공된 <role ARN> 역할을 맡을 수 없음이라는 오류가 발생하여 태스크를 시작하지 못했습니다.)라는 오류가 발생합니다. 전달되는 역할에 적절한 신뢰 관계 및 권한이 있는지, IAM 사용자에게 이 역할을 전달할 권한이 있는지 확인하세요.**
로드 밸런서/ECS 관련 문제:
- 상태 확인 실패로 인해 ECS 서비스가 안정화되지 않습니다.
- **The ELB could not be updated due to the following error: Primary taskset target group must be behind listener
(다음 오류 때문에 ELB를 업데이트할 수 없습니다. 기본 태스크 세트 대상 그룹은 <listener-ARN> 리스너를 통해 연결되어야 합니다.)** (이)라는 오류가 발생합니다.
- 성공적으로 배포된 후에도 트래픽이 블루 대상 그룹으로 라우팅됩니다.
- ECS 서비스에서 실행 중인 ECS 태스크가 새로운 그린 배포 중에만 Application Load Balancer 상태 확인에 실패합니다.
- ECS 태스크가 일관되지 않게 Application Load Balancer 상태 확인에 실패합니다.
- 모든 요구 사항을 충족하는 컨테이너 인스턴스가 없기 때문에 ECS 서비스가 태스크를 배치할 수 없습니다. 가장 가깝게 일치하는 컨테이너 인스턴스에 사용 가능한 CPU 유닛이 부족합니다.
AWS CloudFormation 관련 문제(CloudFormation을 통해 블루/그린 배포를 수행하는 경우):
- 블루/그린 배포를 트리거하는 변경 세트를 생성할 때 CloudFormation 스택이 실패하고 내부 실패 오류가 발생합니다.
- 블루/그린 배포를 트리거하기 위해 변경 세트를 생성할 때 오류가 발생합니다. **AWS::CodeDeploy::BlueGreen 유형의 'CodeDeployBlueGreenHook'가 실패하고 다음 메시지가 표시됨: The TaskDefinition logical Id [
] is the same between initial and final template, CodeDeploy can't perform BlueGreen style update properly:(TaskDefinition 논리적 ID [<logical_id>]이(가) 초기 템플릿과 최종 템플릿 간에 동일하며 CodeDeploy가 BlueGreen 스타일 업데이트를 정상적으로 수행할 수 없습니다.)**
해결 방법
IAM 관련 문제
**Please create your Service role for CodeDeploy(CodeDeploy에 대한 서비스 역할을 생성하세요.)**라는 오류가 발생하여 ECS 서비스를 생성할 수 없습니다.
이 오류는 AWS CodeDeploy에 블루/그린 배포 전략을 실행하는 데 필요한 IAM 권한이 없기 때문에 발생합니다. 사용자를 대신하여 Amazon ECS 서비스를 업데이트할 수 있는 권한을 CodeDeploy 서비스에 부여해야 합니다.
이 오류를 해결하려면 CodeDeploy IAM 역할이 올바르게 생성되었고 필요한 권한이 있는지 확인하세요.
CodeDeploy를 위한 IAM 역할을 생성하려면 다음을 수행합니다.
- IAM 콘솔을 엽니다.
- 탐색 창에서 **Roles(역할)**를 선택합니다.
- **Create role(역할 생성)**을 선택합니다.
- Select type of trusted entity(신뢰할 수 있는 엔터티 유형 선택) 섹션에서 **AWS service(AWS 서비스)**를 선택한 다음 CodeDeploy를 선택합니다.
- (Select your use case사용 사례 선택) 섹션에서 CodeDeploy - ECS를 선택한 후 **Next:Permissions(다음: 권한)**를 선택합니다.
참고: 기본 AWSCodeDeployforECS 정책을 유지하세요. 이 정책에는 CodeDeploy가 Amazon ECS 및 기타 서비스와 올바르게 상호 작용하는 데 필요한 권한이 포함되어 있습니다. - **Next: Tags(다음: 태그)**를 선택합니다.
- (선택 사항) 태그 이름을 입력한 후 **Next: Review(다음: 검토)**를 선택합니다.
- **Role name(역할 이름)**에 ecsCodeDeployRole을 입력합니다.
- **Create role(역할 생성)**을 선택합니다.
**service failed to launch a task with (error ECS was unable to assume the role that was provided for this task: Verify that the IAM role being passed has the proper trust relationship and permissions and that your IAM user has permissions to pass this role):(서비스에서 작업을 시작하지 못했습니다(ECS가 이 작업에 대해 제공된 역할을 맡을 수 없습니다. 전달되는 IAM 역할에 적절한 신뢰 관계 및 권한이 있는지, IAM 사용자에게 이 역할을 전달할 권한이 있는지 확인하세요.)**라는 오류가 발생합니다.
오류 메시지에서 반환된 IAM 역할을 확인하여 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스가 ECS 태스크 서비스 ecs-tasks.amazonaws.com와 신뢰 관계를 가지고 있는지 확인합니다. 역할의 신뢰 관계는 다음과 유사해야 합니다.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "ec2.amazonaws.com", "ecs-tasks.amazonaws.com" ] }, "Action": "sts:AssumeRole" } ] }
로드 밸런서/ECS 관련 문제
- 상태 확인 실패로 인해 ECS 서비스가 안정화되지 않음: 태스크 정의의 포트 매핑이 대상 그룹의 포트와 일치하는지 확인하세요. 자세한 내용은 Amazon EC2 시작 유형을 통해 Amazon ECS 태스크를 실행하여 Amazon ECS에서 Application Load Balancer 상태 확인을 통과하도록 하려면 어떻게 해야 합니까?를 참조하세요.
- 오류 메시지: The ELB could not be updated due to the following error: Primary taskset target group must be behind listener:(다음 오류로 인해 ELB를 업데이트할 수 없습니다. 기본 태스크 세트 대상 그룹이 리스너를 통해 연결되어야 합니다.) Elastic Load Balancing 리스너 또는 대상 그룹이 잘못 구성된 경우 이 오류가 발생합니다. ELB 기본 리스너와 테스트 리스너가 모두 현재 워크로드를 처리하고 있는 기본 대상 그룹을 가리키는지 확인합니다.
- Traffic is still routed to the blue target group after successful deployment:(배포가 성공한 후에도 트래픽이 블루 대상 그룹으로 라우팅됩니다.) CodeDeploy는 배포가 완료된 후 그린 대상 그룹을 가리키도록 로드 밸런서의 기본 리스너를 자동으로 업데이트합니다. 하지만 CodeDeploy는 사용자가 지정한 프로덕션 리스너만 업데이트합니다. 배포 후 CodeDeploy가 트래픽을 전환하지 못할 경우 ELB 리스너가 잘못된 트래픽 유형으로 구성되었을 수 있습니다. 기본 ELB 리스너에 올바른 프로토콜과 포트를 지정했는지 확인하세요.
- Your ECS tasks running in the ECS Service are failing Application Load Balancer health checks only during a new green deployment:(ECS 서비스에서 실행 중인 ECS 태스크가 신규 그린 배포 중에만 Application Load Balancer 상태 확인에 실패합니다.) 다른 ECS 서비스가 동일한 그린 대상 그룹에 태스크를 등록하려고 시도하여 불일치가 발생하지 않는지 확인하세요. 로드 밸런서 구성을 업데이트하여, 대상 그룹마다 하나의 ECS 서비스 또는 포트만 등록되도록 합니다.
- Your ECS tasks are inconsistently failing Application Load Balancer health checks:(ECS 태스크가 일관되지 않게 Application Load Balancer 상태 확인에 실패합니다.) 이 문제는 컨테이너를 시작하는 데 예상 시간보다 오래 걸릴 때 발생할 수 있습니다. 컨테이너 애플리케이션 코드를 확인하여 지연의 원인을 찾으세요. 이 문제를 해결하려면 애플리케이션 코드를 최적화하세요. 그래도 문제가 해결되지 않을 경우 컨테이너를 시작할 충분한 시간을 확보할 수 있도록 ECS 서비스에 상태 확인 유예 기간을 포함하세요.
- Your ECS Service is unable to place a task because no container instance meets all of its requirements. The closest matching container instance has insufficient CPU units available:(모든 요구 사항을 충족하는 컨테이너 인스턴스가 없기 때문에 ECS 서비스가 태스크를 배치할 수 없습니다. 가장 가깝게 일치하는 컨테이너 인스턴스에 사용 가능한 CPU 유닛이 부족합니다.) 블루/그린 배포를 수행하기 전에 컨테이너 인스턴스 리소스가 충분한지 확인해야 합니다.
CloudFormation 관련 문제
참고: 다음 문제 해결 단계는 블루/그린 배포에 CloudFormation을 사용하는 경우에만 적용됩니다.
- 블루/그린 배포를 트리거하는 변경 세트를 생성할 때 CloudFormation 스택이 실패하고 내부 실패 오류 발생: 이 문제를 완화하려면 CloudFormation 서비스 역할을 사용하고 이 역할을 CloudFormation 스택에 연결하세요. 서비스 역할에 모든 스택 작업을 실행하는 데 필요한 권한이 있는지 확인하세요. 스택이 생성된 후에는 스택에서 서비스 역할을 제거할 수 없습니다.
- **블루/그린 배포를 트리거하기 위해 변경 세트를 생성할 때 오류 발생: AWS::CodeDeploy::BlueGreen 유형의 'CodeDeployBlueGreenHook'가 실패하고 다음 메시지가 표시됨: The TaskDefinition logical Id [
] is the same between initial and final template, CodeDeploy can't perform BlueGreen style update properly:(TaskDefinition 논리적 ID [<logical_id>]이(가) 초기 템플릿과 최종 템플릿 간에 동일하며 CodeDeploy가 BlueGreen 스타일 업데이트를 정상적으로 수행할 수 없습니다.)** 이미 그린 대상 그룹을 가리키고 있는 테스트 리스너를 지정하면 CodeDeploy 후크가 실패하고 이 오류가 발생합니다. 블루/그린 배포를 실행하기 전에 테스트 리스너가 이미 그린 대상 그룹을 가리키고 있지 않은지 확인하세요.
중요: 블루/그린 배포를 취소하고 롤백하는 데 UpdateService API를 사용해서는 안 됩니다. 대신 CreateDeployment API를 사용하세요. 배포를 롤백하려면 배포 StopDeployment API를 사용하세요.
관련 정보
관련 콘텐츠
- 질문됨 8년 전lg...
- 질문됨 일 년 전lg...
- 질문됨 2년 전lg...
- AWS 공식업데이트됨 3년 전
- AWS 공식업데이트됨 2년 전
- AWS 공식업데이트됨 3년 전