AWS CloudFormation テンプレートリファレンス – ヘルパースクリプト/cfn-init

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS CloudFormationテンプレートリファレンス、第4弾は『ヘルパースクリプト(Helper Scripts)』。EC2インスタンス上で色々な事が出来るこれまた便利なツール群です。当エントリではヘルパースクリプトに関する全体像と、ヘルパースクリプトのうちの1つ、cfn-initについてご紹介。


CloudFormationヘルパースクリプトリファレンス

AWS CloudFormationでは、スタックの一部として作成したAmazon EC2インスタンス上でソフトウェアをインストールし、サービスを開始出来るようにPythonのヘルパースクリプトのセットを提供しています。作成したテンプレートから直接、ヘルパースクリプトを呼ぶ事が出来ます。スクリプトは、同じテンプレートで定義したリソースやメタデータと連動して動作します。ヘルパースクリプトは、スタック作成プロセスの一環として、Amazon EC2インスタンスで実行されます。

ヘルパースクリプトは、Amazon Linux AMIの最新バージョンにプリインストールされています。また、利用出来ます。他のUnix/LinuxのAMIで利用するために、Amazon Linuxのyumリポジトリからも利用出来ます。

現在、AWS CloudFormationでは、以下のヘルパースクリプトを提供しています。

  • cfn-init:リソースメタデータを取得、パッケージのインストール、ファイルを作成しサービスを開始する為に使用します。
  • cfn-signal:スタック内でアプリケーションが準備出来ている状態になると他のリソースと同期する事が出来るようになるCloudFormation WaitConditionを通知する簡単なラッパーです。
  • cfn-get-metadata:リソースに対して定義された全てのメタデータや、特定のキーやリソースメタデータのサブツリーへのパスの取得を簡単に出来るラッパースクリプトです。
  • cfn-hup:メタデータへの更新をチェックし、変更が検出されたときに、カスタムフックを実行するデーモンです。

これらのスクリプトは、最新Amazon Linux AMIバージョンの/opt/aws/binにデフォルトでインストールされています。また、他のLinux/Unixディストリビューション用のRPM等を介するのと同じように、以前のAmazon Linux AMIからでもAmazon Linux AMIのyumリポジトリ経由で利用出来ます。

スクリプトは、WindowsのPythonを使用してMicrosoft Windows上にインストールする事ができます。スクリプトは、デフォルトでは実行されません。特定のヘルパースクリプトを実行する為の呼び出しを含める必要があります。

AWS CloudFormationのヘルパースクリプトは、以下のサイトから入手出来ます。

 

cfn-init

cfn-initヘルパースクリプトは、AWS::CloudFormation::Initのキーからテンプレートメタデータを読み取り、内容に応じて以下の動作を行います。

  • CloudFormationからメタデータを取得し、解析
  • パッケージのインストール
  • ディスクにファイルを書き込む
  • サービスの有効/無効化、起動/停止
注意:
既存のファイルを更新するためにcfn-initを使う場合、cfn-initはオリジナルファイルのコピー(同じディレクトリ内に、拡張子.bakの名前で)を取ります。 例えば、/path/to/file_nameを更新する場合、この動作は2つのファイルを存在させる事になります:/path/to/file_name.bakはオリジナルファイル:/path/to/file_nameの内容を含み、且つ更新された内容も含んでいます。

テンプレートメタデータの詳細については、AWS::CloudFormation::Initをご参照ください。

注意:
cfn-initは認証情報を必要としません。なので--access-key--secret-key--role又は--credential-fileといったオプション情報を使う事もありません。

シンタックス

cfn-init --stack|-s stack.name.or.id \
         --resource|-r logical.resource.id \
         --region region
         --access-key access.key \
         --secret-key secret.key \
         --role rolename\
         --credential-file|-f credential.file \
         --configsets|-c config.sets \
         --url|-u service.url \
         -v

オプション情報

名前 詳細 必須
-s, --stack スタック名。String型、デフォルト値は無し。
例:-s { "Ref" : "AWS::StackName" },
-r, --resource メタデータを含むリソースの論理リソースID。String型。
例:-r WebServerHost
--region CloudFormationのURLから導出されるリージョンの情報。String型、デフォルト値無し。
例:--region ", { "Ref" : "AWS::Region" },
--access-key CloudFormation上でDescribeStackResourceを呼び出す権限を持つアカウントのAWSアクセスキー情報。String型。
※条件:Credentialファイルのパラメータは、このパラメータよりも優先されます。
--secret-key 指定されたアクセスキーに対応するAWS秘密鍵情報。String型。
※条件:Credentialファイルのパラメータは、このパラメータよりも優先されます。
--role IAMロール名。
※条件:Credentialファイルのパラメータは、このパラメータよりも優先されます。
-f, --credential-file シークレットキーとアクセスキーの情報を含むファイル名。String型。
※条件:このファイルパラメータ情報は--role--access-key--secret-keyパラメータに優先します。
-c, --configsets カンマ区切りの実行リスト(実行順)。String型、デフォルト値:default。
-u, --url CloudFormationサービスURL。String型。
-v より詳細な出力を行います。これは、初期化に失敗したcfn-initのケースをデバッグするのに便利です。

注意:
初期化イベントをデバッグするには、DisableRollbackon(有効)にしてください。CloudFormationのコンソールを使って、[Show Advanced Options]を選択し、Rollback on failureNoに設定する事でこれを行う事が出来ます。また、コンソールでSSHログインし、/var/log/cfn-init.logを読み取る事も出来ます。

まとめ

AWS CloudFormationのヘルパースクリプト、cfn-initについては下記エントリで都元さんが解説されています。

都元さんの上記エントリ→当エントリで参照したリファレンス情報と見て来ましたが、このcfn-init、更にはCloudFormationのテンプレート情報:AWS::CloudFormation::Initを読み進めて行く事でより詳しくこの辺りの仕組みを知る事が出来そうです。ヘルパースクリプトの内容に関しては、ドキュメントのリファレンスページと併せて関連するテンプレートのページも見て行きたいと思います。