このトピックでは、各リソースのプロパティおよびスタック内のリソースの依存関係について説明します。 リソースは、他のリソースおよび出力項目から参照できます。
構文
各リソースは、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
"Resources" : {
"ECSInstance" : {
"Type" : "ALIYUN::ECS::Instance",
"Properties" : {
"ImageId" : "m-25l0r****"
},
"DeletionPolicy" : "Retain"
}
}
この例では、テンプレートをもとに作成されたスタックが削除されても ECS インスタンスは保持されます。
DependsOn
DependsOn パラメーターを使うことで、あるリソースの依存リソースを作成した後に、そのリソースを作成できます。 リソースに DependsOn パラメーターを指定すると、DependsOn パラメーターで指定された依存リソースの作成後に、そのリソースが作成されます。
- 単一の依存リソースを構成します。
"DependsOn": "ResourceName"
- 複数の依存リソースを構成します。
"DependsOn": [ "ResourceName1", "ResourceName2" ]
{
"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 に設定されている場合にのみ作成できます。
{
"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
パラメーターを使うことで、リソースのテンプレートを前処理し、そのリソースを複数リソースに拡張できます。 前処理されたテンプレートは、スタックの管理に使用されます。
- 以下の例では、リソース
A
のCount
パラメーターが 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::Select
やALIYUN::Index
と Count を組み合わせて使用してください。 例:{ "Fn::Select": [ { "Ref": "ALIYUN::Index" }, { "Ref": "A" } ] }
この
A
のリソースの例では、B
はA
を参照しており、B
のCount
パラメータは 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
}
]
}
}
}