Amazon EC2 Auto Scaling 문제 해결 - AWS CodeDeploy

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Amazon EC2 Auto Scaling 문제 해결

일반적인 Amazon EC2 Auto Scaling 문제 해결

Amazon EC2 Auto Scaling 그룹에서 EC2 인스턴스로의 배포에 실패할 수 있는 원인은 다음과 같습니다.

  • Amazon EC2 Auto Scaling은 EC2 인스턴스를 계속해서 시작하고 종료합니다. 애플리케이션 수정 버전을 자동으로 CodeDeploy 배포할 수 없는 경우 Amazon EC2 Auto Scaling은 계속해서 EC2 인스턴스를 시작하고 종료합니다.

    Amazon EC2 Auto Scaling 그룹을 배포 그룹에서 CodeDeploy 분리하거나 Amazon EC2 Auto Scaling 그룹의 구성을 변경하여 원하는 인스턴스 수가 현재 인스턴스 수와 일치하도록 합니다. 이렇게 하면 Amazon EC2 Auto Scaling이 더 이상 EC2 인스턴스를 시작하지 못하게 됩니다. 자세한 내용은 다음을 사용하여 배포 그룹 설정 변경 CodeDeploy 또는 Amazon EC2 Auto Scaling의 수동 확장을 참조하세요.

  • 에이전트가 응답하지 않습니다. CodeDeploy EC2 인스턴스가 시작되거나 시작된 직후에 실행되는 초기화 스크립트 (예: cloud-init 스크립트) 를 실행하는 데 1시간 이상 걸리는 경우 CodeDeploy 에이전트가 설치되지 않을 수 있습니다. CodeDeploy CodeDeploy 에이전트가 보류 중인 배포에 응답하는 데 1시간의 제한 시간이 있습니다. 이 문제를 해결하려면 초기화 스크립트를 애플리케이션 수정 버전으로 옮기십시오. CodeDeploy

  • Amazon EC2 Auto Scaling 그룹의 EC2 인스턴스가 배포 중에 재부팅됩니다. 배포 중에 EC2 인스턴스를 재부팅하거나 배포 명령을 처리하는 동안 CodeDeploy 에이전트가 종료되면 배포가 실패할 수 있습니다. 자세한 정보는 Amazon EC2 Auto Scaling 인스턴스를 종료 또는 재부팅하면 배포에 실패할 수 있음을 참조하세요.

  • 여러 애플리케이션 개정 버전이 Amazon EC2 Auto Scaling 그룹의 동일한 EC2 인스턴스에 동시에 배포됩니다. 배포 중 하나에 실행하는 데 몇 분 이상 걸리는 스크립트가 있는 경우 Amazon EC2 Auto Scaling 그룹의 동일한 EC2 인스턴스로 여러 애플리케이션 개정 버전 배포에 실패할 수 있습니다. 여러 애플리케이션 개정 버전을 Amazon EC2 Auto Scaling 그룹의 동일한 EC2 인스턴스에 배포하지 마세요.

  • Amazon EC2 Auto Scaling 그룹의 일부로 실행된 새 EC2 인스턴스에 대한 배포에 실패합니다. 이 시나리오에서 배포 스크립트를 실행하면 Amazon EC2 Auto Scaling 그룹에서 EC2 인스턴스가 시작되지 않을 수 있습니다. (Amazon EC2 Auto Scaling 그룹의 다른 EC2 인스턴스는 정상적으로 실행되는 것처럼 보일 수 있습니다.) 이 문제를 해결하려면 먼저 다른 모든 스크립트가 완벽한지 확인해야 합니다.

    • CodeDeploy 에이전트가 AMI에 포함되지 않음: 새 인스턴스를 시작하는 동안 cfn-init 명령을 사용하여 CodeDeploy 에이전트를 설치하는 경우 에이전트 설치 스크립트를 AWS CloudFormation 템플릿의 cfn-init 섹션 끝에 배치하십시오.

    • CodeDeploy AMI에 에이전트 포함: 인스턴스가 생성될 때 에이전트가 Stopped 상태에 있도록 AMI를 구성한 다음 에이전트를 시작하기 위한 스크립트를 cfn-init 스크립트 라이브러리의 마지막 단계로 포함하십시오.

“는 다음 AWS 서비스에서 작업을 수행할 수 있는 권한을 부여하지 CodeDeployRole 않습니다. AmazonAutoScaling" 오류

시작 템플릿으로 생성된 Auto Scaling 그룹을 사용하는 배포는 다음 권한을 필요로 합니다. 이는 AWSCodeDeployRole AWS 관리형 정책에서 부여한 권한에 추가됩니다.

  • EC2:RunInstances

  • EC2:CreateTags

  • iam:PassRole

이러한 권한이 없다면 이 오류가 표시됩니다. 자세한 내용은 자습서: Auto Scaling 그룹에 애플리케이션을 배포하는 데 사용합니다 CodeDeploy ., Auto Scaling 그룹에 대한 시작 템플릿 생성Amazon EC2 Auto Scaling 사용 설명서의 권한을 참조하세요.

개정 버전을 배포하기 전에 Amazon EC2 Auto Scaling 그룹의 인스턴스가 계속해서 프로비저닝 및 종료됨

오류로 인해 Amazon EC2 Auto Scaling 그룹의 새로 프로비저닝된 인스턴스로 성공적인 배포에 실패할 수 있습니다. 그 결과, 정상 인스턴스와 성공한 인스턴스가 없습니다. 배포를 실행하거나 성공적으로 완료할 수 없기 때문에 인스턴스가 생성 직후에 종료됩니다. 그런 다음 Amazon EC2 Auto Scaling 그룹 구성으로 인해 최소 정상 호스트 요구 사항을 충족하기 위한 또 다른 인스턴스 배치가 프로비저닝됩니다. 이 배치 역시 종료되고 이러한 주기가 계속 반복됩니다.

가능한 원인은 다음과 같습니다.

  • Amazon EC2 Auto Scaling 그룹 상태 확인에 실패했습니다.

  • 애플리케이션 수정의 오류

이 문제를 해결하려면 다음 단계를 수행하세요.

  1. Amazon EC2 Auto Scaling 그룹에 속하지 않는 EC2 인스턴스를 수동으로 생성합니다. 고유한 EC2 인스턴스 태그로 인스턴스에 태그를 지정합니다.

  2. 새 인스턴스를 영향을 받는 배포 그룹에 추가합니다.

  3. 배포 그룹에 오류가 없는 새 애플리케이션 수정을 배포합니다.

Amazon EC2 Auto Scaling 그룹의 이후 인스턴스에 애플리케이션 수정 버전을 배포하라는 메시지를 Amazon EC2 Auto Scaling 그룹에 표시합니다.

참고

배포가 성공적으로 완료되었는지 확인한 후에는 생성한 인스턴스를 삭제하여 계정에 계속 요금이 청구되지 않도록 하세요 AWS .

Amazon EC2 Auto Scaling 인스턴스를 종료 또는 재부팅하면 배포에 실패할 수 있음

EC2 인스턴스가 Amazon EC2 Auto Scaling을 통해 시작된 다음에 인스턴스가 종료 또는 재부팅된 경우, 다음과 같은 이유로 해당 인스턴스에 대한 배포가 실패할 수 있습니다.

  • 진행 중인 배포에서 축소 이벤트 또는 기타 모든 종료 이벤트로 인해 인스턴스가 Amazon EC2 Auto Scaling 그룹에서 분리된 다음 종료됩니다. 배포를 완료할 수 없기 때문에 배포에 실패합니다.

  • 인스턴스가 재부팅되지만 인스턴스를 시작하는 데 5분 이상 걸립니다. CodeDeploy 이를 타임아웃으로 취급합니다. 이 서비스에서 인스턴스에 대한 현재 및 이후 배포에 모두 실패합니다.

이 문제를 해결하려면:

  • 일반적으로, 인스턴스가 종료 또는 재부팅되기 전에 모든 배포가 완료되어야 합니다. 일반적으로, 인스턴스가 시작 또는 재부팅된 후 모든 배포가 시작됩니다.

  • Amazon EC2 Auto Scaling 구성에 대해 Windows Server 기본 Amazon Machine Image(AMI)를 지정하고 EC2Config 서비스를 사용해 인스턴스의 컴퓨터 이름을 설정하는 경우 배포에 실패할 수 있습니다. 이 문제를 해결하려면 Windows Server 기본 AMI에서 EC2 서비스 속성(Ec2 Service Properties)일반(General) 탭에서 컴퓨터 이름 설정(Set Computer Name)을 삭제합니다. 이 확인란을 선택 해제하면 해당 Windows Server 기본 AMI로 시작된 모든 새 WindowsServer Amazon EC2 Auto Scaling 인스턴스에 대해 이러한 동작이 비활성화됩니다. 이 동작이 비활성화된 WindowsServer Amazon EC2 Auto Scaling 인스턴스의 경우에는 이 확인란의 선택을 취소할 필요가 없습니다. 인스턴스가 재부팅된 후 실패한 배포를 인스턴스에 다시 부팅하기만 하면 됩니다.

단일 Amazon EC2 Auto Scaling 그룹으로 여러 배포 그룹 연결 피하기

모범 사례에 따라, 각 Amazon EC2 Auto Scaling 그룹에 배포 그룹을 하나만 연결하는 것이 좋습니다.

이는 Amazon EC2 Auto Scaling이 여러 배포 그룹과 연결된 후크를 보유한 인스턴스를 확장하는 경우 모든 후크에 대한 알림을 한 번에 보내기 때문입니다. 이로 인해 각 인스턴스에 대한 여러 배포가 동시에 시작됩니다. 여러 배포에서 동시에 CodeDeploy 에이전트에 명령을 보내는 경우 수명 주기 이벤트와 배포 시작 또는 이전 수명 주기 이벤트 종료 시점 사이의 제한 시간이 5분에 도달할 수 있습니다. 이렇게 되면 배포 프로세스가 예상대로 실행 중이더라도 배포에 실패하게 됩니다.

참고

수명 주기 이벤트의 스크립트에 대한 기본 제한 시간은 30분입니다. 파일에서 타임아웃을 다른 값으로 변경할 수 있습니다. AppSpec 자세한 정보는 AppSpec EC2/온프레미스 배포용 파일 추가을 참조하세요.

동시에 두 개 이상의 배포 시도가 실행되는 경우 배포가 수행되는 순서를 제어할 수 없습니다.

마지막으로 인스턴스에 대한 배포에 실패하면 Amazon EC2 Auto Scaling은 즉시 해당 인스턴스를 종료합니다. 첫 번째 인스턴스가 종료되면 나머지 실행 중인 배포가 실패로 중단되기 시작합니다. CodeDeploy 에이전트가 보류 중인 배포에 응답하는 데 1시간의 제한 시간이 있기 때문에 CodeDeploy 각 인스턴스의 제한 시간이 초과되는 데 최대 60분이 걸릴 수 있습니다.

Amazon EC2 Auto Scaling에 대한 자세한 내용은 내부: CodeDeploy 및 Auto Scaling 통합을 참조하십시오.

Amazon EC2 Auto Scaling 그룹의 EC2 인스턴스를 시작하지 못하고 "하트비트 제한 시간” 오류 발생

Amazon EC2 Auto Scaling 그룹이 새 EC2 인스턴스를 시작하지 못하고 다음과 유사한 메시지가 생성될 수 있습니다.

Launching a new EC2 instance <instance-Id>. Status Reason: Instance failed to complete user's Lifecycle Action: Lifecycle Action with token<token-Id> was abandoned: Heartbeat Timeout.

이 메시지는 일반적으로 다음 중 하나를 나타냅니다.

  • 계정과 관련된 최대 동시 배포 수에 도달했습니다. AWS 배포 한도에 대한 자세한 내용은 CodeDeploy 할당량 단원을 참조하세요.

  • Auto Scaling 그룹이 너무 많은 EC2 인스턴스를 너무 빨리 시작하려고 했습니다. 새 인스턴스마다 RecordLifecycleActionHeartbeat또는 각 인스턴스에 CompleteLifecycleAction대한 API 호출이 제한되었습니다.

  • 관련 배포 그룹이 업데이트 또는 삭제되기 전에 의 애플리케이션이 CodeDeploy 삭제되었습니다.

    애플리케이션 또는 배포 그룹을 삭제하면 관련 Amazon EC2 Auto Scaling 후크를 CodeDeploy 정리하려고 시도하지만 일부 후크는 남아 있을 수 있습니다. 명령을 실행하여 배포 그룹을 삭제하는 경우 남아있는 후크가 출력으로 반환됩니다. 하지만 명령을 실행하여 애플리케이션을 삭제할 경우에는 남아있는 후크가 출력 화면에 표시되지 않습니다.

    따라서 애플리케이션을 삭제하기 전에 애플리케이션과 연결된 배포 그룹을 모두 삭제하는 것이 모범 사례입니다. 명령으로 출력된 결과를 보고 수동으로 삭제해야 하는 수명 주기 후크를 식별할 수 있습니다.

"Hearbeat Timeout" 오류 메시지가 표시되면 남아 있는 수명 주기 후크가 원인인지 확인하여 다음과 같이 문제를 해결할 수 있습니다.

  1. 다음 중 하나를 수행하십시오.

    • delete-deployment-group명령을 호출하여 하트비트 타임아웃을 유발하는 Auto Scaling 그룹과 연결된 배포 그룹을 삭제합니다.

    • null이 아닌 비어 있는 Auto Scaling 그룹 이름 목록을 update-deployment-group사용하여 명령을 호출하여 관리형 Auto Scaling 라이프사이클 후크를 모두 CodeDeploy 분리합니다.

      예를 들어, 다음 명령을 입력합니다. AWS CLI

      aws deploy update-deployment-group --application-name my-example-app --current-deployment-group-name my-deployment-group --auto-scaling-groups

      또 다른 예로, Java와 함께 CodeDeploy API를 사용하는 경우 를 UpdateDeploymentGroup 호출하고 autoScalingGroups 로 설정하십시오new ArrayList<String>(). 이것은 autoScalingGroups를 빈 목록으로 설정하고 기존 목록을 제거합니다. 기본값으로 null을 사용하지 마세요. 이렇게 하면 autoScalingGroups가 원하는 대로 유지되지 않기 때문입니다.

    호출의 출력을 검사합니다. 출력에 Amazon EC2 Auto Scaling 수명 주기 후크 목록이 포함된 hooksNotCleanedUp 구조가 있는 경우, 남아 있는 수명 주기 후크가 있습니다.

  2. 시작에 실패한 EC2 인스턴스와 연결된 Amazon EC2 Auto Scaling 그룹의 이름을 지정하여 describe-lifecycle-hooks명령을 호출합니다. 출력에서 다음 중 하나를 찾습니다.

    • 1단계에서 식별한 hooksNotCleanedUp 구조에 해당하는 Amazon EC2 Auto Scaling 수명 주기 후크 이름.

    • Auto Scaling 그룹과 연결된 배포 그룹의 이름을 포함하는 Amazon EC2 Auto Scaling 수명 주기 후크 이름.

    • Amazon EC2 Auto Scaling 수명 주기 후크 이름으로 인해 배포 시 하트비트 타임아웃이 발생했을 수 있습니다. CodeDeploy

  3. 후크가 2단계에 나열된 범주 중 하나에 해당하는 경우 delete-lifecycle-hook명령을 호출하여 삭제합니다. 호출에서 Amazon EC2 Auto Scaling 그룹 및 수명 주기 후크를 지정합니다.

    중요

    2단계에서 설명한 대로 문제를 일으키는 후크만 삭제합니다. 실행 가능한 후크를 삭제하면 배포가 실패하거나 확장된 EC2 인스턴스에 애플리케이션 수정 버전을 배포하지 CodeDeploy 못할 수 있습니다.

  4. 원하는 Auto Scaling 그룹 이름을 create-deployment-group사용하여 update-deployment-groupor 명령을 호출합니다. CodeDeploy새 UUID를 사용하여 Auto Scaling 후크를 다시 설치합니다.

참고

CodeDeploy 배포 그룹에서 Auto Scaling 그룹을 분리하면 Auto Scaling 그룹에 진행 중인 배포가 실패할 수 있으며, Auto Scaling 그룹에 의해 확장된 새 EC2 인스턴스는 애플리케이션 수정 버전을 받지 못합니다. CodeDeploy Auto Scaling을 다시 사용하려면 Auto Scaling 그룹을 배포 그룹에 다시 연결하고 새 그룹을 호출하여 플릿 전체 CreateDeployment 배포를 시작해야 합니다. CodeDeploy

일치하지 않는 Amazon EC2 Auto Scaling 수명 주기 후크로 인해 Amazon EC2 Auto Scaling 그룹에 대한 자동 배포가 중지되거나 실패할 수 있습니다.

Amazon EC2 Auto Scaling과 수명 주기 후크를 CodeDeploy 사용하여 Amazon EC2 Auto Scaling 그룹에서 시작된 후 어떤 애플리케이션 수정 버전을 어떤 EC2 인스턴스에 배포해야 하는지 결정합니다. 수명 주기 후크 및 이러한 후크에 대한 정보가 Amazon EC2 Auto Scaling 및 에서 정확히 일치하지 않는 경우 자동 배포가 중지되거나 실패할 수 있습니다. CodeDeploy

Amazon EC2 Auto Scaling 그룹으로의 배포가 실패하는 경우 Amazon EC2 Auto Scaling의 수명 주기 후크 이름이 일치하는지 확인하십시오. CodeDeploy 그렇지 않은 경우 다음 명령 호출을 사용하십시오. AWS CLI

먼저, Amazon EC2 Auto Scaling 그룹 및 배포 그룹 둘 다에 대한 수명 주기 후크 이름 목록을 가져옵니다.

  1. describe-lifecycle-hooks명령을 호출하여 배포 그룹과 연결된 Amazon EC2 Auto Scaling 그룹의 이름을 지정합니다. CodeDeploy 출력의 LifecycleHooks 목록에서 각 LifecycleHookName 값을 기록합니다.

  2. Amazon EC2 Auto Scaling 그룹과 연결된 배포 그룹의 이름을 지정하여 get-deployment-group명령을 호출합니다. 출력의 autoScalingGroups 목록에서 Amazon EC2 Auto Scaling 그룹 이름에 일치하는 각 항목의 이름 값을 찾아서 해당되는 hook 값을 기록합니다.

이제 두 수명 주기 후크 이름 세트를 비교합니다. 문자 대 문자로 정확하게 일치하는 경우에는 후크 이름이 문제가 아닙니다. 이 단원의 다른 부분에서 설명한 기타 Amazon EC2 Auto Scaling 문제 해결 단계를 시도해 볼 수 있습니다.

그러나 두 세트의 수명 주기 후크 이름이 문자 대 문자로 정확하게 일치하지 않는 경우에는 다음을 수행하세요.

  1. get-deployment-group 명령 출력에 없는 수명 주기 후크 이름이 describe-lifecycle-hooks 명령 출력에 있으면 다음과 같이 합니다.

    1. describe-lifecycle-hooks명령 출력의 각 수명 주기 후크 이름에 대해 명령을 호출합니다 delete-lifecycle-hook.

    2. 원래 Amazon EC2 Auto Scaling 그룹의 이름을 지정하여 update-deployment-group명령을 호출합니다. CodeDeploy Amazon EC2 Auto Scaling 그룹에 새로운 대체 수명 주기 후크를 생성하고 수명 주기 후크를 배포 그룹에 연결합니다. 새 인스턴스가 Amazon EC2 Auto Scaling 그룹에 추가되면 자동 배포가 다시 시작되어야 합니다.

  2. describe-lifecycle-hooks 명령 출력에 없는 수명 주기 후크 이름이 get-deployment-group 명령 출력에 있으면 다음과 같이 합니다.

    1. update-deployment-group명령을 호출하되, 원래 Amazon EC2 Auto Scaling 그룹의 이름은 지정하지 마십시오.

    2. update-deployment-group명령을 다시 호출하되, 이번에는 원래 Amazon EC2 Auto Scaling 그룹의 이름을 지정합니다. CodeDeploy Amazon EC2 Auto Scaling 그룹에서 누락된 수명 주기 후크를 다시 생성합니다. 새 인스턴스가 Amazon EC2 Auto Scaling 그룹에 추가되면 자동 배포가 다시 시작되어야 합니다.

두 세트의 수명 주기 후크 이름이 문자 대 문자로 정확하게 일치된 후에는 애플리케이션 수정을 다시 배포해 봅니다. 하지만 Amazon EC2 Auto Scaling 그룹에 추가된 새 인스턴스에만 배포합니다. Amazon EC2 Auto Scaling 그룹에 이미 있는 인스턴스에는 자동으로 배포되지 않습니다.

“배포 그룹에 대한 인스턴스를 찾을 수 없어서 배포에 실패했습니다.” 오류

다음 CodeDeploy 오류가 표시되면 이 섹션을 읽어보십시오.

The deployment failed because no instances were found for your deployment group. Check your deployment group settings to make sure the tags for your EC2 instances or Auto Scaling groups correctly identify the instances you want to deploy to, and then try again.

가능한 원인은 다음과 같습니다.

  1. 배포 그룹 설정에는 EC2 인스턴스, 온프레미스 인스턴스 또는 올바르지 않은 Auto Scaling 그룹에 대한 태그가 포함됩니다. 이 문제를 해결하려면 태그가 올바른지 확인하고 애플리케이션을 다시 배포합니다.

  2. 배포가 시작된 후 플릿이 확장되었습니다. 이 시나리오에서는 플릿에 InService 상태에서 정상 인스턴스가 표시되지만 위의 오류도 표시됩니다. 이 문제를 해결하려면 애플리케이션을 다시 배포합니다.

  3. Auto Scaling 그룹에 InService 상태의 인스턴스가 없습니다. 이 시나리오에서는 플릿 전체 배포를 시도하면 해당 상태에 있는 인스턴스가 하나 이상 CodeDeploy 필요하므로 배포가 실패하고 위의 오류 메시지가 표시됩니다. InService InService 상태의 인스턴스가 없는 데는 여러 가지 이유가 있을 수 있습니다. 몇 가지 이유는 다음과 같습니다.

    • Auto Scaling 그룹 크기를 0으로 예약(또는 수동으로 구성)했습니다.

    • Auto Scaling이 잘못된 EC2 인스턴스(예: EC2 인스턴스에 하드웨어 오류가 있음)를 감지하고 모두 취소하여 InService 상태의 인스턴스가 하나도 남지 않았습니다.

    • 에서 0 로 확장 이벤트가 발생하는 동안1, 이전에 성공했지만 마지막 배포 이후 비정상 상태가 된 수정 버전 (마지막으로 성공한 수정이라고 함) 을 CodeDeploy 배포했습니다. 이로 인해 확장된 인스턴스로의 배포가 실패하고 그 결과 Auto Scaling이 인스턴스를 취소하고 InService 상태의 인스턴스가 남지 않았습니다.

      InService 상태의 인스턴스가 없는 경우, To troubleshoot the error if there are no instances in the InService state 절차에 설명된 대로 문제를 해결합니다.

해당 상태에 인스턴스가 없는 경우의 오류 문제 해결 InService
  1. Amazon EC2 콘솔에서 원하는 용량(Desired Capacity) 설정을 확인합니다. 값이 0이면 양수로 설정합니다. 인스턴스가 InService 상태가 되어 배포가 성공할 때까지 기다립니다. 문제를 해결했으면 이 문제 해결 절차의 나머지 단계를 건너뛸 수 있습니다. 원하는 용량(Desired Capacity) 설정에 대한 자세한 내용은 Auto Scaling 그룹에 용량 제한 설정Amazon EC2 Auto Scaling 사용 설명서를 참조하세요.

  2. Auto Scaling이 원하는 용량을 충족하기 위해 새 EC2 인스턴스를 계속 시작하려고 시도하지만 확장을 수행할 수 없는 경우, 일반적으로 Auto Scaling 수명 주기 후크가 실패하기 때문입니다. 이 문제는 다음과 같이 해결합니다.

    1. 어떤 Auto Scaling 수명 주기 후크 이벤트가 실패하는지 확인하려면 Amazon EC2 Auto Scaling 사용 설명서의 Auto Scaling 그룹에 대한 크기 조정 활동 확인을 참조하세요.

    2. 실패한 후크 이름이 인 경우 로 CodeDeploy 이동하여 배포 그룹을 찾아 Auto Scaling에서 시작한 실패한 배포를 찾으십시오. CodeDeploy-managed-automatic-launch-deployment-hook-DEPLOYMENT_GROUP_NAME 그런 다음 배포에 실패한 이유를 조사합니다.

    3. 배포가 실패한 이유 (예: CloudWatch 알람 발생) 를 이해하고 수정 버전을 변경하지 않고 문제를 해결할 수 있다면 지금 변경하십시오.

    4. 조사 결과 마지막으로 성공한 수정 버전이 더 이상 정상이 아니며 Auto Scaling 그룹에 정상 인스턴스가 없는 것으로 CodeDeploy 확인되면 배포 교착 상태에 있는 것입니다. 이 문제를 해결하려면 Auto Scaling 그룹에서 CodeDeploy 의 수명 주기 후크를 일시적으로 제거한 다음 후크를 다시 설치하고 새 (양호한) 수정 CodeDeploy 버전을 다시 배포하여 잘못된 수정 버전을 수정해야 합니다. 지침은 다음 섹션을 참조하세요.

배포 교착 상태 문제를 해결하려면(CLI)
  1. (선택 사항) CodeDeploy 오류를 일으키는 CI/CD 파이프라인을 차단하여 이 문제를 해결하는 동안 예상치 못한 배포가 발생하지 않도록 하십시오.

  2. 현재 Auto Scaling DesiredCapacity설정을 기록해 두십시오.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-name ASG_NAME

    이 절차의 끝부분에서 이 숫자로 다시 크기를 조정해야 할 수도 있습니다.

  3. Auto Scaling DesiredCapacity설정을 로 설정합니다1. 원하는 용량이 1보다 큰 경우 시작할 수 있는 선택 사항입니다 이 설정을 1로 줄이면 인스턴스가 나중에 프로비저닝하고 배포하는 데 걸리는 시간이 단축되어 문제 해결 속도가 빨라집니다. Auto Scaling에서 원하는 용량이 원래대로 0으로 설정된 경우, 1로 늘려야 합니다. 이 변경은 필수입니다.

    aws 오토스케일링 set-desired-capacity -- auto-scaling-group-name ASG_NAME --원하는 용량 1

    참고

    이 절차의 나머지 단계에서는 다음과 같이 설정했다고 가정합니다. DesiredCapacity1

    이때 Auto Scaling은 하나의 인스턴스로 크기를 조정하려고 시도합니다. 그런 다음 CodeDeploy 추가된 후크가 여전히 존재하기 때문에 배포를 CodeDeploy 시도하고 배포가 실패하고 Auto Scaling이 인스턴스를 취소하고 Auto Scaling에서 원하는 용량에 도달하기 위해 인스턴스를 다시 시작하려고 시도하지만 다시 실패합니다. 즉, 취소와 재실행이 반복되는 상태인 것입니다.

  4. 배포 그룹에서 Auto Scaling 그룹의 등록을 취소합니다.

    주의

    다음 명령은 소프트웨어가 없는 새 EC2 인스턴스를 시작합니다. 명령을 실행하기 전에 소프트웨어를 실행하지 않는 Auto Scaling InService 인스턴스가 허용되는지 확인합니다. 예를 들어, 인스턴스에 연결된 로드 밸런서가 소프트웨어 없이 이 호스트로 트래픽을 전송하지 않는지 확인합니다.

    중요

    아래 표시된 CodeDeploy 명령을 사용하여 후크를 제거합니다. 에서 제거를 인식하지 못하므로 Auto Scaling 서비스를 통해 후크를 제거하지 마십시오 CodeDeploy.

    aws deploy update-deployment-group --application-name APPLICATION_NAME --current-deployment-group-name DEPLOYMENT_GROUP_NAME --auto-scaling-groups

    이 명령을 실행하면 다음과 같은 문제가 발생합니다.

    1. CodeDeploy 배포 그룹에서 Auto Scaling 그룹을 등록 취소합니다.

    2. CodeDeploy Auto Scaling 그룹에서 Auto Scaling 라이프사이클 후크를 제거합니다.

    3. 배포가 실패한 원인인 후크가 더 이상 존재하지 않으므로 Auto Scaling은 기존 EC2 인스턴스를 취소하고 즉시 새 인스턴스를 시작하여 원하는 용량으로 크기를 조정합니다. 새 인스턴스 곧 InService 상태로 변경됩니다. 새 인스턴스에는 소프트웨어가 포함되어 있지 않습니다.

  5. EC2 인스턴스가 InService 상태가 될 때까지 기다립니다. 이를 확인하려면 다음 명령을 사용합니다.

    aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names ASG_NAME --query AutoScalingGroups[0].Instances[*].LifecycleState

  6. EC2 인스턴스에 후크를 다시 추가합니다.

    중요

    아래 표시된 CodeDeploy 명령을 사용하여 후크를 추가합니다. 에서 추가 내용을 인식하지 못하므로 Auto Scaling 서비스를 사용하여 후크를 추가하지 마십시오 CodeDeploy.

    aws deploy update-deployment-group --application-name APPLICATION_NAME --current-deployment-group-name DEPLOYMENT_GROUP_NAME --auto-scaling-groups ASG_NAME

    이 명령을 실행하면 다음과 같은 문제가 발생합니다.

    1. CodeDeploy Auto Scaling 라이프사이클 후크를 EC2 인스턴스에 다시 설치합니다.

    2. CodeDeploy Auto Scaling 그룹을 배포 그룹에 다시 등록합니다.

  7. 정상이고 사용하고 싶은 Amazon S3 또는 GitHub 수정 버전을 사용하여 플릿 전체에 배포하십시오.

    예를 들어 개정이 httpd_app.zip 객체 키를 사용하여 my-revision-bucket을 호출하는 Amazon S3 버킷의 .zip 파일인 경우 다음 명령을 입력합니다.

    aws deploy create-deployment --application-name APPLICATION_NAME --deployment-group-name DEPLOYMENT_GROUP_NAME --revision "revisionType=S3,s3Location={bucket=my-revision-bucket,bundleType=zip,key=httpd_app.zip}"

    이제 InService 인스턴스 1개가 Auto Scaling 그룹에 있으므로 배포는 정상 작동하며 더 이상 배포 그룹에 대한 인스턴스를 찾을 수 없어서 배포에 실패했습니다 오류가 표시되지 않습니다.

  8. 다음은 이전에 Auto Scaling 그룹을 크기 조정한 경우, 배포가 성공한 후 원래 용량으로 다시 조정하는 방법입니다.

    aws autoscaling set-desired-capacity --auto-scaling-group-name ASG_NAME --desired-capacity ORIGINAL_CAPACITY

배포 교착 상태 문제를 해결하려면 (콘솔)
  1. (선택 사항) CodeDeploy 오류를 일으키는 CI/CD 파이프라인을 차단하여 이 문제를 해결하는 동안 예상치 못한 배포가 발생하지 않도록 하십시오.

  2. Amazon EC2 콘솔로 이동하여 Auto Scaling 원하는 용량(Desired capacity) 설정을 확인합니다. 이 절차의 끝부분에서 이 숫자로 다시 크기를 조정해야 할 수도 있습니다. 이 설정을 찾는 방법에 대한 자세한 내용은 Auto Scaling 그룹의 용량 제한 설정을 참조하세요.

  3. 원하는 EC2 인스턴스 수를 1로 설정합니다.

    원하는 용량이 처음부터 1보다 컸다면 이 설정은 선택 사항입니다. 이 설정을 1로 줄이면 인스턴스가 나중에 프로비저닝하고 배포하는 데 걸리는 시간이 단축되어 문제 해결 속도가 빨라집니다. Auto Scaling에 대해 원하는 용량(Desired capacity)이 원래 0으로 설정되어 있었다면 1로 늘려야 합니다. 이 변경은 필수입니다.

    참고

    이 절차의 나머지 단계에서는 원하는 용량(Desired capacity)1로 설정했다고 가정합니다.

    1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 열고 탐색 창에서 Auto Scaling Groups(Auto Scaling 그룹)를 선택합니다.

    2. 해당 리전을 선택합니다.

    3. 문제가 있는 Auto Scaling 그룹으로 이동합니다.

    4. 일반 세부 정보(General details)에서 편집(Edit)을 선택합니다.

    5. 원하는 용량(Desired capacity)1로 설정합니다.

    6. 업데이트를 선택합니다.

  4. 배포 그룹에서 Auto Scaling 그룹의 등록을 취소합니다.

    주의

    다음 하위 단계에서는 소프트웨어가 없는 새 EC2 인스턴스를 시작합니다. 명령을 실행하기 전에 소프트웨어를 실행하지 않는 Auto Scaling InService 인스턴스가 허용되는지 확인합니다. 예를 들어, 인스턴스에 연결된 로드 밸런서가 소프트웨어 없이 이 호스트로 트래픽을 전송하지 않는지 확인합니다.

    1. https://console.aws.amazon.com/codedeploy/ 에서 콘솔을 여십시오. CodeDeploy

    2. 해당 리전을 선택합니다.

    3. 탐색 창에서 애플리케이션을 선택합니다.

    4. CodeDeploy 애플리케이션 이름을 선택합니다.

    5. CodeDeploy 배포 그룹 이름을 선택합니다.

    6. 편집을 선택합니다.

    7. 환경 구성(Environment configuration)에서 Amazon EC2 Auto Scaling 그룹(Amazon EC2 Auto Scaling groups)을 선택 해제합니다.

      참고

      환경 구성이 정의되어 있지 않으면 콘솔에서 구성을 저장할 수 없습니다. 확인을 우회하려면 호스트로 확인되지 않는 EC2 또는 On-premises 태그를 임시로 추가하세요. 태그를 추가하려면 Amazon EC2 인스턴스(Amazon EC2 instances)또는온프레미스 인스턴스(On-premises instance)를 선택하고 EC2 또는 On-premises의 태그 Key(키)를 추가하세요. 태그 값(Value)은 비워 둘 수 있습니다.

    8. 변경 사항 저장를 선택합니다.

      이러한 하위 단계를 완료한 후 다음과 같은 상황이 발생합니다.

      1. CodeDeploy 배포 그룹에서 Auto Scaling 그룹을 등록 취소합니다.

      2. CodeDeploy Auto Scaling 그룹에서 Auto Scaling 라이프사이클 후크를 제거합니다.

      3. 배포가 실패한 원인인 후크가 더 이상 존재하지 않으므로 Auto Scaling은 기존 EC2 인스턴스를 취소하고 즉시 새 인스턴스를 시작하여 원하는 용량으로 크기를 조정합니다. 새 인스턴스 곧 InService 상태로 변경됩니다. 새 인스턴스에는 소프트웨어가 포함되어 있지 않습니다.

  5. EC2 인스턴스가 InService 상태가 될 때까지 기다립니다. 상태를 확인하는 방법은 다음과 같습니다.

    1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 엽니다.

    2. 탐색 창에서 Auto Scaling 그룹을 선택합니다.

    3. 사용자의 Auto Scaling 그룹을 선택합니다.

    4. 콘텐츠 창에서 인스턴스 관리(Instance Management) 탭을 선택합니다.

    5. 인스턴스에서 수명 주기 열이 인스턴스 InService옆에 표시되는지 확인하십시오.

  6. 제거할 때 사용한 것과 동일한 방법을 사용하여 Auto Scaling 그룹을 CodeDeploy 배포 그룹에 다시 등록합니다.

    1. https://console.aws.amazon.com/codedeploy/ 에서 CodeDeploy 콘솔을 엽니다.

    2. 해당 리전을 선택합니다.

    3. 탐색 창에서 애플리케이션을 선택합니다.

    4. CodeDeploy 애플리케이션 이름을 선택합니다.

    5. CodeDeploy 배포 그룹 이름을 선택합니다.

    6. 편집을 선택합니다.

    7. 환경 구성(Environment configuration)에서 Amazon EC2 Auto Scaling 그룹(Amazon EC2 Auto Scaling groups)을 선택하고 목록에서 사용자의 Auto Scaling 그룹을 선택합니다.

    8. Amazon EC2 인스턴스(Amazon EC2 instances) 또는 온프레미스 인스턴스(On-premises instances)에서 추가한 태그를 찾아 제거합니다.

    9. Amazon EC2 인스턴스(Amazon EC2 instances) 또는 온프레미스 인스턴스(On-premises instances) 옆에 있는 확인란을 선택 취소합니다.

    10. 변경 사항 저장를 선택합니다.

    이 구성으로 Auto Scaling 그룹에 수명 주기 후크를 다시 설치합니다.

  7. 정상이고 사용하고 싶은 Amazon S3 또는 GitHub 수정 버전을 사용하여 플릿 전체에 배포하십시오.

    예를 들어 개정이 httpd_app.zip 객체 키를 사용하여 my-revision-bucket을 호출하는 Amazon S3 버킷의 .zip 파일인 경우 다음을 수행합니다.

    1. CodeDeploy 콘솔의 배포 그룹 페이지에서 배포 생성을 선택합니다.

    2. Revision type(수정 유형)에서 My application is stored in Amazon S3(내 애플리케이션은 Amazon S3에 저장됨)를 선택합니다.

    3. 개정 위치(Revision location)s3://my-revision-bucket/httpd_app.zip을 선택합니다.

    4. 개정 파일 형식(Revision file type).zip을 선택합니다.

    5. 배포 만들기를 선택합니다.

    이제 InService 인스턴스 1개가 Auto Scaling 그룹에 있으므로 배포가 정상 작동하며 더 이상 “배포 그룹에 대한 인스턴스를 찾을 수 없어서 배포에 실패했습니다.” 오류가 표시되지 않습니다.

  8. 다음은 이전에 Auto Scaling 그룹을 크기 조정한 경우, 배포가 성공한 후 원래 용량으로 다시 조정하는 방법입니다.

    1. https://console.aws.amazon.com/ec2/에서 Amazon EC2 콘솔을 열고 탐색 창에서 Auto Scaling Groups(Auto Scaling 그룹)를 선택합니다.

    2. 해당 리전을 선택합니다.

    3. Auto Scaling 그룹으로 이동합니다.

    4. 일반 세부 정보(General details)에서 편집(Edit)을 선택합니다.

    5. 원하는 용량(Desired capacity)을 원래 값으로 다시 설정합니다.

    6. 업데이트를 선택합니다.