다음과 같은 오류가 발생합니다. AWS CloudFormation의 Linux Amazon Elastic Compute Cloud (Amazon EC2) 인스턴스에 대해 “Failed to receive X resource signal(s) within the specified duration.”
간략한 설명
이 오류는 CloudFormation이 ResourceSignal이 지정된 CreationPolicy 속성이 있는 리소스에 대한 성공 신호를 수신하지 못할 때 발생합니다. 이 오류는 Amazon EC2 인스턴스, Auto Scaling 그룹 또는 대기 조건에서 발생할 수 있습니다.
참고: 다음 해결 방법은 Linux 인스턴스로 생성한 CloudFormation 스택에만 적용됩니다. Windows 인스턴스의 경우, AWS CloudFormation의 EC2 Windows 인스턴스에 대한 “Failed to receive X resource signal(s) within the specified duration.” 오류를 해결하려면 어떻게 해야 합니까?를 참조하세요.
해결 방법
사용 사례에 따라 다음 문제 해결 단계를 사용하여 문제를 해결하세요.
참고: 스택 롤백을 방지하려면 CloudFormation 콘솔에서 스택 실패 옵션에서 성공적으로 프로비저닝된 리소스 보존을 선택하세요. 이 옵션은 실패 롤백이 없으며 스택을 삭제할 때까지 인스턴스가 종료되지 않음을 의미합니다.
cfn-signal 스크립트는 CloudFormation 스택의 인스턴스에 설치되지 않았습니다
스택에 신호를 전송하도록 구성된 인스턴스에 cfn-signal 스크립트가 설치되어 있는지 확인하려면 다음 단계를 완료하세요.
-
SSH를 사용해 Linux 인스턴스에 연결합니다.
-
다음 스크립트 중 하나를 사용하여 cfn-signal 스크립트가 설치되었는지 확인합니다.
cfn-signal 스크립트가 디렉터리에 있는지 확인하려면 다음 명령을 실행합니다.
$ sudo find / -name cfn-signal
/opt/aws/bin/cfn-signal
/opt/aws/apitools/cfn-init-1.4-30.amzn2/bin/cfn-sign
cfn-signal 스크립트가 포함된 CloudFormation 헬퍼 스크립트 패키지가 설치되었는지 확인하려면 다음 명령을 실행합니다.
$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-30.amzn2.noarch
중요: 위 명령은 RPM 패키지 관리자를 사용하는 배포에서만 작동합니다. 기본적으로 CloudFormation 헬퍼 스크립트는 Amazon Linux Amazon Machine Images(AMIs)에 설치됩니다. 헬퍼 스크립트를 설치하려면 CloudFormation 헬퍼 스크립트 레펀러스를 참조하십시오.
CloudFormation 템플릿에 구문 오류나 잘못된 값이 있습니다
오류와 잘못된 값을 찾으려면 다음 단계를 완료하십시오.
- 코드 편집기에서 스택의 템플릿을 엽니다. 그런 다음 UserData 속성 섹션을 찾습니다.
- 구문 오류, 공백 누락, 맞춤법 오류 및 기타 오타를 확인하세요.
- 스택, 리소스 및 AWS 리전 속성의 값이 올바른지 확인합니다.
참고: UserData 속성에 포함된 부트스트랩 스크립트를 확인합니다. 스크립트는 cfn-signal을 호출합니다. 구문 오류나 잘못된 값이 있는지 확인합니다.
cfn-init 명령 내에서 신호를 보내는 경우, cfn-init 로그에서 신호에 대한 정보를 찾으십시오. cloud-init 또는 cfn-init 로그에서 오류를 검색하려면 SSH를 사용하여 인스턴스에 연결합니다. 그런 다음 “error” 또는 “failure”라는 키워드를 사용하여 다음 로그에서 자세한 오류 또는 실패 메시지를 검색합니다.
/var/log/cloud-init-output.log/var/log/cloud-init.log
/var/log/cfn-init.log
/var/log/cfn-init-cmd.log
/var/log/cfn-wire.log
/var/log/cfn 또는 /var/log/cloud-init 파일에서 “error” 또는 “failure”라는 단어의 모든 인스턴스를 분석하려면 다음 명령을 실행합니다.
grep -ni 'error\|failure' $(sudo find /var/log -name cfn\* -or -name cloud-init\*)
참고: 이전 명령은 파일 이름, 줄 번호 및 오류 메시지를 반환합니다.
CreationPolicy 속성의 timeout 속성 값이 너무 낮습니다
timeout 속성 값은 CreationPolicy 속성에 의해 정의됩니다. cfn-signal 스크립트가 CloudFormation 리소스에 신호를 보내기 전에 값이 작업을 실행할 수 있을 만큼 충분히 큰지 확인합니다.
timeout 속성 값을 확인하고 시그널링 및 리소스 장애 타임스탬프를 비교하려면 다음 단계를 완료하세요.
-
코드 편집기에서 스택의 CloudFormation 템플릿을 열어 timeout 속성 값을 찾습니다.
참고: timeout 속성 값은 CloudFormation이 오류를 반환하기 전에 신호를 기다리는 최대 시간입니다.
-
cfn-signal 스크립트가 활성화된 시점을 추정하려면 SSH를 사용하여 인스턴스에 연결하세요. 그리고 나서 다음 명령을 실행합니다.
less /var/log/cfn-init.log
로그 파일에는 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 콘솔을 엽니다.
-
이벤트 보기를 선택합니다.
-
상태 사유를 선택합니다. 상태 사유가 "Failed to receive X resource signal(s) within the specified duration."인 이벤트의 행을 펼칩니다.
-
시그널링 타임스탬프와 리소스 실패 타임스탬프를 비교합니다.
참고: 성공적으로 완료하려면 인스턴스가 생성되거나 생성에 실패하기 전에 스크립트에서 신호를 보내야 합니다.
cfn-signal이 인스턴스에서 전송되지 않습니다
CloudFormation이 수신한 신호가 인스턴스에서 왔는지 확인합니다. var/log/cfn-wire.log에서 사용할 수 있는 cfn 와이어 로그를 확인하세요. 응답이 200이 아닌 경우 인스턴스와 CloudFormation의 엔드포인트 간에 연결 문제가 있을 수 있습니다.
인스턴스가 아닌 다른 곳에서 신호를 보낼 때는 SignalResource API를 사용하세요. 예를 들어, AWS Lambda 함수를 사용하여 SignalResource API를 호출한 다음 스택에 신호를 보낼 수 있습니다. 오류가 발생하면 CloudWatch Logs를 사용하여 Lambda 로그를 확인하여 신호가 스택으로 전송되지 않은 이유를 이해하세요.