資源(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
最終結果必須為自然數,僅支援如下函數:函數(Functions)(僅引用參數)
處理後的模板資源總數需要符合限制,目前最多支援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屬性。
字串。
如果是Null 字元串,則會移除DependsOn屬性。
如果是非Null 字元串,則必須是有效資源名稱。
列表。
如果清單項目為null或Null 字元串,則丟棄該清單項目。
如果列表為空白,則會移除DependsOn屬性。
如果列表不為空白,則每一項必須是字串,且為有效資源名稱。
列表。
- Server0 - Fn::Split: - ',' - Server1,Server2
清單項目可以是字典或字串,不同清單項目允許的計算結果不同,具體如下:
如果清單項目為字典,則會進行運算式計算,允許的計算結果如下:
如果為null值或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