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] セクションで、[waitAfterCompletion] が [forever] に設定されていることを確認します。例:

  "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 Elastic Compute Cloud (Amazon EC2) 設定ログ
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 の Timeout 1800/3600 秒に増やします。

注意: Windows インスタンスは、通常 Linux インスタンスより最初の起動プロセスを完了するのに時間がかかるため、ステップ 2 が必要になります。

3.    カスタム Amazon マシンイメージ (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 スタックのブートストラップ」を参照してください。 


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合