Windows インスタンスがある CloudFormation スタックでブートストラップしないヘルパースクリプトをトラブルシューティングするにはどうすればよいですか?

所要時間2分
0

私のヘルパースクリプトは、Windows インスタンスがある AWS CloudFormation スタックではブートストラップしません。

簡単な説明

Windows インスタンスを再起動します。Windows インスタンスの再起動後にヘルパースクリプトが実行されない場合は、「ブートストラップに関する問題をトラブルシューティングする」セクションの手順を実行します。

次のエラーが表示される場合は、cfn-signal に問題がある可能性があります。 「Received 0 conditions when expecting X or Failed to receive X resource signal(s) within the specified duration.」 この問題を解決するには、「cfn-signal に関する問題をトラブルシューティングする」セクションの手順を実行します。

どちらの問題についても、「CloudFormation を使用した Windows オペレーティングシステムのベストプラクティスに従う」セクションの手順を実行します。

解決策

ブートストラップに関する問題をトラブルシューティングする

cfn-init 設定セットの commands セクションをチェックして、waitAfterCompletionforever に設定されていることを確認します。例:

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

注: forever の値は、**cfn-init ** に対し、再起動の完了後にのみ終了して再開するように指示します。詳細については、「コマンド」を参照してください:

設定を確認したら、次のログにエラーがないか確認します。

  • cfn-init ログ: C:\cfn\log\cfn-init.log
  • Windows のイベントログ: C:\Windows\System32\winevt\logs
    注: Amazon Elastic Cloud Compute (Amazon EC2) の EC2Launch v2 エージェントは Windows イベントログを公開します。
  • (EC2Config サービスを使用する Windows インスタンスの場合) 設定ログ: C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt
  • (EC2Launch v1 エージェントを使用する Windows インスタンスの場合) 起動ログ: C:\ProgramData\Amazon\EC2-Windows\Launch\Log

cfn-signal に関する問題をトラブルシューティングする

次の手順を実行します。

  1. cfn-signal が正しく設定されていることを確認します。
    重要: PowerShell スクリプトでは -e $latexitcode を使用し、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::WaitConditionTimeout を増やします。設定例については、「Windows スタックのブートストラップの例」を参照してください。
    注: Windows インスタンスは通常、Linux インスタンスよりも初期起動プロセスを完了するのに時間がかかります。

  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.」

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"
AWS公式
AWS公式更新しました 6ヶ月前