サンプルテンプレート - AWS CloudFormation

サンプルテンプレート

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

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

例 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 インスタンスを作成するときにスナップショットの名前としてパラメータ値が CloudFormation で使用されます。デフォルト値 (空の文字列) のままにしておくと、CloudFormation では DBSnapshotIdentifier プロパティが削除され、DB インスタンスが新しく作成されます。

例では、NoEcho プロパティを true に設定して DBUser および DBPassword パラメータを定義しています。NoEcho 属性を true に設定すると、CloudFormation は、スタックまたはスタックイベントを記述するすべての呼び出しに対して、アスタリスク (*****) としてマスクされたパラメータ値を返します。ただし、以下に指定された場所に保存されている情報は除きます。

重要

NoEcho 属性を使用しても、以下に保存されている情報はマスクされません。

パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。

重要

機密情報は、CloudFormation テンプレートに直接埋め込むのではなく、スタックテンプレートの動的パラメータを使用して CloudFormation の外部 (AWS Systems Manager パラメータストアや AWS Secrets Manager など) に保存して管理した上で 参照することをお勧めします。

詳細については、「テンプレートに認証情報を埋め込まない のベストプラクティス」を参照してください。

例 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.t2.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.t2.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 に評価された場合は、CloudFormation は DBSnapshotIdentifier プロパティに DBSnapshotName パラメータ値を使用します。条件が false に評価された場合は、CloudFormation は DBSnapshotIdentifier プロパティを削除します。AWS::NoValue 擬似パラメータは、戻り値として使用された場合、対応するリソースプロパティを削除します。

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

この例では、既に作成されている Amazon EC2 セキュリティグループを使用するか、新しいセキュリティグループを作成できます。これは、テンプレートで指定されます。ExistingSecurityGroup パラメーターには、default セキュリティグループ名または NONE を指定できます。default を指定すると、既に作成されて default という名前が付けられているセキュリティグループが CloudFormation で使用されます。NONE を指定すると、テンプレートで定義されているセキュリティグループが 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 に評価された場合は、CloudFormation は NewSecurityGroup リソースのセキュリティグループ ID を出力します。条件が false の場合は、CloudFormation が ExistingSecurityGroup リソースのセキュリティグループ ID を出力します。