Windows ベースの CloudFormation スタックのブートストラップ
このトピックでは、Windows スタックをブートストラップする方法と、スタック作成時の問題をトラブルシューティングする方法について説明します。
トピック
EC2 インスタンスのユーザーデータ
ユーザーデータは、起動時にスクリプトまたは設定情報を EC2 インスタンスに渡すことができる Amazon EC2 機能です。
Windows EC2 インスタンスの場合:
-
ユーザーデータはバッチスクリプトとして実行されます。
-
バッチコマンド (
<script>
タグを使用) または PowerShell スクリプト (<powershell>
タグを使用) を使用できます。 -
スクリプトの実行は EC2Launch によって処理されます。
重要
CloudFormation で使用する独自の Windows AMI を作成する場合は、EC2Launch v2 が正しく設定されていることを確認してください。スタック作成時に Windows インスタンスを適切に初期化および設定するには、CloudFormation のブートストラップツールに EC2Launch v2 が必要です。詳細については、『Amazon EC2 ユーザーガイド』の「EC2 Windows インスタンスの起動時に EC2Launch v2 エージェントを使用してタスクを実行する」を参照してください。
AWS Windows AMI の詳細については、「AWSWindows AMI リファレンス」を参照してください。
CloudFormation ヘルパースクリプト
ヘルパースクリプトは、ブートストラッププロセス中にインスタンスを設定するためのユーティリティです。Amazon EC2 ユーザーデータで使用され、強力な設定オプションを提供します。
CloudFormation には、スタックの一部として作成する Amazon EC2 インスタンスでソフトウェアをインストールしたりサービスを開始したりするために使用できる、次の Python ヘルパースクリプトが用意されています。
-
cfn-init
– リソースメタデータの取得と解釈、パッケージのインストール、ファイルの作成、およびサービスの開始で使用します。 -
cfn-signal
–WaitCondition
またはCreationPolicy
でシグナルを送信するために使用し、前提となるリソースやアプリケーションの準備ができたときに、スタックの他のリソースを同期できるようにします。 -
cfn-get-metadata
– 特定のキーへのリソースまたはパスのメタデータを取得するために使用します。 -
cfn-hup
– メタデータへの更新を確認し、変更が検出されたときにカスタムフックを実行するために使用します。
テンプレートからスクリプトを直接呼び出します。スクリプトは、同じテンプレートで定義されているリソースメタデータと組み合わされて機能します。スクリプトは Amazon EC2 インスタンスでスタック作成プロセス中に実行されます。
詳細については、「AWS CloudFormation テンプレートリファレンスガイド」の「CloudFormation ヘルパースクリプトリファレンス」を参照してください。
Windows スタックのブートストラップの例
次のアクションを実行する SharePoint サーバーテンプレートのサンプルスニペットを見てみましょう。
-
初期化ファイル
cfn-credentials
、cfn-hup.conf
、cfn-auto-reloader.conf
を設定します。 -
サーバーインスタンスに SharePoint Foundation などのパッケージをダウンロードしてインストールします。
-
WaitCondition
を使用して、リソースの準備が完了していることを確認します。 -
インスタンスにアクセスする IAM ユーザーとセキュリティグループを作成します。
-
Amazon Elastic IP (EIP) を持つインスタンスの IP を取得します。
cfn-init
のヘルパースクリプトを使用して、テンプレートの AWS::CloudFormation::Init
リソースの情報に基づいて、これらの各アクションを実行します。
AWS::CloudFormation::Init
セクションは SharePointFoundation
と呼ばれ、標準宣言で始まります。
"SharePointFoundation": { "Type" : "AWS::EC2::Instance", "Metadata" : { "AWS::CloudFormation::Init" : { "config" : {
この後、AWS::CloudFormation::Init
の files
セクションは次のように宣言されます。
"files" : { "c:\\cfn\\cfn-hup.conf" : { "content" : { "Fn::Join" : ["", [ "[main]\n", "stack=", { "Ref" : "AWS::StackName" }, "\n", "region=", { "Ref" : "AWS::Region" }, "\n" ]]} }, "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf" : { "content": { "Fn::Join" : ["", [ "[cfn-auto-reloader-hook]\n", "triggers=post.update\n", "path=Resources.SharePointFoundation.Metadata.AWS::CloudFormation::Init\n", "action=cfn-init.exe -v -s ", { "Ref" : "AWS::StackName" }, " -r SharePointFoundation", " --region ", { "Ref" : "AWS::Region" }, "\n" ]]} }, "C:\\SharePoint\\SharePointFoundation2010.exe" : { "source" : "http://d3adzpja92utk0.cloudfront.net/SharePointFoundation.exe" } },
3 つのファイルがここで作成され、サーバーインスタンスの C:\cfn
ディレクトリに配置されます。それらは:
-
cfn-hup.conf
、cfn-hup
の設定ファイル。 -
cfn-auto-reloader.conf
、AWS::CloudFormation::Init
のメタデータが変更されるときにcfn-hup
が更新 (cfn-init
の呼び出し) を開始するために使用するフックの設定ファイル。
サーバーにダウンロードされたファイルもあります: SharePointFoundation.exe
このファイルはサーバーインスタンスに SharePoint をインストールするために使用されます。
重要
Windows のパスはバックスラッシュ (\) を使用します。そのため、CloudFormation テンプレートで Windows のパスを参照するときには、常にすべてのバックスラッシュの前にもう一つバックスラッシュを追加して適切にエスケープするようにしてください。
次は commands
セクションです。これは cmd.exe
のコマンドです。
"commands" : { "1-extract" : { "command" : "C:\\SharePoint\\SharePointFoundation2010.exe /extract:C:\\SharePoint\\SPF2010 /quiet /log:C:\\SharePoint\\SharePointFoundation2010-extract.log" }, "2-prereq" : { "command" : "C:\\SharePoint\\SPF2010\\PrerequisiteInstaller.exe /unattended" }, "3-install" : { "command" : "C:\\SharePoint\\SPF2010\\setup.exe /config C:\\SharePoint\\SPF2010\\Files\\SetupSilent\\config.xml" }
インスタンス内のコマンドは名前のアルファベット順に処理されるため、各コマンドの先頭には実行順を示す数字が追加されています。これにより、最初にインストールパッケージを展開し、次にすべての前提条件をインストールした後、最後に SharePoint のインストールを開始することができます。
次は Properties
セクションです:
"Properties": { "InstanceType" : { "Ref" : "InstanceType" }, "ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" }, { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } ] }, "SecurityGroups" : [ {"Ref" : "SharePointFoundationSecurityGroup"} ], "KeyName" : { "Ref" : "KeyPairName" }, "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [ "<script>\n", "cfn-init.exe -v -s ", { "Ref" : "AWS::StackName" }, " -r SharePointFoundation", " --region ", { "Ref" : "AWS::Region" }, "\n", "cfn-signal.exe -e %ERRORLEVEL% ", { "Fn::Base64" : { "Ref" : "SharePointFoundationWaitHandle" }}, "\n", "</script>" ]]}} }
このセクションでは、UserData
プロパティに、cmd.exe
が実行する cfn-init
が含まれています。この部分は <script>
タグで囲まれています。<powershell>
タグでスクリプトを囲むことで、Windows PowerShell スクリプトを使用することもできます。Windows スタックでは、待機条件ハンドル URL を再度 base64 エンコードする必要があります。
SharePointFoundationWaitHandle
はここで参照され、cfn-signal
で実行されます。WaitConditionHandle
および関連付けられた WaitCondition
がテンプレートで次に宣言されます。
"SharePointFoundationWaitHandle" : { "Type" : "AWS::CloudFormation::WaitConditionHandle" }, "SharePointFoundationWaitCondition" : { "Type" : "AWS::CloudFormation::WaitCondition", "DependsOn" : "SharePointFoundation", "Properties" : { "Handle" : {"Ref" : "SharePointFoundationWaitHandle"}, "Timeout" : "3600" } }
すべてのステップの実行と SharePoint のインストールにはしばらく時間がかかるため (1 時間未満)、WaitCondition
はタイムアウトするまで 1 時間 (3,600 秒) 待機します。
すべての処理が正常に完了すると、Elastic IP を使用して SharePoint インスタンスへのアクセスが提供されます。
"Outputs" : { "SharePointFoundationURL" : { "Value" : { "Fn::Join" : ["", ["http://", { "Ref" : "SharePointFoundationEIP" } ]] }, "Description" : "SharePoint Team Site URL. Please retrieve Administrator password of the instance and use it to access the URL" }
スタックの作成が完了すると、EIP によって提供される IP アドレスが CloudFormation コンソールの [出力] タブに表示されます。ただし、インスタンスにアクセスする前に、インスタンス用に生成される一時的な管理者パスワードを取得しておく必要があります。詳細については、「Amazon EC2 ユーザーガイド」の「RDP を使用した Windows インスタンスへの接続」を参照してください。
Windows のサービスを管理する
Linux サービスと同じように Windows サービスを管理しますが、sysvinit
の代わりに、windows
キーを使用します。次の例では、cfn-hup
サービスを開始し、それを Automatic に設定します。c:\cfn\cfn-hup.conf
または c:\cfn\hooks.d\cfn-auto-reloader.conf
設定ファイルを cfn-init
が変更する場合は、サービスを再起動します。
"services" : { "windows" : { "cfn-hup" : { "enabled" : "true", "ensureRunning" : "true", "files" : ["c:\\cfn\\cfn-hup.conf", "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"] } } }
サービスを参照する名前 (表示名ではない) を使用して、同じ方法で他の Windows サービスを管理できます。
スタック作成の問題のトラブルシューティング
スタックの作成に失敗する場合、デフォルトでは失敗時にロールバックが実行されます。不必要な課金を避けられるため、通常はこのデフォルト設定が適切ですが、スタック作成が失敗する原因をデバッグすることは難しくなります。
CloudFormation コンソールでスタックを作成または更新するときにこの動作をオフにするには、[スタックの失敗オプション] で [正常にプロビジョニングされたリソースの保持] オプションを選択します。詳細については、「リソースのプロビジョニング時における失敗への対応方法を選択する」を参照してください。これにより、インスタンスにログインし、ログファイルを確認できるようになり、スタートアップスクリプト実行時に発生した問題を特定できます。
調査対象の重要なログは次のとおりです。
-
%ProgramData%\Amazon\EC2Launch\log\agent.log
にある EC2 構成ログ -
C:\cfn\log\cfn-init.log
にある cfn-init ログ
その他のログについては、「Amazon EC2 ユーザーガイド」の次のトピックを参照してください。