CloudFormation の仕組み
このトピックでは、CloudFormation の仕組みについて説明し、使用時に知っておくべき重要な概念を紹介します。
主要なコンセプト
CloudFormation を使用する際には、テンプレートとスタックの作業を行います。テンプレートは、AWS リソースとそのプロパティを記述するために作成します。スタックを作成するたびに、CloudFormation はテンプレートに記述されているリソースをプロビジョニングします。
テンプレート
CloudFormation テンプレートは JSON または YAML 形式のテキストファイルです。これらのファイルは、.json
、.yaml
、.template
、.txt
などの拡張子を使用して保存できます。CloudFormation は、AWS リソースを構築するブループリントとしてこれらのテンプレートを使用します。たとえば、テンプレートには、インスタンスタイプ、AMI ID、ブロックデバイスマッピング、Amazon EC2 キーペアの名前など、Amazon EC2 インスタンスの情報を記述できます。スタックを作成する際には、CloudFormation がテンプレートの記述内容を作成するために使用するテンプレートも指定します。
例えば、以下のテンプレートを指定してスタックを作成した場合、CloudFormation は ami-0ff8a91507f77f867
AMI ID、t2.micro
インスタンスタイプ、testkey
キーペアの名前、および Amazon EBS ボリュームを持つインスタンスをプロビジョニングします。
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample template", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro", "KeyName": "testkey", "BlockDeviceMappings": [ { "DeviceName": "/dev/sdm", "Ebs": { "VolumeType": "io1", "Iops": 200, "DeleteOnTermination": false, "VolumeSize": 20 } } ] } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Description: A sample template Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro KeyName: testkey BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: io1 Iops: 200 DeleteOnTermination: false VolumeSize: 20
また単独のテンプレートに複数のリソースを指定し、これらのリソースが連携するように設定できます。例えば、Elastic IP アドレス (EIP) を含めるように、前のテンプレートを修正して、次の例のように Amazon EC2 インスタンスと関連付けできます。
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A sample template", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro", "KeyName": "testkey", "BlockDeviceMappings": [ { "DeviceName": "/dev/sdm", "Ebs": { "VolumeType": "io1", "Iops": 200, "DeleteOnTermination": false, "VolumeSize": 20 } } ] } }, "MyEIP": { "Type": "AWS::EC2::EIP", "Properties": { "InstanceId": { "Ref": "MyEC2Instance" } } } } }
YAML
AWSTemplateFormatVersion: 2010-09-09 Description: A sample template Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro KeyName: testkey BlockDeviceMappings: - DeviceName: /dev/sdm Ebs: VolumeType: io1 Iops: 200 DeleteOnTermination: false VolumeSize: 20 MyEIP: Type: 'AWS::EC2::EIP' Properties: InstanceId: !Ref MyEC2Instance
上記のテンプレートは単一の Amazon EC2 インスタンスについて記述したものですが、CloudFormation テンプレートの追加機能により、複雑なリソースセットを構築して、それらのテンプレートを複数のコンテキストで再利用することができます。例えば、CloudFormation スタックの作成時に値を設定できる入力パラメータを追加できます。つまり、インスタンスタイプなどの値を、テンプレート作成時ではなく、スタック作成時に指定することができ、さまざまな状況でテンプレートを再利用しやすくなります。
詳細については、「CloudFormation テンプレートの使用」を参照してください。
スタック
CloudFormation を使用する際、関連リソースはスタックと呼ばれる単一のユニットとして管理します。スタックを作成、更新、削除することで、リソースのコレクションを作成、更新、削除します。スタック内のすべてのリソースは、スタックの CloudFormation テンプレートで定義されます。Auto Scaling グループ、Elastic Load Balancing ロードバランサー、および Amazon Relational Database Service (Amazon RDS) データベースインスタンスを含むテンプレートを作成したとします。これらのリソースを作成するには、作成したテンプレートを送信することによってスタックを作成します。これにより、CloudFormation によってすべてのリソースがプロビジョニングされます。CloudFormation のコンソール
詳細については、「AWS CloudFormation スタックを使用した単一ユニットとしての AWS リソースの管理」を参照してください。
変更セット
スタックで実行中のリソースに変更を加える必要がある場合は、スタックを更新します。リソースに変更を加える前に、変更案の概要である変更セットを生成できます。変更セットで、変更が実行中のリソース、特に重要なリソースに与える可能性のある影響を、実装前に確認できます。
例えば、Amazon RDS データベースインスタンスの名前を変更すると、CloudFormation によって新しいデータベースが作成され、古いものは削除されます。古いデータベースのデータは、バックアップしていない限り、失われます。変更セットを生成すると、変更によってデータベースが置き換えられることがわかり、スタックを更新する前に対応策を立てることができます。
詳細については、「変更セットを使用して CloudFormation スタックを更新する」を参照してください。
CloudFormation の仕組み
スタックを作成するとき、CloudFormation は基礎となるサービス呼び出しを AWS に対して行い、リソースをプロビジョニングして設定します。CloudFormation が実行できるアクションは、お客さまが許可が付与されたものに限ります。例えば、CloudFormation を使用して EC2 インスタンスを作成するには、インスタンスを作成するためのアクセス権限が必要です。インスタンスのスタックを削除する場合も同様にインスタンスを削除するアクセス権限が必要です。AWS Identity and Access Management (IAM) を使用して許可を管理します。
CloudFormation が行う呼び出しは、すべてテンプレートで宣言されます。たとえば、EC2 インスタンスのインスタンスタイプを t2.micro
と記述するテンプレートがあるとします。このテンプレートを使ってスタックを作成すると、CloudFormation は Amazon EC2 のインスタンス作成 API を呼び出し、インスタンスタイプを t2.micro
と指定します。次の図は、スタックを作成する CloudFormation ワークフローをまとめたものです。
-
Infrastructure Composer または独自のテキストエディタを使用して、JSON または YAML 形式で CloudFormation テンプレートを作成または修正します。用意されたテンプレートを使用することもできます。CloudFormation テンプレートは必要なリソースとその設定を記述します。たとえば、EC2 インスタンスを作成するとします。テンプレートは次の例のように Amazon EC2 インスタンスを宣言してそのプロパティを記述するものになります。
例 JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "A simple EC2 instance", "Resources": { "MyEC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867", "InstanceType": "t2.micro" } } } }
例 YAML
AWSTemplateFormatVersion: 2010-09-09 Description: A simple EC2 instance Resources: MyEC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 InstanceType: t2.micro
-
テンプレートをローカルに保存、または Amazon S3 バケットに保存します。テンプレートを作成した場合は、
.json
、.yaml
、または.txt
などのファイル拡張子を使用して保存します。 -
テンプレートファイルの場所 (ローカルコンピュータのパスまたはAmazon S3 の URL など) を指定して CloudFormation スタックを作成します。テンプレートにパラメーターが含まれる場合は、スタック作成時に入力値を指定できます。パラメータは、テンプレートに値を渡すことを可能にして、スタックを作成するたびにリソースをカスタマイズできるようにします。
CloudFormation のコンソール、CreateStack API 操作、または create-stack AWS CLI コマンドを使用します。
注記
ローカルに保存されたテンプレートファイルを指定する場合、CloudFormation はそれを AWS アカウントのS3 バケットにアップロードします。CloudFormation は各リージョンにテンプレートファイルをアップロードするバケットを作成します。AWS アカウントで Amazon Simple Storage Service (Amazon S3) 許可があれば、誰でもバケットにアクセスできます。CloudFormation が作成したバケットが既に存在する場合は、テンプレートはそのバケットに追加されます。
手動でテンプレートを Amazon S3 にアップロードすることで、独自のバケットを使用してアクセス権限を管理できます。その場合は、スタックを作成または更新するたびに、テンプレートファイルの Amazon S3 URL を指定します。
CloudFormation は、テンプレートに記述されている AWS サービスを呼び出すことで、リソースをプロビジョニングして設定します。
すべてのリソースの作成が完了すると、CloudFormation はスタックが正常に作成された旨のレポートを送信します。これで、スタック内のリソースが使用できるようになります。スタックの作成が失敗した場合、CloudFormation は作成したリソースを削除して、変更をロールバックします。
変更セットを使用したスタックの更新
スタックのリソースを更新する必要がある場合、スタックのテンプレートを変更できます。新しいスタックを作成して古いものを削除する必要はありません。スタックを更新するには、元のスタックテンプレートの修正バージョン、異なる入力パラメータ値、またはその両方を送信して変更セットを作成します。CloudFormation は、修正されたテンプレートを元のテンプレートと比較して、変更セットを生成します。変更セットには、変更案がリストされます。変更を確認した後、変更セットを実行してスタックを更新、あるいは新しい変更セットを作成できます。次の図は、スタックを更新するワークフローの概要です。
重要
更新によって中断が発生する場合があります。更新しているリソースやプロパティによって、既存のリソースが中断されたり、置き換えられる場合もあります。詳細については、「スタックリソースの更新動作を理解する」を参照してください。
-
Infrastructure Composer またはテキストエディタを使用して、CloudFormation スタックテンプレートを修正できます。たとえば、EC2 インスタンスのインスタンスタイプを変更する場合、元のスタックのテンプレートの
InstanceType
プロパティの値を変更します。詳細については、「スタックテンプレートを更新する」を参照してください。 -
CloudFormation テンプレートをローカルまたは S3 バケットに保存します。
-
更新するスタックおよび修正済みテンプレートの場所 (ローカルコンピューターのパスや Amazon S3 の URL など) を指定し、変更セットを作成します。テンプレートにパラメーターが含まれる場合は、変更セットの作成時に値を指定できます。
変更セットの作成方法については、変更セットを使用して CloudFormation スタックを更新する を参照してください。
注記
ローカルコンピュータに保存されたテンプレートを指定する場合、CloudFormation はテンプレートを自動的に AWS アカウント アカウントの S3 バケットにアップロードします。
-
変更セットを参照して、CloudFormation が想定どおりに変更を実行することを確認します。例えば、CloudFormation が重要なスタックリソースを置き換えるかどうかを確認します。必要な変更が含まれるまで、いくつでも変更セットを作成できます。
-
スタックに適用する変更セットを開始します。CloudFormation は、修正したリソースのみを更新することでスタックを更新し、スタックが正常に更新された旨の信号を送信します。スタックの更新が失敗した場合、CloudFormation は変更箇所をロールバックして、スタックを正常な稼働が確認されている最新の状態に復元します。
スタックの削除
スタックを削除する場合は、削除するスタックを指定します。CloudFormation はそのスタックとスタック内のすべてのリソースを削除します。CloudFormation コンソール、DeleteStack API 操作、または delete-stack AWS CLI コマンドを使用してスタックを削除できます。
スタックを削除してもその中のいくつかのリソースを保持する場合は、削除ポリシーを使用してそのリソースを保持できます。
すべてのリソースの削除が完了すると、CloudFormation はスタックが正常に削除された旨のシグナルを送信します。CloudFormation がリソースを削除できない場合、スタックは削除されません。削除されなかったリソースは、スタックが正常に削除されるまで保持されます。