AWS CloudFormation의 "Failed to receive X resource signal(s) within the specified duration" 오류 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 3월 5일

AWS CloudFormation에서 "Failed to receive X resource signal(s) within the specified duration"이라는 오류 메시지를 받았습니다. 이 오류를 해결하려면 어떻게 해야 합니까?

간략한 설명

Amazon EC2(Amazon Elastic Compute Cloud) 인스턴스, Auto Scaling 그룹 또는 WaitConditionCreationPolicy 속성에서 지정된 기간 내에 하나 이상의 인스턴스로부터 성공 신호를 받지 못하면 이 오류가 발생합니다.

이 오류는 다음 시나리오 중 하나에서 발생할 수 있습니다.

  • 시나리오 1: 하나 이상의 AWS CloudFormation 스택 인스턴스에 cfn-signal 스크립트가 설치되어 있지 않습니다.
  • 시나리오 2: AWS CloudFormation 템플릿에 구문 오류 또는 잘못된 값이 있습니다.
  • 시나리오 3: CreationPolicy 속성을 위한 Timeout 속성 값이 너무 낮습니다.
  • 시나리오 4: Amazon EC2 인스턴스에서 cfn-signal을 전송할 수 없습니다.

참고: 이 오류에 대한 문제 해결 시나리오는 Linux 인스턴스로 생성된 AWS CloudFormation 스택에만 적용됩니다. 이러한 시나리오는 Windows 인스턴스에 적용되지 않습니다.

​해결 방법

문제 해결 시나리오의 단계를 수행하기 전에 AWS CloudFormation 스택의 Rollback on failure 옵션을 아니오로 설정하십시오.

시나리오 1: 하나 이상의 AWS CloudFormation 스택 인스턴스에 cfn-signal 스크립트가 설치되어 있지 않습니다.

cfn-signal 스크립트가 AWS CloudFormation 리소스에 신호를 보내도록 구성된 인스턴스에 설치되었는지 확인하려면 다음 단계를 완료하십시오.

1.    SSH를 사용하여 인스턴스에 연결합니다.

2.    다음 명령 중 하나를 사용하여 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-signal

cfn-signal 스크립트가 포함된 AWS CloudFormation 헬퍼 스크립트 패키지가 설치되었는지 확인하려면 다음 명령을 실행합니다.

$ sudo rpm -q aws-cfn-bootstrap
aws-cfn-bootstrap-1.4-30.amzn2.noarch

중요: 앞의 명령은 RPM 패키지 관리자를 사용하는 배포에서만 작동합니다.

참고: 기본적으로 AWS CloudFormation 헬퍼 스크립트는 mazon Linux Amazon Machine Image(AMI)에 설치됩니다. AWS CloudFormation 도우미 스크립트가 설치되어 있지 않은 경우 설치 지침은 CloudFormation 헬퍼 스크립트 참조를 참조하십시오.

시나리오 2: AWS CloudFormation 템플릿에 구문 오류 또는 잘못된 값이 있습니다.

UserData 속성이 CreationPolicy 속성에서 지정된 AWS CloudFormation 리소스를 알리도록 구성되었는지 확인하려면 다음 단계를 완료하십시오.

1.    코드 편집기에서 스택에 대한 AWS CloudFormation 템플릿을 연 다음, UserData 속성 섹션을 찾습니다.

2.    구문 오류, 공백 누락, 철자 오류 및 기타 오타 등의 오류를 확인하십시오.

3.    스택, 리소스 및 리전 속성이 올바른지 확인합니다.

참고: UserData 속성을 포함하고 cfn-signal 스크립트를 호출하는 부트스트랩 스크립트를 사용하는 경우 부트스트랩 스크립트에 구문 오류나 잘못된 값이 있는지 확인합니다.

cfn-init 명령 키 내에서 신호를 보내는 경우, cfn-init 로그에서 신호에 대한 정보를 찾습니다. cloud-init 로그 또는 cfn-init 로그에서 오류를 검색하려면 SSH를 사용하여 Amazon EC2 인스턴스에 연결합니다. 그런 다음, 아래 로그에서 키워드 "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\*)

참고: 앞의 명령은 파일 이름, 행 번호 및 오류 메시지를 반환합니다.

시나리오 3: CreationPolicy 속성을 위한 Timeout 속성 값이 너무 낮습니다.

Timeout 속성 값은 CreationPolicy 속성에 의해 정의됩니다. cfn-signal 스크립트가 AWS CloudFormation 리소스로 신호를 보내기 전에 작업이 실행될 수 있을 만큼 값이 충분히 높은지 확인하려면 다음 단계를 완료하십시오.

중요: 다음 단계는 인스턴스가 종료되지 않은 경우에만 작동합니다(예: Auto Scaling 그룹). 이미 AWS CloudFormation 스택의 실패 시 롤백 옵션을 아니요로 설정했습니다. 이 옵션은 실패 롤백이 없으며 스택을 삭제할 때까지 인스턴스가 종료되지 않음을 의미합니다. SSH를 사용하여 인스턴스에 연결한 다음 아래와 같은 문제 해결 단계를 계속 진행할 수 있습니다.

1.    코드 편집기에서 스택에 대한 AWS CloudFormation 템플릿을 연 다음, Timeout 속성 값을 찾습니다.

참고: Timeout 속성 값은 AWS CloudFormation이 오류를 반환하기 전에 신호를 기다리는 최대 시간입니다.

2.    cfn-signal 스크립트가 트리거되는 시점을 예상하려면 SSH를 사용하여 인스턴스에 연결한 후 다음 명령을 실행합니다.

less /var/log/cfn-init.log

로그 파일에는 SUCCESS 신호가 AWS CloudFormation 리소스로 전송된 경우의 타임 스탬프가 표시됩니다. 다음 예제를 참조하십시오.

2019-01-11 12:46:40,101 [DEBUG] Signaling resource EC2Instance in stack XXXX with unique ID i-045a536a3dfc8ccad and status SUCCESS

3.    AWS CloudFormation 콘솔을 엽니다.

4.    "Failed to receive X resource signal(s) within the specified duration" 이벤트에 대한 리소스 실패 타임스탬프를 확인하려면 [Events] 보기를 선택합니다.

5.    [Status Reason]의 경우, 상태 이유가 "Failed to receive X resource signal(s) within the specified duration"인 이벤트에 대한 행을 확장합니다.

6.    신호 전송 타임스탬프를 리소스 실패에 대한 타임스탬프와 비교하십시오.

참고: Amazon EC2 리소스 생성에 실패한 후, 신호가 전송되었다는 점에 유의하십시오. 신호는 Amazon EC2 리소스가 생성되거나 생성에 실패하기 전에 전송되어야 합니다.

시나리오 4: Amazon EC2 인스턴스에서 cfn-signal을 전송할 수 없습니다.

SignalResource API는 Amazon EC2 인스턴스가 아닌 곳에서 신호를 보내려는 경우에 유용합니다.

예를 들어, AWS Lambda 함수를 사용하여 SignalResource API를 호출한 다음 AWS CloudFormation 스택에 신호를 보낼 수 있습니다. 이러한 시나리오에서 Amazon CloudWatch Logs를 사용하여 Lambda 로그를 확인합니다. 이 로그는 신호가 AWS CloudFormation 스택으로 전송되지 않은 이유를 파악하는 데 도움이 됩니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?