このトピックでは、各リソースのプロパティおよびスタック内のリソースの依存関係について説明します。 リソースは、他のリソースおよび出力項目から参照できます。

構文

各リソースは、ID と説明で構成されています。 リソースの説明は、すべて波括弧 ({ }) で囲まれています。 リソースが複数ある場合はコンマ (,) で区切ります。 以下のサンプルコードは、リソースの構文を示しています。

"Resources" : {
    "Resource1 ID": {
        "Type": "The resource type",
        "Condition": "The condition that specifies whether to create the resource",
        "Properties" : {
            The description of the resource properties
        }
    },
    "Resource2 ID" : {
        "Type": "The resource type",
        "Condition": "The condition that specifies whether to create the resource",
        "Properties" : {
            The description of the resource properties
        }
    }
}
パラメーターの説明 :
  • リソース ID はテンプレート内で一意である必要があります。 リソース ID を使用して、テンプレートの他の部分のリソースを参照できます。
  • Type パラメーターは、ここで宣言されるリソースのタイプを指定します。 たとえば、ALIYUN::ECS::Instance は、リソースが Elastic Compute Service (ECS) インスタンスであることを示します。
  • [プロパティ] セクションでは、リソースに追加のオプションを指定することも可能です。 たとえば、Alibaba Cloud ECS のインスタンスごとにイメージ ID を指定する必要があります。

"Resources" : {
  "ECSInstance" : {
    "Type" : "ALIYUN::ECS::Instance",
    "Properties" : {
      "ImageId" : "m-25l0r****"
    }
  }
}

リソースのプロパティの宣言が不要な場合は、そのリソースの [プロパティ] セクションを省略します。

プロパティの値には、テキスト文字列、文字列リスト、ブール値、参照パラメーター、または関数の戻り値を指定できます。
  • 文字列は二重引用符 (" ") で囲みます。
  • 文字列リストは角括弧 ([ ]) で囲みます。
  • 組み込み関数の参照パラメーターまたは戻り値は、波括弧 ({ }) で囲みます。
前述の規則は、プロパティの値がテキスト文字列、文字列リスト、参照パラメーター、および関数の戻り値の組み合わせである場合にも適用されます。

以下ののサンプルコードは、さまざまなタイプのプロパティを宣言する方法を示しています。

"Properties" : {
    "String" : "string",
    "LiteralList" : [ "value1", "value2" ],
    "Boolean" : true
    "ReferenceForOneValue" :  { "Ref" : "ResourceID" } ,
    "FunctionResultWithFunctionParams" : {
        "Fn::Join" : [ "%", [ "Key=", { "Ref" : "SomeParameter" } ] ] }
}

DeletionPolicy

DeletionPolicy パラメーターを使うことで、スタックが削除されてもリソースを保持できます。 以下のサンプルコードは、DeletionPolicy パラメーターを使用した、リソーススタックの削除時における ECS インスタンスの保持方法を示しています。
"Resources" : {
  "ECSInstance" : {
    "Type" : "ALIYUN::ECS::Instance",
    "Properties" : {
      "ImageId" : "m-25l0r****"
    },
    "DeletionPolicy" : "Retain"
  }
}

この例では、テンプレートをもとに作成されたスタックが削除されても ECS インスタンスは保持されます。

DependsOn

DependsOn パラメーターを使うことで、あるリソースの依存リソースを作成した後に、そのリソースを作成できます。 リソースに DependsOn パラメーターを指定すると、DependsOn パラメーターで指定された依存リソースの作成後に、そのリソースが作成されます。

重要 DependsOn パラメーターで指定されたリソースの Condition パラメーターは False に設定できます。 False の値はリソースの作成に影響しません。
以下のサンプルコードは、依存リソースの構成方法を表しています。
  • 単一の依存リソースを構成します。
    "DependsOn": "ResourceName"
  • 複数の依存リソースを構成します。
    "DependsOn": [
                   "ResourceName1",
                   "ResourceName2"
                 ]   
以下の例では、WebServer は必ず DatabaseServer が作成された後に作成されます。
{
  "ROSTemplateFormatVersion" : "2015-09-01",
  "Resources" : {
    "WebServer": {
      "Type": "ALIYUN::ECS::Instance",
      "DependsOn": "DatabseServer"
    },
    "DatabseServer": {
      "Type": "ALIYUN::ECS::Instance",
      "Properties": {
        "ImageId" : "m-25l0r****",
        "InstanceType": "ecs.t1.small"
      }
    }
  }
}        

Condition

Condition パラメーターでは、リソースを作成するかを指定できます。 リソースは、Condition パラメーターが True に設定されている場合にのみ作成できます。

以下の例では、 MaxAmount パラメーターの定める条件が true の場合にのみ WebServer は作成されます。
{
  "ROSTemplateFormatVersion" : "2015-09-01",
  "Parameters": {
    "MaxAmount": {
      "Type": "Number",
      "Default": 1
    }
  },
  "Conditions": {
    "CreateWebServer": {"Fn::Not": {"Fn::Equals": [0, {"Ref": "MaxAmount"}]}}
  }
  "Resources" : {
    "WebServer": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Condition": "CreateWebServer",
      "Properties": {
        "ImageId" : "m-25l0rc****",
        "InstanceType": "ecs.t1.small"
        "MaxAmount": {"Ref": "MaxAmount"}
      }
    },
    "DatabseServer": {
      "Type": "ALIYUN::ECS::Instance",
      "Properties": {
        "ImageId" : "m-25l0r****",
        "InstanceType": "ecs.t1.small"
      }
    }
  }
}

Count

Count パラメーターを使うことで、リソースのテンプレートを前処理し、そのリソースを複数リソースに拡張できます。 前処理されたテンプレートは、スタックの管理に使用されます。
  • 以下の例では、リソース ACount パラメーターが 3 に設定されています。結果として生じたテンプレートで、A のリソースは A[0]A[1]A[2] という名前のリソースに置き換えられています。
    "Resources": {
      "A": {
        "Count": 3,
        ...
      },
      ...
    }

    前処理後の結果:

    "Resources": {
      "A[0]": {
        ...
      },
      "A[1]": {
        ...
      },
      "A[2]": {
        ...
      },
      ...
    }
    重要 リソースの展開後、A[1] 等のリソース名が元のテンプレートにすでに存在する場合、前処理は失敗します。

    リソース名の変更に伴ってリソースが削除されてしまうため、既存のリソースに対して Count プロパティを指定しないことを推奨します。

  • Count パラメーターの値は自然数である必要があります。 このパラメーターは、以下の関数のみをサポートします。
    • Ref (パラメーターの参照のみ)
    • Fn::FindInMap
    • Fn::Select
    • Fn::Join
    • Fn::Split
    • Fn::Replace
    • Fn::Base64Encode
    • Fn::Base64Decode
    • Fn::MemberListToMap
    • Fn::If
    • Fn::ListMerge
    • Fn::GetJsonValue
    • Fn::MergeMapToList
    • Fn::SelectMapList
    • Fn::Add
    • Fn::Avg
    • Fn::Str
    • Fn::Calculate
    • Fn::Max
    • Fn::Min
  • 前処理されたテンプレートリソースは 300 未満となる必要があります。
  • Count パラメーターが指定されているリソースのプロパティでは ALIYUN::Index の疑似パラメーターを使用でき、前処理中に対応する値に置き換えられます。 たとえば、A[0] に使用した ALIYUN::Indexは 0 に置き換えられます。 A[1]に使用されている ALIYUN::Index は、1 に置き換えられます。 ALIYUN::Index テンプレートの他の箇所では使用できません。
  • DependsOn パラメーターの一部となっている場合、Count が指定されたリソースは展開されます。 例:
    "DependsOn": "A"

    前処理後の結果:

    "DependsOn": ["A[0]", "A[1]", "A[2]"]
  • Ref および Fn::GetAtt 関数の一部となっている場合、Count が指定されたリソースは展開されます。 例:
    {
      "Ref": "A"
    }
    
    
    {
      "Fn::GetAtt": ["A", "PropertyName"]
    }

    前処理後の結果:

    [
      {
        "Ref": "A[0]"
      },
      {
        "Ref": "A[1]"
      },
      {
        "Ref": "A[2]"
      }
    ]
    
    
    [
      {
        "Fn::GetAtt": [
          "A[0]",
          "PropertyName"
        ]
      },
      {
        "Fn::GetAtt": [
          "A[1]",
          "PropertyName"
        ]
      },
      {
        "Fn::GetAtt": [
          "A[2]",
          "PropertyName"
        ]
      }
    ]

    複数のリソースが Count パラメーターを使用し、相互に参照している場合は、Fn::SelectALIYUN::Index と Count を組み合わせて使用してください。 例:

    {
      "Fn::Select": [
        {
          "Ref": "ALIYUN::Index"
        },
        {
          "Ref": "A"
        }
      ]
    }

    この A のリソースの例では、BA を参照しており、BCount パラメータは 2 に設定されています。 以下は、前処理後の B[0] および B[1] の表現の一部を表しています。

    {
      "Ref": "A[0]"
    }
    
    {
      "Ref": "A[1]"
    }

以下のサンプルテンプレートでは、エラスティック IP アドレス (EIP) のグループおよびそれに対応する数の ECS インスタンスが作成されます。このとき ECS インスタンスに EIP が関連付けられます。

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "Count": {
      "Type": "Number"
    }
  },
  "Resources": {
    "Eip": {
      "Type": "ALIYUN::VPC::EIP",
      "Count": {
        "Ref": "Count"
      },
      "Properties": {
        "Bandwidth": 5
      }
    },
    "Servers": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Properties": {
        "MinAmount": {
          "Ref": "Count"
        },
        "MaxAmount": {
          "Ref": "Count"
        },
        "AllocatePublicIP": false,
        ...
      }
    },
    "EipBind": {
      "Type": "ALIYUN::VPC::EIPAssociation",
      "Count": {
        "Ref": "Count"
      },
      "Properties": {
        "InstanceId": {
          "Fn::Select": [
            {
              "Ref": "ALIYUN::Index"
            },
            {
              "Fn::GetAtt": [
                "Servers",
                "InstanceIds"
              ]
            }
          ]
        },
        "AllocationId": {
          "Fn::Select": [
            {
              "Ref": "ALIYUN::Index"
            },
            {
              "Ref": "Eip"
            }
          ]
        }
      }
    }
  },
  "Outputs": {
    "InstanceIds": {
      "Value": {
        "Fn::GetAtt": [
          "Servers",
          "InstanceIds"
        ]
      }
    },
    "AllocationIds": {
      "Value": {
        "Ref": "Eip"
      }
    },
    "EipAddresses": {
      "Value": {
        "Fn::GetAtt": [
          "Eip",
          "EipAddress"
        ]
      }
    }
  }
}

前処理後の結果:

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "Count": {
      "Type": "Number"
    }
  },
  "Resources": {
    "Eip[0]": {
      "Type": "ALIYUN::VPC::EIP",
      "Properties": {
        "Bandwidth": 5
      }
    },
    "Eip[1]": {
      "Type": "ALIYUN::VPC::EIP",
      "Properties": {
        "Bandwidth": 5
      }
    },
    "Servers": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Properties": {
        "MinAmount": {
          "Ref": "Count"
        },
        "MaxAmount": {
          "Ref": "Count"
        },
        "AllocatePublicIP": false,
        ...
      }
    },
    "EipBind[0]": {
      "Type": "ALIYUN::VPC::EIPAssociation",
      "Properties": {
        "InstanceId": {
          "Fn::Select": [
            0,
            {
              "Fn::GetAtt": [
                "Servers",
                "InstanceIds"
              ]
            }
          ]
        },
        "AllocationId": {
          "Ref": "Eip[0]"
        }
      }
    },
    "EipBind[1]": {
      "Type": "ALIYUN::VPC::EIPAssociation",
      "Properties": {
        "InstanceId": {
          "Fn::Select": [
            1,
            {
              "Fn::GetAtt": [
                "Servers",
                "InstanceIds"
              ]
            }
          ]
        },
        "AllocationId": {
          "Ref": "Eip[1]"
        }
      }
    }
  },
  "Outputs": {
    "InstanceIds": {
      "Value": {
        "Fn::GetAtt": [
          "Servers",
          "InstanceIds"
        ]
      }
    },
    "AllocationIds": {
      "Value": [
        {
          "Ref": "Eip[0]"
        },
        {
          "Ref": "Eip[1]"
        }
      ]
    },
    "EipAddresses": {
      "Value": [
        {
          "Fn::GetAtt": [
            "Eip[0]",
            "EipAddress"
          ]
        },
        {
          "Fn::GetAtt": [
            "Eip[1]",
            "EipAddress"
          ]
        }
      ]
    }
  }
}

リソース宣言の例

以下のサンプルコードは、Logtail の宣言方法を示しています。

"Resources" : {
    "WebServer": {
      "Type": "ALIYUN::ECS::Instance",
      "Properties": {
        "ImageId" : "m-25l0r****",
        "InstanceType": "ecs.t1.small",
        "SecurityGroupId": "sg-25zwc****",
        "ZoneId": "cn-beijing-b",
        "Tags": [{
            "Key": "Department1",
            "Value": "HumanResource"
        },{
            "Key": "Department2",
            "Value": "Finance"
        }
        ]
      }
    },
    "ScalingConfiguration": {
      "Type": "ALIYUN::ESS::ScalingConfiguration",
      "Properties": {
        "ImageId": "ubuntu_14_04_64_20G_aliaegis_2015****.vhd",
        "InstanceType": "ecs.t1.small",
        "InstanceId": "i-25xhh****",
        "InternetChargeType": "PayByTraffic",
        "InternetMaxBandwidthIn": 1,
        "InternetMaxBandwidthOut": 20,
        "SystemDisk_Category": "cloud",
        "ScalingGroupId": "bwhtvpcBcKYac9fe3vd0****",
        "SecurityGroupId": "sg-25zwc****",
        "DiskMappings": [
            {
                "Size": 10
            },
            {
                "Category": "cloud",
                "Size": 10
            }
        ]
      }
    }
}