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 인스턴스를 시작하지 못하게 함). 자세한 내용은 Amazon Auto Scaling용 다음을 사용하여 배포 그룹 설정 변경 CodeDeploy 또는 수동 조정을 참조하세요. 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 스크립트를 포함합니다.

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

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

  • EC2:RunInstances

  • EC2:CreateTags

  • iam:PassRole

이러한 권한이 없다면 이 오류가 표시됩니다. 자세한 내용은 Amazon Auto Scaling 사용 설명서의 , Auto EC2 Auto Scaling 그룹에 대한 시작 템플릿 자습서: Auto Scaling 그룹에 애플리케이션을 배포하는 데 사용합니다 CodeDeploy .생성 및 권한을 참조하세요. 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 인스턴스를 종료하거나 재부팅하면 배포가 실패할 수 있습니다.

Amazon EC2 Auto Scaling을 통해 EC2 인스턴스를 시작한 다음 인스턴스가 종료되거나 재부팅되면 다음과 같은 이유로 해당 인스턴스에 대한 배포가 실패할 수 있습니다.

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

  • 인스턴스가 재부팅되지만 인스턴스가 시작되는 데 5분 이상 걸립니다. 는 이를 제한 시간으로 CodeDeploy 처리합니다. 이 서비스에서 인스턴스에 대한 현재 및 이후 배포에 모두 실패합니다.

이 문제를 해결하려면:

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

  • Amazon EC2 Auto Scaling 구성에 Windows Server 기본 Amazon Machine Image(AMI)를 지정하고 EC2Config 서비스를 사용하여 인스턴스의 컴퓨터 이름을 설정하는 경우 배포가 실패할 수 있습니다. 이 문제를 해결하려면 Windows Server 기반 의 EC2 서비스 속성 의 AMI 일반 탭에서 컴퓨터 이름 설정을 선택 취소합니다. 이 확인란을 선택 취소하면 해당 Windows Server 기반 로 시작된 모든 새 Windows Server Amazon EC2 Auto Scaling 인스턴스에 대해 이 동작이 비활성화됩니다AMI. 이 동작이 활성화된 Windows Server 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 에이전트 CodeDeploy 가 보류 중인 배포에 응답하는 데 1시간의 제한 시간이 있으므로 각 인스턴스의 제한 시간이 최대 60분 정도 걸릴 수 있습니다.

Amazon EC2 Auto Scaling 대한 자세한 내용은 후드 아래: CodeDeploy 및 Auto Scaling 통합을 참조하세요.

EC2 Amazon EC2 Auto Scaling 그룹의 인스턴스가 시작되지 않아 “Heartbeat Timeout” 오류 수신

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 그룹과 연결된 배포 그룹을 삭제합니다.

    • Auto Scaling 그룹 이름의 빈 목록이 null이 아닌 update-deployment-group 명령을 호출하여 CodeDeploy관리형 Auto Scaling 수명 주기 후크를 모두 분리합니다.

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

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

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

    • CodeDeploy 배포에 하트비트 제한 시간이 발생했을 수 있는 Amazon EC2 Auto Scaling 수명 주기 후크 이름입니다.

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

    중요

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

  4. 원하는 Auto Scaling 그룹 이름으로 update-deployment-group 또는 create-deployment-group 명령을 호출합니다. CodeDeploy 는 새 로 Auto Scaling 후크를 다시 설치합니다UUIDs.

참고

배포 그룹에서 Auto Scaling 그룹을 분리하면 Auto Scaling 그룹에 CodeDeploy 대한 진행 중인 배포가 실패할 수 있으며 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. get-deployment-group 명령을 호출하여 Amazon EC2 Auto Scaling 그룹과 연결된 배포 그룹의 이름을 지정합니다. 출력의 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 지정합니다. 는 Amazon EC2 Auto Scaling 그룹에서 새 대체 수명 주기 후크를 CodeDeploy 생성하고 수명 주기 후크를 배포 그룹과 연결합니다. 이제 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 그룹의 이름을 지정합니다. 는 Amazon EC2 Auto Scaling 그룹에서 누락된 수명 주기 후크를 CodeDeploy 다시 생성합니다. 이제 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 상태의 인스턴스가 없습니다. 이 시나리오에서는 플릿 전체 배포를 수행하려고 하면 에 하나 이상의 인스턴스가 InService 상태에 CodeDeploy 있어야 하기 때문에 위의 오류 메시지와 함께 배포가 실패합니다. 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 콘솔에서 원하는 용량 설정을 확인합니다. 값이 0이면 양수로 설정합니다. 인스턴스가 InService 상태가 되어 배포가 성공할 때까지 기다립니다. 문제를 해결했으면 이 문제 해결 절차의 나머지 단계를 건너뛸 수 있습니다. 원하는 용량 설정에 대한 자세한 내용은 Amazon Auto Scaling 사용 설명서의 Auto Scaling 그룹에서 용량 제한 설정을 참조하세요. EC2 Auto Scaling

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

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

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

    3. 배포가 실패한 이유(예: CloudWatch 경보 발생)를 이해하고 개정을 변경하지 않고도 문제를 해결할 수 있는 경우 지금 수행합니다.

    4. 조사 후 CodeDeploy의 마지막으로 성공한 개정이 더 이상 정상이 아닌 것으로 확인되고 Auto Scaling 그룹에 정상 인스턴스가 없는 경우 배포 교착 상태 시나리오에 있는 것입니다. 이 문제를 해결하려면 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

    참고

    이 절차의 나머지 단계에서는 를 DesiredCapacity로 설정했다고 가정합니다1.

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

  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 용량 설정을 기록해 둡니다. 이 절차의 끝부분에서 이 숫자로 다시 크기를 조정해야 할 수도 있습니다. 이 설정을 찾는 방법에 대한 자세한 내용은 Auto Scaling 그룹의 용량 제한 설정을 참조하세요.

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

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

    참고

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

    1. 에서 Amazon EC2 콘솔을 열고 탐색 창에서 Auto Scaling Groupshttps://console.aws.amazon.com/ec2/선택합니다.

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

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

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

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

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

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

    주의

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

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

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

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

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

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

    6. 편집을 선택합니다.

    7. 환경 구성 에서 Amazon EC2 Auto Scaling 그룹 을 선택 취소합니다.

      참고

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

    8. Save changes(변경 사항 저장)를 선택합니다.

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

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

      2. CodeDeploy 는 Auto Scaling 그룹에서 Auto Scaling 수명 주기 후크를 제거합니다.

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

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

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

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

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

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

    5. 인스턴스 에서 수명 주기 열이 인스턴스 InService 옆에 표시되는지 확인합니다.

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

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

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

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

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

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

    6. 편집을 선택합니다.

    7. 환경 구성 에서 Amazon EC2 Auto Scaling 그룹을 선택하고 목록에서 Auto Scaling 그룹을 선택합니다.

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

    9. Amazon EC2 인스턴스 또는 온프레미스 인스턴스 옆의 확인란을 선택 취소합니다.

    10. Save changes(변경 사항 저장)를 선택합니다.

    이 구성으로 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. 에서 Amazon EC2 콘솔을 열고 탐색 창에서 Auto Scaling Groupshttps://console.aws.amazon.com/ec2/선택합니다.

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

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

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

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

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