条件 - AWS CloudFormation

条件

オプションの Conditions セクションには、エンティティが作成または設定される状況を定義するステートメントが含まれています。たとえば、条件を作成し、それをリソースまたは出力に関連付けることで、条件が true の場合にのみ AWS CloudFormation がリソースまたは出力を作成するようにできます。同様に、条件をプロパティに関連付けて、条件が true の場合にのみ AWS CloudFormation がプロパティを特定の値に設定するようにできます。条件が false の場合、AWS CloudFormation はプロパティをユーザーが指定した別の値に設定します。

テスト環境と本稼働環境など、異なるコンテキストでリソースを作成できるテンプレートを再利用する場合に、条件を使用することがあります。テンプレートで EnvironmentType 入力パラメータを追加できます。このパラメータは入力として prod または test を受け取ります。本稼働環境では特定の機能に Amazon EC2 インスタンスを含め、テスト環境ではコスト削減のために使用する機能数を減らす場合があります。条件を使用すると、どのリソースを作成するかや、それらを各環境タイプでどのように設定するかを定義できます。

条件は、スタックを作成または更新するときに、事前定義の擬似パラメータまたは指定する入力パラメータ値に基づいて評価されます。それぞれの条件の中で、別の条件、パラメーター値、マッピングを参照することができます。必要な条件をすべて定義したら、テンプレートの Resources セクションと Outputs セクションでそれらをリソースやリソースプロパティに関連付けることができます。

AWS CloudFormation は、スタックの作成時または更新時、テンプレートに存在するすべての条件を評価したうえで、リソースを作成します。関連付けられた条件が true となるリソースが作成されます。関連づけられた条件が false のリソースは無視されます。また、AWS CloudFormation では各スタックの更新時に、リソースが更新される前にこれらの条件が再評価されます。関連付けられた条件が true のままのリソースは更新されます。関連づけられた条件が false になったリソースは削除されます。

重要

スタックの更新時に、条件を単独で更新することはできません。条件を更新できるのは、リソースを追加、変更、または削除する変更を含める場合だけです。

条件の概要を使用方法

条件付きで作成または構成するエンティティに応じて、次のテンプレートセクションにステートメントを含める必要があります。

Parameters セクション

条件で評価する入力を定義します。これらの入力パラメータの値に基づいて、条件は true または false と評価されます。条件で擬似パラメータを評価する場合は、このセクションで擬似パラメータを定義する必要はありません。擬似パラメータは AWS CloudFormation によって事前定義されています。

Conditions セクション

組み込み関数を使用して条件を定義します。これらの条件は、AWS CloudFormation が関連するリソースをいつ作成するかを指定します。

Resources および Outputsセクション

条件付きで作成するリソースまたは出力と条件を関連付けます。AWS CloudFormation は、true に関連付けられたエンティティを作成し、false に関連付けられたをエンティティを無視します。Condition キーと条件の論理 ID を使用して、リソースまたは入力と関連付けます。条件付きでプロパティを指定するには、Fn::If 関数を使用します。詳細については、「条件関数」を参照してください。

構文

Conditions セクションは、キー名 Conditions で構成されます。各条件の宣言には論理 ID と組み込み関数が含まれており、スタックの作成または更新時に評価されます。次の擬似テンプレートで、Conditions セクションの概要を示します。

JSON

"Conditions" : { "MyLogicalID" : {Intrinsic function} }

YAML

Conditions: MyLogicalID: Intrinsic function

条件の組み込み関数

次の組み込み関数を使用して条件を定義できます。

各関数の構文と情報については、「条件関数」を参照してください。

注記

Fn::If は、テンプレートの Resources セクションと Outputs セクションのメタデータ属性、更新ポリシー属性、およびプロパティ値でのみ使用できます。

シンプルな条件

次のサンプルテンプレートには、EnvType という入力パラメーターが存在します。本稼働用のスタックを作成する場合は prod を、テスト用のスタックを作成する場合は test をここに指定します。本稼働環境の場合、AWS CloudFormation が Amazon EC2 インスタンスを作成し、インスタンスにボリュームをアタッチします。テスト環境では、AWS CloudFormation は Amazon EC2 インスタンスのみ作成します。

CreateProdResources 条件は、true パラメーターが EnvType と等しい場合に prod に評価されます。このサンプルテンプレートでは、NewVolume リソースと MountPoint リソースを CreateProdResources 条件に関連付けています。したがって、EnvType パラメーターが prod と等しい場合にのみ、リソースが作成されます。

JSON

{ "AWSTemplateFormatVersion": "2010-09-09", "Parameters": { "EnvType": { "Description": "Environment type.", "Default": "test", "Type": "String", "AllowedValues": [ "prod", "test" ], "ConstraintDescription": "must specify prod or test." } }, "Conditions": { "CreateProdResources": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] } }, "Resources": { "EC2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "ImageId": "ami-0ff8a91507f77f867" } }, "MountPoint": { "Type": "AWS::EC2::VolumeAttachment", "Condition": "CreateProdResources", "Properties": { "InstanceId": { "Ref": "EC2Instance" }, "VolumeId": { "Ref": "NewVolume" }, "Device": "/dev/sdh" } }, "NewVolume": { "Type": "AWS::EC2::Volume", "Condition": "CreateProdResources", "Properties": { "Size": 100, "AvailabilityZone": { "Fn::GetAtt": [ "EC2Instance", "AvailabilityZone" ] } } } } }

YAML

AWSTemplateFormatVersion: 2010-09-09 Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: - prod - test ConstraintDescription: must specify prod or test. Conditions: CreateProdResources: !Equals - !Ref EnvType - prod Resources: EC2Instance: Type: 'AWS::EC2::Instance' Properties: ImageId: ami-0ff8a91507f77f867 MountPoint: Type: 'AWS::EC2::VolumeAttachment' Condition: CreateProdResources Properties: InstanceId: !Ref EC2Instance VolumeId: !Ref NewVolume Device: /dev/sdh NewVolume: Type: 'AWS::EC2::Volume' Condition: CreateProdResources Properties: Size: 100 AvailabilityZone: !GetAtt - EC2Instance - AvailabilityZone

ネストされた条件

次のサンプルテンプレートは、別の条件内の条件を参照します。S3 バケットを作成するスタックを作成できます。実稼働環境にデプロイされたスタックの場合、AWS CloudFormation は S3 バケットのポリシーを作成します。

JSON
{ "Parameters": { "EnvType": { "Type": "String", "AllowedValues": [ "prod", "test" ] }, "BucketName": { "Default": "", "Type": "String" } }, "Conditions": { "IsProduction": { "Fn::Equals": [ { "Ref": "EnvType" }, "prod" ] }, "CreateBucket": { "Fn::Not": [ { "Fn::Equals": [ { "Ref": "BucketName" }, "" ] } ] }, "CreateBucketPolicy": { "Fn::And": [ { "Condition": "IsProduction" }, { "Condition": "CreateBucket" } ] } }, "Resources": { "Bucket": { "Type": "AWS::S3::Bucket", "Condition": "CreateBucket" }, "Policy": { "Type": "AWS::S3::BucketPolicy", "Condition": "CreateBucketPolicy", "Properties": { "Bucket": { "Ref": "Bucket" }, "PolicyDocument": "..." } } } }
YAML
Parameters: EnvType: Type: String AllowedValues: - prod - test BucketName: Default: '' Type: String Conditions: IsProduction: !Equals - !Ref EnvType - prod CreateBucket: !Not - !Equals - !Ref BucketName - '' CreateBucketPolicy: !And - !Condition IsProduction - !Condition CreateBucket Resources: Bucket: Type: 'AWS::S3::Bucket' Condition: CreateBucket Policy: Type: 'AWS::S3::BucketPolicy' Condition: CreateBucketPolicy Properties: Bucket: !Ref BucketName PolicyDocument: ...