AWS CloudFormation
ユーザーガイド (API バージョン 2010-05-15)

サンプルテンプレート

条件付きで、本稼働用、開発用、またはテスト用のスタックのリソースを作成します。

場合によっては、似てはいるものの、微調整したスタックを作成することがあります。たとえば、本稼働用アプリケーションに使用するテンプレートがあるとします。開発またはテスト用に、同じ本稼働用スタックを作成します。ただし、開発やテストでは、本稼働レベルのスタックに含まれている余分な容量のすべては必要としません。代わりに、次の例に示すように環境タイプ入力パラメーターを使用して、条件付きで本稼働、開発、およびテストに固有のスタックリソースを作成できます。

例 JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Mappings" : { "RegionMap" : { "us-east-1" : { "AMI" : "ami-0ff8a91507f77f867"}, "us-west-1" : { "AMI" : "ami-0bdb828fd58c52235"}, "us-west-2" : { "AMI" : "ami-a0cfeed8"}, "eu-west-1" : { "AMI" : "ami-047bb4163c506cd98"}, "sa-east-1" : { "AMI" : "ami-07b14488da8ea02a0"}, "ap-southeast-1" : { "AMI" : "ami-08569b978cc4dfa10"}, "ap-southeast-2" : { "AMI" : "ami-09b42976632b27e9b"}, "ap-northeast-1" : { "AMI" : "ami-06cd52961ce9f0d85"} } }, "Parameters" : { "EnvType" : { "Description" : "Environment type.", "Default" : "test", "Type" : "String", "AllowedValues" : ["prod", "dev", "test"], "ConstraintDescription" : "must specify prod, dev, or test." } }, "Conditions" : { "CreateProdResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "prod"]}, "CreateDevResources" : {"Fn::Equals" : [{"Ref" : "EnvType"}, "dev"]} }, "Resources" : { "EC2Instance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : { "Fn::FindInMap" : [ "RegionMap", { "Ref" : "AWS::Region" }, "AMI" ]}, "InstanceType" : { "Fn::If" : [ "CreateProdResources", "c1.xlarge", {"Fn::If" : [ "CreateDevResources", "m1.large", "m1.small" ]} ]} } }, "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" Mappings: RegionMap: us-east-1: AMI: "ami-0ff8a91507f77f867" us-west-1: AMI: "ami-0bdb828fd58c52235" us-west-2: AMI: "ami-a0cfeed8" eu-west-1: AMI: "ami-047bb4163c506cd98" sa-east-1: AMI: "ami-07b14488da8ea02a0" ap-southeast-1: AMI: "ami-08569b978cc4dfa10" ap-southeast-2: AMI: "ami-09b42976632b27e9b" ap-northeast-1: AMI: "ami-06cd52961ce9f0d85" Parameters: EnvType: Description: Environment type. Default: test Type: String AllowedValues: [prod, dev, test] ConstraintDescription: must specify prod, dev, or test. Conditions: CreateProdResources: !Equals [!Ref EnvType, prod] CreateDevResources: !Equals [!Ref EnvType, "dev"] Resources: EC2Instance: Type: "AWS::EC2::Instance" Properties: ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", AMI] InstanceType: !If [CreateProdResources, c1.xlarge, !If [CreateDevResources, m1.large, m1.small]] 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

prod パラメーターには、devtest、または EnvType を指定できます。環境タイプごとに、テンプレートは異なるインスタンスタイプを指定します。インスタンスタイプは、大きなコンピューティング最適化インスタンスタイプから小さい汎用インスタンスタイプまでさまざまです。条件付きでインスタンスタイプを指定するために、テンプレートは Conditions セクションで 2 つの条件を定義します。1 つは CreateProdResources で、EnvType パラメーター値が prod に等しい場合は true に評価されます。もう 1 つは CreateDevResources で、パラメーター値が dev に等しい場合は true に評価されます。

InstanceType プロパティ内で、テンプレートは 2 つの Fn::If 組み込み関数を使用して、どのインスタンスタイプを使用するかを調べます。CreateProdResources 条件が true の場合、インスタンスタイプは c1.xlarge です。条件が false の場合は、CreateDevResources 条件が評価されます。CreateDevResources 条件が true の場合、インスタンスタイプは m1.large です。その他の場合、インスタンスタイプは m1.small です。

インスタンスタイプの他に、本稼働環境は Amazon EC2 ボリュームを作成して、インスタンスにアタッチします。MountPoint および NewVolume リソースは、条件が true に評価される場合にだけリソースが作成されるように、CreateProdResources 条件に関連付けられています。

条件付きでのリソースプロパティの割り当て

この例では、スナップショットから Amazon RDS DB インスタンスを作成できます。DBSnapshotName パラメータを指定すると、DB インスタンスを作成するときにスナップショットの名前としてパラメータ値が AWS CloudFormation で使用されます。デフォルト値 (空の文字列) のままにしておくと、AWS CloudFormation では DBSnapshotIdentifier プロパティが削除され、DB インスタンスが新しく作成されます。

例 JSON

{ "AWSTemplateFormatVersion" : "2010-09-09", "Parameters": { "DBUser": { "NoEcho": "true", "Description" : "The database admin account username", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*", "ConstraintDescription" : "must begin with a letter and contain only alphanumeric characters." }, "DBPassword": { "NoEcho": "true", "Description" : "The database admin account password", "Type": "String", "MinLength": "1", "MaxLength": "41", "AllowedPattern" : "[a-zA-Z0-9]*", "ConstraintDescription" : "must contain only alphanumeric characters." }, "DBSnapshotName": { "Description": "The name of a DB snapshot (optional)", "Default": "", "Type": "String" } }, "Conditions": { "UseDBSnapshot": {"Fn::Not": [{"Fn::Equals" : [{"Ref" : "DBSnapshotName"}, ""]}]} }, "Resources" : { "MyDB" : { "Type" : "AWS::RDS::DBInstance", "Properties" : { "AllocatedStorage" : "5", "DBInstanceClass" : "db.m1.small", "Engine" : "MySQL", "EngineVersion" : "5.5", "MasterUsername" : { "Ref" : "DBUser" }, "MasterUserPassword" : { "Ref" : "DBPassword" }, "DBParameterGroupName" : { "Ref" : "MyRDSParamGroup" }, "DBSnapshotIdentifier" : { "Fn::If" : [ "UseDBSnapshot", {"Ref" : "DBSnapshotName"}, {"Ref" : "AWS::NoValue"} ] } } }, "MyRDSParamGroup" : { "Type": "AWS::RDS::DBParameterGroup", "Properties" : { "Family" : "MySQL5.5", "Description" : "CloudFormation Sample Database Parameter Group", "Parameters" : { "autocommit" : "1" , "general_log" : "1", "old_passwords" : "0" } } } } }

例 YAML

AWSTemplateFormatVersion: "2010-09-09" Parameters: DBUser: NoEcho: true Description: The database admin account username Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" ConstraintDescription: must begin with a letter and contain only alphanumeric characters. DBPassword: NoEcho: true Description: The database admin account password Type: String MinLength: 1 MaxLength: 41 AllowedPattern: "[a-zA-Z0-9]*" ConstraintDescription: must contain only alphanumeric characters. DBSnapshotName: Description: The name of a DB snapshot (optional) Default: "" Type: String Conditions: UseDBSnapshot: !Not [!Equals [!Ref DBSnapshotName, ""]] Resources: MyDB: Type: "AWS::RDS::DBInstance" Properties: AllocatedStorage: 5 DBInstanceClass: db.m1.small Engine: MySQL EngineVersion: 5.5 MasterUsername: !Ref DBUser MasterUserPassword: !Ref DBPassword DBParameterGroupName: !Ref MyRDSParamGroup DBSnapshotIdentifier: !If [UseDBSnapshot, !Ref DBSnapshotName, !Ref "AWS::NoValue"] MyRDSParamGroup: Type: "AWS::RDS::DBParameterGroup" Properties: Family: MySQL5.5 Description: CloudFormation Sample Database Parameter Group Parameters: autocommit: 1 general_log: 1 old_passwords: 0

UseDBSnapshot 条件は、DBSnapshotName が空の文字列ではない場合にのみ、true に評価されます。UseDBSnapshot 条件が true に評価された場合は、DBSnapshotIdentifier プロパティに DBSnapshotName パラメータ値が AWS CloudFormation で使用されます。条件が false に評価された場合は、DBSnapshotIdentifier プロパティが AWS CloudFormation で削除されます。AWS::NoValue 擬似パラメーターは、戻り値として使用された場合、対応するリソースプロパティを削除します。

条件付きでの既存のリソースの使用

この例では、既に作成されている Amazon EC2 セキュリティグループを使用するか、新しいセキュリティグループを作成できます。これは、テンプレートで指定されます。ExistingSecurityGroup パラメーターには、default セキュリティグループ名または NONE を指定できます。default を指定すると、既に作成されて default という名前が付けられているセキュリティグループが AWS CloudFormation で使用されます。NONE を指定すると、テンプレートで定義されているセキュリティグループが AWS CloudFormation で作成されます。

例 JSON

{ "Parameters" : { "ExistingSecurityGroup" : { "Description" : "An existing security group ID (optional).", "Default" : "NONE", "Type" : "String", "AllowedValues" : ["default", "NONE"] } }, "Conditions" : { "CreateNewSecurityGroup" : {"Fn::Equals" : [{"Ref" : "ExistingSecurityGroup"}, "NONE"] } }, "Resources" : { "MyInstance" : { "Type" : "AWS::EC2::Instance", "Properties" : { "ImageId" : "ami-0ff8a91507f77f867", "SecurityGroups" : [{ "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] }] } }, "NewSecurityGroup" : { "Type" : "AWS::EC2::SecurityGroup", "Condition" : "CreateNewSecurityGroup", "Properties" : { "GroupDescription" : "Enable HTTP access via port 80", "SecurityGroupIngress" : [ { "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "CidrIp" : "0.0.0.0/0" } ] } } }, "Outputs" : { "SecurityGroupId" : { "Description" : "Group ID of the security group used.", "Value" : { "Fn::If" : [ "CreateNewSecurityGroup", {"Ref" : "NewSecurityGroup"}, {"Ref" : "ExistingSecurityGroup"} ] } } } }

例 YAML

Parameters: ExistingSecurityGroup: Description: An existing security group ID (optional). Default: NONE Type: String AllowedValues: - default - NONE Conditions: CreateNewSecurityGroup: !Equals [!Ref ExistingSecurityGroup, NONE] Resources: MyInstance: Type: "AWS::EC2::Instance" Properties: ImageId: "ami-0ff8a91507f77f867" SecurityGroups: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup] NewSecurityGroup: Type: "AWS::EC2::SecurityGroup" Condition: CreateNewSecurityGroup Properties: GroupDescription: Enable HTTP access via port 80 SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 Outputs: SecurityGroupId: Description: Group ID of the security group used. Value: !If [CreateNewSecurityGroup, !Ref NewSecurityGroup, !Ref ExistingSecurityGroup]

NewSecurityGroup リソースを作成するかどうかを判断するために、リソースは CreateNewSecurityGroup 条件に関連付けられています。リソースは、条件が true である場合 (ExistingSecurityGroup パラメーターが NONE に等しい場合) にだけ作成されます。

SecurityGroups プロパティで、テンプレートは Fn::If 組み込み関数を使用して、どのセキュリティグループを使用するかを調べます。CreateNewSecurityGroup 条件が true に評価された場合、セキュリティグループプロパティは NewSecurityGroup リソースを参照します。CreateNewSecurityGroup 条件が false に評価された場合、セキュリティグループプロパティは ExistingSecurityGroup パラメーター (default セキュリティグループ) を参照します。

最後に、テンプレートは条件付きでセキュリティグループ ID を出力します。CreateNewSecurityGroup 条件が true に評価された場合は、AWS CloudFormation はNewSecurityGroup リソースのセキュリティグループ ID を出力します。条件が false の場合は、AWS CloudFormation に ExistingSecurityGroup リソースのセキュリティグループ ID が出力されます。