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

최종 업데이트 날짜: 2020년 6월 19일

Windows 인스턴스를 포함한 AWS CloudFormation 스택에서 헬퍼 스크립트를 부트스트랩하려고 합니다.

간략한 설명

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

"Received 0 conditions when expecting X or Failed to receive X resource signal(s) within the specified duration" 오류가 표시되는 경우, cfn-signal 문제 해결 섹션의 단계를 완료합니다.

마지막으로 AWS CloudFormation에서 Windows 운영 체제를 사용하는 모범 사례 따르기 섹션의 단계를 완료합니다.

해결 방법

부트스트래핑 문제 해결

Windows 인스턴스에서 UserData(EC2ConfigService의 하위 프로세스로 실행)는 cfn-init.exe를 호출합니다. cfn-init.exe에서 수행하는 특정 단계는 시스템을 재부팅해야 할 수 있습니다. 예를 들어, 컴퓨터 이름을 바꾸거나 컴퓨터를 도메인에 조인하는 경우 시스템을 재부팅해야 합니다. 시스템 재부팅이 완료된 후, cfn-init는 C:\cfn\cfn-init\resume_db.json을 사용하여 AWS::CloudFormation::Init에 남아 있는 나머지 구성을 계속 실행합니다.

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

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 이전 버전) 및 C:\ProgramData\Amazon\EC2-Windows\Launch\Log\(Windows 2016 및 이상)에 있는 Amazon EC2(Amazon Elastic Compute Cloud) 구성 로그
C:\cfn\log\cfn-init.log에 있는 cfn-init 로그
C:\Windows\System32\winevt\logs에 있는 Windows 이벤트 로그

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.    AWS CloudFormation Windows 예제에 따라 WaitCondition의 Timeout1800/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

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

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

AWS CloudFormation 템플릿에서 Windows 경로를 참조할 때는 모든 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"

자세한 내용은 AWS CloudFormation Windows 스택 부트스트랩을 참조하십시오. 


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

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


도움이 필요하십니까?