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 인스턴스를 계속해서 시작하고 종료합니다.

    CodeDeploy 배포 그룹에서 Amazon EC2 Auto Scaling 그룹을 연결 해제하거나 원하는 수의 인스턴스가 현재 인스턴스 개수와 일치하도록(따라서 Amazon EC2 Auto Scaling에서 EC2 인스턴스를 더 이상 시작할 수 없도록) Amazon EC2 Auto Scaling 그룹의 구성을 변경합니다. 자세한 내용은 CodeDeploy에서 배포 그룹 설정 변경 또는 Amazon EC2 Auto Scaling의 수동 확장을 참조하세요.

  • CodeDeploy 에이전트가 응답하지 않습니다. EC2 인스턴스가 시작된 직후 실행되는 초기화 스크립트(예: cloud-init 스크립트)가 한 시간 이상 실행되는 경우 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 서비스에서 작업을 수행할 권한을 제공하지 않습니다: AzazonAutoScaling” 오류

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

  • EC2:RunInstances

  • EC2:CreateTags

  • iam:PassRole

이러한 권한이 없다면 이 오류가 표시됩니다. 자세한 내용은 자습서: CodeDeploy를 사용하여 Amazon EC2 Auto Scaling 그룹에 애플리케이션 배포, 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 파일에서 제한 시간을 다른 값으로 변경할 수 있습니다. 자세한 내용은 섹션을 참조하세요EC2 온프레미스 배포용 AppSpec 파일 추가

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

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

Amazon EC2 Auto Scaling에 대한 자세한 내용은 세부 정보: CodeDeploy 및 Amazon EC2 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의 애플리케이션과 연결된 배포 그룹이 업데이트 또는 삭제되기 전에 이러한 애플리케이션이 삭제되었습니다.

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

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

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

  1. 다음 중 하나를 수행하세요.

    • delete-deployment-group 명령을 호출하여 하트비트 제한 시간 초과를 일으키는 Auto Scaling 그룹과 연결된 배포 그룹을 삭제합니다.

    • null이 아닌 빈 Auto Scaling 그룹 이름 목록을 사용하여 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을 호출하고 autoScalingGroupsnew 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 수명 주기 후크 이름.

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

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

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

    중요

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

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

참고

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

일치하지 않는 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 명령을 호출하여, CodeDeploy의 배포 그룹에 연결된 Amazon EC2 Auto Scaling 그룹의 이름을 지정합니다. 출력의 LifecycleHooks 목록에서 각 LifecycleHookName 값을 기록합니다.

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

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

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

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

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

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

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

    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-managed-automatic-launch-deployment-hook-DEPLOYMENT_GROUP_NAME인 경우, CodeDeploy로 이동하여 배포 그룹을 찾은 다음 Auto Scaling에서 시작된 실패한 배포를 찾습니다. 그런 다음 배포에 실패한 이유를 조사합니다.

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

    4. 조사 후 CodeDeploy의 마지막으로 성공한 개정이 더 이상 정상적이지 않고 Auto Scaling 그룹에 정상 인스턴스가 0개로 나타난다면 배포 교착 시나리오 상황인 것입니다. 이 문제를 해결하려면 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 autoscaling set-desired-capacity --auto-scaling-group-name ASG_NAME --desired-capacity 1

    참고

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

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

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

    주의

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

    중요

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

    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 명령을 사용하여 후크를 추가합니다. CodeDeploy에서 추가가 인식되지 않으므로 Auto Scaling 서비스를 사용하여 후크를 추가하지 마세요.

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

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

    1. CodeDeploy EC2 인스턴스에 Auto Scaling 수명 주기 후크를 다시 설치합니다.

    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/ec2autoscaling/에서 Amazon EC2 Auto Scaling 콘솔을 엽니다.

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

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

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

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

    6. [Update]를 선택합니다.

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

    주의

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

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

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

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

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

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

    6. [Edit]를 선택합니다.

    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. [Save changes]를 선택합니다.

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

      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. 인스턴스(Instances)에서 인스턴스 옆에 있는 수명 주기(Lifecycle) 열이 InService라고 표시되는지 확인합니다.

  6. Auto Scaling 그룹을 등록 취소했을 때 사용한 방법으로 CodeDeploy 배포 그룹에 다시 등록합니다.

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

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

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

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

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

    6. [Edit]를 선택합니다.

    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. [Save changes]를 선택합니다.

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

  7. 정상 상태이고 사용하고 싶은 Amazon S3 또는 GitHub 개정을 사용하여 플릿 전체 배포를 생성합니다.

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

    1. CodeDeploy 콘솔의 배포 그룹(Deployment Group) 페이지에서 배포 생성(Create deployment)을 선택합니다.

    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. Create deployment(배포 만들기)를 선택합니다.

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

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

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

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

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

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

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

    6. [Update]를 선택합니다.