AWS CloudFormation의 Windows Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에 대해 “Failed to receive X resource signal(s) within the specified duration.” 오류 메시지가 나타납니다.
간략한 설명
이 오류는 CloudFormation에서 ResourceSignal이 지정된 CreationPolicy 속성이 있는 리소스에 대한 성공 신호를 수신하지 못할 때 발생합니다. 이 오류는 Amazon EC2 인스턴스, Auto Scaling 그룹 또는 대기 조건에서 발생할 수 있습니다.
참고: 다음 해결 방법은 Windows 인스턴스로 생성한 CloudFormation 스택에만 적용됩니다. Linux 인스턴스의 경우, AWS CloudFormation에서 “Failed to receive X resource signal(s) within the specified duration.” 오류를 해결하려면 어떻게 해야 합니까?를 참조하십시오.
해결 방법
사용 사례에 따라 다음 문제 해결 단계를 사용하여 문제를 해결하십시오.
참고: 스택 롤백을 방지하려면 CloudFormation 콘솔의 Stack failure options(스택 실패 옵션)에서 Preserve successfully provisioned resources(성공적으로 프로비저닝된 리소스 보존)를 선택합니다. 이 옵션을 선택하면 스택을 삭제할 때까지 실패한 인스턴스가 종료되지 않습니다.
cfn-bootstrap MSI 패키지가 AWS CloudFormation 스택의 하나 이상의 인스턴스에 설치되지 않음
스택에 신호를 전송하도록 구성된 인스턴스에 cfn-signal 스크립트가 설치되어 있는지 확인하려면 다음 단계를 완료하십시오.
- RDP를 사용하여 Windows 인스턴스에 연결합니다.
- cfn 헬퍼 스크립트 패키지가 설치되었는지 확인합니다. Windows PowerShell에서 다음 명령을 실행합니다.
Get-Package -name aws-cfn-bootstrap
중요: 기본적으로 CloudFormation 헬퍼 스크립트는 Amazon Windows Amazon Machine Image(AMI)에 설치되어 있습니다. 헬퍼 스크립트를 설치하려면 CloudFormation 헬퍼 스크립트 참조를 참조하십시오.
AWS CloudFormation 템플릿에 구문 오류 또는 잘못된 값이 있음
오류와 잘못된 값을 찾으려면 다음 단계를 완료하십시오.
- 코드 편집기에서 스택의 CloudFormation 템플릿을 엽니다. 그런 다음 UserData 속성 섹션을 찾습니다.
- 구문 오류, 공백 누락, 맞춤법 오류 및 기타 오타를 확인합니다.
- 스택, 리소스 및 AWS 리전 속성의 값이 올바른지 확인합니다.
**참고:**UserData 속성에 포함된 부트스트랩 스크립트에 구문 오류나 잘못된 값이 있는지 확인합니다. 스크립트는 cfn-signal을 호출합니다.
cfn-init 명령 내에서 신호를 보내는 경우, cfn-init 로그에서 신호에 대한 정보를 찾으십시오. cloud-init 또는 cfn-init 로그에서 오류를 검색하려면 RDP를 사용하여 인스턴스에 연결합니다. 그런 다음 “error” 또는 “failure”라는 키워드를 사용하여 다음 로그에서 자세한 오류 또는 실패 메시지를 검색합니다.
C:\cfn\log\cfn-init.log
C:\cfn\log\cfn-init-cmd.log
C:\cfn\log\cfn-wire.log
CreationPolicy 속성에 대한 timeout 속성이 매우 낮음
timeout 속성 값은 CreationPolicy 속성에 의해 정의됩니다. cfn-signal 스크립트가 CloudFormation 리소스에 신호를 보내기 전에 값이 작업을 실행할 수 있을 만큼 충분히 큰지 확인합니다.
timeout 속성 값을 확인하고 시그널링 및 리소스 장애 타임스탬프를 비교하려면 다음 단계를 완료하십시오.
-
코드 편집기에서 스택의 CloudFormation 템플릿을 열어 timeout 속성 값을 찾습니다.
참고: timeout 속성 값은 CloudFormation이 오류를 반환하기 전에 신호를 기다리는 최대 시간입니다.
-
cfn-signal 스크립트가 활성화된 시점을 추정하려면 RDP를 사용하여 인스턴스에 연결합니다. 그리고 나서 다음 명령을 실행합니다.
C:\cfn\log\cfn-init.log
파일에 기록된 시작 및 종료 타임스탬프를 비교하여 부트스트랩에 걸린 시간을 추정합니다. 필요에 따라 시간 제한 값을 수정합니다. 지정할 수 있는 최대 시간은 12시간입니다.
로그 파일에는 SUCCESS 신호가 CloudFormation 리소스로 전송될 때의 타임스탬프가 표시됩니다.
예시:
2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS
-
CloudFormation 콘솔을 엽니다.
-
Events(이벤트) 보기를 선택합니다.
-
Status reason(상태 이유)을 선택합니다. 상태 이유가 "Failed to receive X resource signal(s) within the specified duration."인 이벤트의 행을 펼칩니다.
-
시그널링 타임스탬프와 리소스 실패 타임스탬프를 비교합니다.
참고: 성공적으로 완료하려면 인스턴스가 생성되거나 생성에 실패하기 전에 스크립트에서 신호를 보내야 합니다.
cfn-signal이 Amazon EC2 인스턴스에서 전송되지 않음
CloudFormation이 수신한 신호가 인스턴스에서 왔는지 확인합니다. C:\cfn\log\cfn-wire.log에서 사용할 수 있는 cfn 와이어 로그를 확인하십시오. 응답이 200이 아닌 경우 인스턴스와 CloudFormation의 엔드포인트 간에 연결 문제가 있을 수 있습니다.
인스턴스에서 재부팅을 구성하고 cfn-signal이 UserData 섹션에 설정된 경우 신호가 전송되지 않을 수 있습니다. 이는 UserData가 한 번만 실행되기 때문입니다. 자세한 내용은 인스턴스가 부트스트랩을 완료하기 전에 Amazon EC2 Windows 인스턴스가 CREATE_COMPLETE로 다시 신호를 보내지 않게 하려면 어떻게 해야 합니까?를 참조하십시오.
인스턴스가 아닌 다른 곳에서 신호를 보낼 때는 SignalResource API를 사용하십시오. 예를 들어, AWS Lambda 함수를 사용하여 SignalResource API를 직접 호출한 다음 스택에 신호를 보낼 수 있습니다. 오류가 발생하면 CloudWatch Logs로 Lambda 로그를 확인하여 신호가 스택으로 전송되지 않은 이유를 파악하십시오.