資源(Resources)用于描述資源棧中每個資源的屬性和資源之間的依賴關系。一個資源可以被其他資源引用,也可以在輸出(Outputs)中被引用。
資源實體類型
資源實體類型分為普通資源和數據源資源,普通資源可進一步分為阿里云資源和自定義資源,具體如下表所示。
資源實體類型 | 說明 |
普通資源(Resource) |
|
數據源資源(DataSource) | 用于查詢云服務資源數據。 更多信息,請參見數據源資源。 |
語法
Resources由資源ID和資源描述組成。資源描述用大括號({ })括起。如果聲明多個資源,用半角逗號(,)分隔開。Resources的語法結構示例代碼段如下:
Resources:
資源1 Name:
Type: 資源類型
Condition: 是否創建此資源的條件
Properties: 資源屬性描述
資源2 Name:
Type: 資源類型
Condition: 是否創建此資源的條件
Properties: 資源屬性描述
參數說明如下:
資源Name在模板中具有唯一性。在創建模板其他部分時,可以通過資源Name引用該資源。
資源類型(Type)表示正在聲明的資源的類型。例如:ALIYUN::ECS::Instance表示阿里云ECS實例。關于ROS支持的所有資源類型列表和詳細信息,請參見資源類型索引。
資源屬性(Properties)是為資源指定的附加選項。例如:必須為每個阿里云ECS實例指定一個Image ID。
示例
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
如果資源不需要聲明任何屬性,可以忽略該資源的屬性部分。
屬性值可以是文本字符串、字符串列表、布爾值、引用參數或者函數返回值。 當您編寫JSON模板時,請參見以下規則。
如果屬性值為文本字符串,該值會被雙引號(" ")括起來。
如果屬性值為任一類型的字符串列表,則會被方括號([ ])括起來。
如果屬性值為內部函數或引用的參數,則會被大括號({ })括起來。
當您將文字、列表、引用參數和函數返回值合并起來取值時,上述規則也適用。聲明不同的屬性值類型示例如下:
{
"Properties": {
"String": "string",
"LiteralList": [
"value1",
"value2"
],
"Boolean": true,
"ReferenceForOneValue": {
"Ref": "ResourceID"
},
"FunctionResultWithFunctionParams": {
"Fn::Join": [
"%",
[
"Key=",
{
"Ref": "SomeParameter"
}
]
]
}
}
}
DeletionPolicy
當您需要你移除資源時,會面臨兩種情況:
當DeletionPolicy取值為Delete時,在從資源棧移除資源的同時,刪除資源本身。
當DeletionPolicy取值為Retain時,在從資源棧移除資源的同時,保留資源本身。
例如:設置在資源棧刪除時保留ECS實例,可按照以下代碼段進行聲明:
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
DeletionPolicy: Retain
在本示例中,如果該模板對應的資源棧被刪除,則會保留ECSInstance資源。
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的值判斷否創建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
后,ROS會對模板進行預處理,把該資源展開成多個資源。 操作資源棧時使用處理后的模板。
例如:資源名為
A
,其Count
值為3。在處理后的模板中,沒有A
資源,取而代之的是A[0]
、A[1]
和A[2]
這3個資源。Resources: A: Count: 3 ...
處理后:
Resources: A[0]: ... A[1]: ... A[2]: ...
重要如果展開后的資源的名稱在原模板中已存在,比如
A[1]
在原模板中已經定義,則預處理失敗,校驗不通過。請避免向已有資源添加
Count
屬性,因為這會導致資源名發生變化,引發刪除操作。Count
最終結果必須為自然數,僅支持如下函數:處理后的模板資源總數需要符合限制,目前最多支持300個。
指定了
Count
的資源的屬性(Properties
)中可以使用偽參數ALIYUN::Index
,在預處理的時候會被替換為相應的數值。例如,A[0]
使用的ALIYUN::Index
會被替換為0,A[1]
使用的ALIYUN::Index
會被替換為1。模板其他地方不能使用ALIYUN::Index
。如果指定了
Count
的資源出現在DependsOn
中,會被展開。DependsOn: A
處理后:
DependsOn: - A[0] - A[1] - A[2]
如果指定了
Count
的資源出現在函數Ref
、Fn::GetAtt
中,會被展開。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
聯合使用。Fn::Select: - Ref: ALIYUN::Index - Ref: A
以
A
為例,B
引用了A
,且B
的Count
為2,轉換后B[0]
、B[1]
中部分表達式分別如下:- Ref: A[0] - Ref: A[1]
如果資源指定了
Count
屬性,則DependsOn
屬性也支持表達式。DependsOn
屬性的表達式可以使用的函數與Count
屬性一致,可以使用ALIYUN::Index
偽參數。表達式的格式與允許的計算結果如下表所示。格式
示例
允許的計算結果
字典。
Fn::Split: - ',' - Server1,Server2
null。
如果為null值,則會移除DependsOn屬性。
字符串。
如果是空字符串,則會移除DependsOn屬性。
如果是非空字符串,則必須是有效的資源名稱。
列表。
如果列表項為null或空字符串,則丟棄該列表項。
如果列表為空,則會移除DependsOn屬性。
如果列表不為空,則每一項必須是字符串,且為有效的資源名稱。
列表。
- Server0 - Fn::Split: - ',' - Server1,Server2
列表項可以是字典或字符串,不同列表項允許的計算結果不同,具體如下:
如果列表項為字典,則會進行表達式計算,允許的計算結果如下:
如果為null值或空字符串,則丟棄該項。
否則,必須是字符串,且為有效的資源名稱。
如果列表項為字符串,則必須是有效的資源名稱。
說明如果列表為空,則會移除DependsOn屬性。
字符串。
Server0
字符串。
不會進行額外的處理。
如下示例模板用于控制Count資源單并發數。參數Count表示要創建的資源的數量,參數ParallelCount代表最大并發創建數。
ROSTemplateFormatVersion: '2015-09-01' Parameters: Count: Type: Number ParallelCount: Type: Number Resources: WaitConditionHandle: Type: ALIYUN::ROS::WaitConditionHandle Count: Ref: Count DependsOn: Fn::Select: - Fn::Calculate: - 1-{0}//{1} - 0 - - Fn::Min: - Ref: ALIYUN::Index - Ref: ParallelCount - Ref: ParallelCount - - Fn::Replace: - index: Fn::Calculate: - '{0}-{1}' - 0 - - Ref: ALIYUN::Index - Ref: ParallelCount - WaitConditionHandle[index]
當Count和ParallelCount取值不同時,處理后的模板也有差異,具體如下:
若設置Count為3,ParallelCount為1,則處理后的模板為:
ROSTemplateFormatVersion: '2015-09-01' Resources: WaitConditionHandle[0]: Type: ALIYUN::ROS::WaitConditionHandle WaitConditionHandle[1]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[0] WaitConditionHandle[2]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[1] Parameters: Count: Type: Number ParallelCount: Type: Number
若設置Count為5,ParallelCount為2,則處理后的模板為:
ROSTemplateFormatVersion: '2015-09-01' Resources: WaitConditionHandle[0]: Type: ALIYUN::ROS::WaitConditionHandle WaitConditionHandle[1]: Type: ALIYUN::ROS::WaitConditionHandle WaitConditionHandle[2]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[0] WaitConditionHandle[3]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[1] WaitConditionHandle[4]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[2] Parameters: Count: Type: Number ParallelCount: Type: Number
若設置Count為5,ParallelCount為3,則處理后的模板為:
ROSTemplateFormatVersion: '2015-09-01' Resources: WaitConditionHandle[0]: Type: ALIYUN::ROS::WaitConditionHandle WaitConditionHandle[1]: Type: ALIYUN::ROS::WaitConditionHandle WaitConditionHandle[2]: Type: ALIYUN::ROS::WaitConditionHandle WaitConditionHandle[3]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[0] WaitConditionHandle[4]: Type: ALIYUN::ROS::WaitConditionHandle DependsOn: WaitConditionHandle[1] Parameters: Count: Type: Number ParallelCount: Type: Number
Count的示例模板如下。示例模板中創建了一組EIP和同等數量的ECS,并把EIP與ECS逐一綁定。
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
...: Null
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
...: Null
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
資源聲明示例
典型的資源聲明示例如下:
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