CloudFormationとは
AWS CloudFormationは、AWSのリソースのモデル化およびセットアップを行うことができるサービスで、テンプレートを作成すれば、CloudFormationがこのテンプレートに沿ってリソースのプロビジョニング等を行う。CloudFormationを使用することで以下のようなメリットが生じる。
- リソースを1つのコレクションとして簡単に管理できる
- インフラストラクチャの複製が容易
- コレクションの更新やバージョン管理が可能
CloudFormationの テンプレート はAWSリソースを作成する際の設計図の機能を持ち、JSONもしくはYAML形式で記述することができる。YAML形式のみコメント機能が使用できる。このテンプレートを元にプロビジョニングされたAWSリソースは、スタック と呼ばれる単一ユニットとして管理される。スタックは、作成や変更、削除が可能で、変更時には変更概要を示した 変更セット が作成される。変更前に変更セットを確認することで、この変更がリソースに与える影響を事前に検証することができる。
CloudFormationはCloudTrailと統合されており、CloudFormation内でのアクションをログに記録する。

CloudFormationを実行する際にリソースタグを付与することができるが、当該スタックに含まれるリソース全てに対してこのタグが伝搬する訳ではない。また、リソースによってはリソースタグの付与自体ができないことに注意が必要である。
CloudFormationの制限
入力パラメータ、マッピングなど、テンプレート内部で使用するパラメータの数には上限値が存在する。また、テンプレート自体のファイルサイズの上限も存在するため、上限を超過する場合には、S3バケットに対して事前にテンプレートをアップロードする か、 複数のネステッドスタックにテンプレートを分割 する必要がある。
IAM
CloudFormationが作成できるAWSリソースは、CloudFormationを実行したユーザが持つアクセス権限に含まれるもののみ である。もしくは、AWS CloudFormation サービスロール と呼ばれるCloudFormationにリソースの作成や更新、削除を許可するIAMロールを割り当てることもできる。なお、特定の機能が含まれるテンプレートについては、実行時に以下を了承する必要がある。
| 機能 | 内容 |
|---|---|
| CAPABILITY_IAM | IAMリソースが含まれている場合 |
| CAPABILITY_NAMED_IAM | 自身で命名したIAMリソースが含まれている場合 |
| CAPABILITY_RESOURCE_POLICY | リソースポリシーが含まれている場合 |
| CAPABILITY_AUTO_EXPAND | ネストされたアプリケーションが含まれている場合 |
IAMロールでは、リソースタイプやテンプレートURLなどを 限定 して、CloudFormationスタックの作成や削除を許可したり拒否したりすることもできる。
テンプレートセクション
CloudFormationテンプレートには、作成や設定したいAWSリソースを宣言することができ、以下のセクションが用意されている。
| セクションタイプ | 設定内容 |
|---|---|
| AWSTemplateFormatVersion | 形式バージョン |
| Conditions | 制御条件 |
| Description | テンプレートを説明するテキスト文字列, AWSTemplateFormatVersionの後に記述する |
| Mappings | プロビジョニング先のリージョンなどの条件に合わせて参照先が変更可能なパラメータ |
| Metadata | 追加情報, AWS::CloudFormation::Designerはデザイナーのレイアウト情報を含む |
| Outputs | 出力パラメータ |
| Parameters | 入力パラメータ |
| Resources | AWSリソースの指定 |
| Transform | テンプレートを処理するマクロを指定 |
設定変更するプロパティによっては、既存のリソースに影響が発生する可能性がある。例えば、アップデート中に リソースが一旦停止 する場合や、変更自体ができないリソースも存在 する。
Parameters
Parameters セクションで入力パラメータを定義することができ、入力パラメータを指定してテンプレートを実行することで、 各種パラメータをカスタマイズ することができる。デフォルト値を持つ入力パラメータは、ユーザが別の値を入力しない限りデフォルト値が適用される。一方で、プロビジョニング済みのリソースで、かつマネージメントコンソールから操作をする場合は、ユーザが別の値を入力しない限り 現在の設定値が適用 される。入力パラメータには、以下の項目で値に制約を与えることができる。
指定できるパラメータのデータ型は、String, Number, List<Number>, CommaDelimitedList, AWS 固有のパラメーター型, SSM パラメータータイプ の6タイプがサポートされている。機密データには、 NoEcho 属性を指定するとよい。
| 型 | 制約タイプ |
|---|---|
| String | MinLength, MaxLength, Default, AllowedValues, AllowedPattern |
| Number | MinValue, MaxValue, Default, AllowedValues |
Mappings
Mappings セクションは、キーと名前付き一連データとかが対応付けられる。これを用いることで、リージョンごとに異なるリソースの設定値を一括して管理することができる。これらの値は、FindInMap 関数で取得することができる。
Conditions
Mappings セクションでは、リソースを設定するか否かを判定する条件を定義することができ、この値が true の場合のみ、当該のリソースを作成することができる。なお、スタック更新時に、Conditions のみを単独で更新することはできず 、リソースの追加や変更などが存在する場合に、 Conditions も再評価される。
Resources
Resources セクションでは、スタックに含めるAWSリソースを宣言する。conditionsセクションと組み合わせることで、条件付きでリソースを作成 できる。
Outputs
他のスタックにインポートする値、もしくはCloudFormationコンソールに表示する出力値を宣言する。 Exports 属性を追加して、 クロススタック参照 に対応することもできる。
リソース属性
Resources にリソース属性 を指定することで、リソースの追加や削除の際の挙動を制御することができる。
CreationPolicy
指定数の成功シグナルやタイムアウトが過ぎるまでは作成完了とならないようにする
| プロパティ | 内容 |
|---|---|
| AutoScalingCreationPolicy | いくつのインスタンスが成功すると更新を続行するか |
| ResourceSignal | 関連リソースを作成する際に必要なシグナル数 |
DeletionPolicy/UpdateReplacePolicy
スタックが削除されたときやリソースを置き換える際の動作を規定する。スナップショットが有効なリソースは、EC2ボリューム 、 Elasticache 、 Neptureクラスタ 、 RDSクラスタ/インスタンス 、Redshiftクラスタ である。
| プロパティ | 内容 |
|---|---|
| Delete | 削除する( DBクラスタ以外のデフォルト ) |
| Retain | スタックを削除してもリソースを削除しない |
| Snapshot | 削除する前にスナップショットを作成する(DBクラスタのデフォルト) |
UpdatePolicy
AutoScalingGroup、Lambdaエイリアス、ElastiCacheレプリケーショングループの更新方法を指定する。
DependsOn
他のリソースに続けて作成されるように指定する。 Ref関数でリソースを参照する場合などは、暗黙的に依存関係が構築されるので記述の必要はない 。
Metadata
構造化データを関連づける。
組み込み関数
CloudFormationには、スタックの管理に役立つ組み込み関数があらかじめ用意されている。
| 関数名 | 実行内容 |
|---|---|
| Fn::Base64 | Base64エンコード |
| Fn::Cidr | CIDR アドレスブロックの配列を返す |
| Fn::FindInMap | Mappings セクションから値を返す |
| Fn::GetAtt | 属性の値を返す |
| Fn::GetAZs | 指定されたリージョンのアベイラビリティーゾーンを含んだ配列を返す |
| Fn::ImportValue | 別のスタックの出力値を返す |
| Fn::Join | 複数の値を連結する |
| Fn::Select | リストから1つのオブジェクトを返す |
| Fn::Split | 文字列を分割する |
| Fn::Sub | 変数を文字列に組み込む |
| Fn::Transform | テンプレートをカスタム処理するマクロを指定する |
| Ref | 指定したパラメータまたはリソースの値を返す |
Fn::Sub や Ref で取得した値に対して四則演算等を行うことはできない。また、CloudFormationテンプレートのキー値に対して、 Fn::Sub や Ref などを用いて値を代入することもできないl。
条件関数
条件付きでリソースを作成する場合に使用する。Fn::If以外は、Conditions セクションで使用する。
| 関数名 | 相当する演算子 |
|---|---|
| Fn::And | and |
| Fn::Equals | == |
| Fn::If | if |
| Fn::Not | != |
| Fn::Or | or |
擬似パラメータ
擬似パラメータと呼ばれる事前に定義されたパラメータを使用することができる。
| パラメータ名 | 内容 |
|---|---|
| AWS::AccountId | スタックが作成されているアカウントの AWS アカウント ID |
| AWS::NotificationARNs | 現在のスタックの通知 Amazon リソースネーム (ARN) のリスト |
| AWS::NoValue | 指定なし |
| AWS::Partition | AWSパーティション |
| AWS::Region | AWSリージョン |
| AWS::StackId | スタックID |
| AWS::StackName | スタック名 |
| AWS::URLSuffix | ドメインのサフィックス |