SOAの勉強のための超個人的アウトプット
AWS CloudFormation を使って EC2 の構築を自動化する際に欠かせないのが、
ヘルパースクリプト(Helper Scripts)
CloudFormation 側で「インフラの外側」まで宣言できても、
実際に EC2 インスタンスの中身を構成する処理 は OS 上で実行する必要がある
そこで活躍するのが以下のヘルパースクリプトたちです。
cfn-initcfn-signalcfn-get-metadatacfn-hup
本記事では、それぞれの役割をシンプルにまとめます。
cfn-init とは
cfn-init は、CloudFormation メタデータ(AWS::CloudFormation::Init)を取得し、
その内容に基づいて EC2 の OS を構成するためのスクリプト です。
CloudFormation メタデータの取得
EC2 インスタンスには CloudFormation のスタック情報へアクセスするための IAM ロール をアタッチします。
そのロールを使って cfn-init は CloudFormation API を呼び出し、
- パッケージ情報
- ファイル生成
- サービス設定
- コマンド
などのメタデータを取得します。
実行される主な処理
cfn-init は取得したメタデータに基づき、以下のような OS 構成を実行します。
- ソフトウェアのインストール
- ディスクへのファイルの書き込み
- サービスの有効化/無効化、および開始/停止
副次的なヘルスチェックとしての役割
cfn-init は処理結果を Exit Code として返します。
-
0→ 成功 -
0 以外→ 失敗
この Exit Code から、副次的にヘルスチェックの機能を持つ。
cfn-signal とは
cfn-signal は、
EC2 インスタンスの作成処理が正常に完了したかどうか を CloudFormation に通知するためのスクリプトです。
典型的には user-data 内で次のように利用されます。
/opt/aws/bin/cfn-init ...
/opt/aws/bin/cfn-signal --exit-code $? \
--stack MyStack \
--resource MyAutoScalingGroup \
--region ap-northeast-1
cfn-init の終了コード($?)を拾い、
CloudFormation または AutoScalingGroup に「成功・失敗」を伝えます。
cfn-get-metadata とは
cfn-get-metadata は、CloudFormation のメタデータを 文字情報として取得するためのスクリプト です。
cfn-init と異なり、
メタデータの解析や実行は行いません。
例:S3 バケット名を取得したい時
CloudFormation テンプレートに S3 バケット名が定義され、
その値だけを利用したい場合などに役立ちます。
cfn-get-metadata --stack MyStack --resource MyEC2
cfn-hup とは
cfn-hup は、CloudFormation メタデータの変更を検知し、
変更があった場合に 指定した処理を実行する常駐デーモン です。
主な用途
- CloudFormation 側で設定変更 → EC2 内にも反映したい
- メタデータ更新をトリガーに
cfn-initを再実行したい
つまり、EC2 インスタンスを稼働中にアップデートしたい場合に利用できます。
まとめ
| スクリプト | 役割 |
|---|---|
| cfn-init | メタデータを取得し、ソフトウェア/ファイル/サービスなどの OS構成を実行 |
| cfn-signal | インスタンス構築の成功/失敗を CloudFormation に通知 |
| cfn-get-metadata | メタデータを生の文字情報として取得 |
| cfn-hup | メタデータ変更を検知し、指定処理を自動実行するデーモン |
CloudFormation のヘルパースクリプトは、
EC2 の構成管理を CloudFormation テンプレートと連動させるための重要機能です。
「CloudFormation でサーバーを作る」だけでなく、
サーバー内部の設定まで含めて IaC(Infrastructure as Code)化したい場合
必須のツールセットとなります。