Windows 인스턴스가 있는 CloudFormation 스택에서 부트스트랩되지 않는 헬퍼 스크립트 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 9월 9일

Microsoft Windows 인스턴스를 포함한 AWS CloudFormation 스택에서 헬퍼 스크립트가 부트스트랩되지 않습니다. 이 문제를 해결하려면 어떻게 해야 하나요?

간략한 설명

Windows 인스턴스에서 EC2ConfigService의 하위 프로세스로 실행하는 UserDatacfn-init.exe를 호출합니다. cfn-init.exe에서 수행하는 특정 단계에서는 시스템을 재부팅해야 할 수 있습니다.

예를 들어, 컴퓨터 이름을 바꾸거나 컴퓨터를 도메인에 조인하는 경우 시스템을 재부팅해야 합니다. 시스템이 재부팅된 후, cfn-initC:\cfn\cfn-init\resume_db.json의 도움을 받아 AWS::CloudFormation::Init에 남아 있는 나머지 구성을 계속 실행합니다.

Windows 인스턴스를 재부팅한 후 헬퍼 스크립트가 실행되지 않는 경우 부트스트래핑 문제 해결 섹션의 단계를 완료합니다.

다음 오류가 표시되면 cfn-signal에 문제가 있을 수 있습니다.

"X를 예상할 때 0개의 조건을 수신했거나 지정된 기간 내에 X개의 리소스 신호를 수신하지 못했습니다."

위의 오류를 해결하려면 cfn-signal 문제 해결 섹션의 단계를 완료합니다.

두 가지 문제에 대해 CloudFormation에서 Windows 운영 체제를 사용하는 모범 사례 따르기 섹션의 단계를 완료합니다.

해결 방법

부트스트래핑 문제 해결

재부팅 후에도 스크립트가 실행되지 않으면 다음 단계를 완료합니다.

1.    cfn-init 구성 세트의 commands 섹션에서 waitAfterCompletationforever로 설정되어 있는지 확인합니다. 예를 들어 다음과 같습니다.

"commands": {
 "0-restart": {
 "command": "powershell.exe -Command Restart-Computer",
 "waitAfterCompletion": "forever"
 }
 }

참고: forever 값은 cfn-init가 재부팅이 완료된 후에만 종료하고 다시 시작하도록 지시합니다. 자세한 내용은 AWS::CloudFormation::Init를 참조하세요.

2.    다음 로그에서 오류가 있는지 확인합니다.

  • C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt(Windows 2016 이전 버전)에 있는 Amazon Elastic Compute Cloud(Amazon EC2) 구성 로그
  • C:\ProgramData\Amazon\EC2-Windows\Launch\Log\(Windows 2016 이상)에 있는 Amazon EC2 구성 로그
  • C:\cfn\log\cfn-init.log에 있는 cfn-init 로그
  • C:\Windows\System32\winevt\logs에 있는 Windows Event 로그

cfn-signal 문제 해결

1.    cfn-signal이 올바르게 구성되었는지 확인합니다.

중요: PowerShell 스크립트에는 -e $lastexitcode를 사용하고 Windows cmd.exe 스크립트에는 -e %ERRORLEVEL%를 사용하십시오.

UserData의 PowerShell 스크립트의 경우 다음 태그를 사용합니다.

<powershell></powershell>

예제 PowerShell 스크립트:

UserData:
        Fn::Base64:
          Fn::Sub : |
            <powershell>
            $LASTEXITCODE=0
            echo Current date and time >> C:\Temp\test.log
            echo %DATE% %TIME% >> C:\Temp\test.log
            cfn-init.exe -s ${AWS::StackId} -r SInstance --region ${AWS::Region}
            New-Item -Path "C:\" -Name userdata -ItemType directory
            cfn-signal.exe -e $LASTEXITCODE --stack ${AWS::StackId} --resource WindowsInstance --region ${AWS::Region}
            </powershell>

UserDatacmd.exe 스크립트의 경우 다음 태그를 사용합니다.

<script></script>

예시 cmd.exe 스크립트:

UserData:
  Fn::Base64: !Sub |
    <script>
    cfn-init.exe -v -s ${AWS::StackId} -r WindowsInstance --configsets ascending --region ${AWS::Region}
    cfn-signal.exe -e %ERRORLEVEL% --stack ${AWS::StackId} --resource WindowsInstance --region ${AWS::Region}
    </script>

2.    Windows 스택 부트스트랩 예시에 따라 WaitConditionTimeout1800/3600초로 늘립니다.

참고: Windows 인스턴스는 초기 부팅 프로세스를 완료하는 데 일반적으로 Linux 인스턴스보다 오래 걸리기 때문에 2단계가 필요합니다.

3.    사용자 지정 Amazon Machine Image(AMI)를 사용하는 경우에는 시작하기 전에 Sysprep을 사용하여 AMI를 생성해야 합니다. Sysprep을 사용하지 않는 경우 메타데이터 문제가 발생하여 메타데이터에 대한 사용자 데이터 로그에 다음 오류가 표시될 수 있습니다.

Failed to get metadata: The result from http://169.254.169.254/latest/user-data was empty
Unable to execute userdata: Userdata was not provided

CloudFormation에서 Windows 운영 체제를 사용하는 모범 사례 따르기

예외를 포착할 수 있도록 PowerShell 스크립트 상단에 $ErrorActionPreference = "Stop"을 포함합니다.

CloudFormation 템플릿에서 Windows 경로를 참조하는 경우 경로 시작 부분에 슬래시(/)를 추가해야 합니다. 예를 들어 다음과 같습니다.

"commands" : {
  "1-extract" : {
    "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log"
  }

Windows 스택의 경우 WaitCondition 핸들 URL을 다시 base64로 인코딩해야 합니다. 예를 들어 다음과 같습니다.

cfn-signal.exe -e %ERRORLEVEL% ", { "Fn::Base64" : { "Ref" : "SharePointFoundationWaitHandle" }}, "\n"

이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?