テクニカルタイムアウト

AWS CloudFormation(1)CloudFormationの概要

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ボリュームElasticacheNeptureクラスタ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::SubRef で取得した値に対して四則演算等を行うことはできない。また、CloudFormationテンプレートのキー値に対して、 Fn::SubRef などを用いて値を代入することもできない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 ドメインのサフィックス
モバイルバージョンを終了