In the Resources section, you can define the properties of each resource that is contained in a stack and the dependencies between resources. A resource can be referenced by other resources and output items. This topic describes the information about the Resources section.
Resource types
Resource types are classified into regular resources and data source resources. Regular resources can be further classified into Alibaba Cloud resources and custom resources. The following table describes the resource types.
Resource type | Description |
---|---|
Regular resource (Resource) |
|
Data source resource (DataSource) | You can use data source resources to query the resource data of Alibaba Cloud services. For more information, see Data source resources. |
Syntax
A resource consists of an ID and a description. All resource descriptions must be enclosed in braces ({ }). If you declare multiple resources, you must separate the resources by commas (,). The following sample code provides an example on the syntax of the Resources section:
Resources:
ID of Resource 1:
Type: the resource type.
Condition: the condition based on which the resource is created.
Properties: the descriptions of resource properties.
ID of Resource 2:
Type: the resource type.
Condition: the condition based on which the resource is created.
Properties: the descriptions of resource properties.
Fields in the Resources section: - A resource ID must be unique in a template. You can use the resource ID to reference the resource in other sections of a template.
- Type: the type of the resource that you declare. For example, if you set Type to ALIYUN::ECS::Instance, the resource that you declare is an Elastic Compute Service (ECS) instance. For more information about resource types that are supported by Resource Orchestration Service (ROS), see List of resource types by service.
- Properties: the additional options that you specify for the resource. For example, you must specify an image ID for each ECS instance. In this case, the image ID is a resource property.
Example:
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
If you do not need to declare properties for a resource, leave Properties empty.
- Text strings must be enclosed in double quotation marks (" ").
- String lists must be enclosed in brackets ([ ]).
- Referenced parameters or return values of built-in functions must be enclosed in braces ({ }).
The following sample code provides an example on how to declare different types of property values:
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
In the preceding example, the system retains the resource ECSInstance when the stack that is created based on the template is deleted.
DependsOn
You can specify the DependsOn property in a template to create a specific resource only after its dependent resource is created. If you specify the DependsOn property for a resource, the system creates the resource only after its dependent resources specified in the DependsOn property are created.
- Configure a single dependent resource.
DependsOn: ResourceName
- Configure multiple dependent resources.
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
You can specify the Condition property in a template to determine whether to create a resource. The system can create the resource only when the condition that you specify for the Condition property is met.
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
property for a resource in a template to preprocess the template and replace the resource with multiplied resources. When you use a template for which the Count property is specified to perform operations on a stack, the systems uses the processed template. - For example, you set the
Count
property of ResourceA
to 3 in the original template. After ROS preprocesses the template, ResourceA
is replaced with the following multiplied resources: ResourcesA[0]
,A[1]
, andA[2]
. The following sample code provides an example on the original template:Resources: A: Count: 3 ...: Null ...: Null
The following sample code provides an example on the processed template:
Resources: A[0]: ...: Null A[1]: ...: Null A[2]: ...: Null ...: Null
Important If the name of a multiplied resource, such asA[1]
, is the same as the name of an existing resource that is defined in the original template, the template fails to be preprocessed and validated.If you specify Count for a resource, the resource name is changed. We recommend that you do not add the
Count
property to existing resources to prevent deletion of the resources. - The value of the
Count
property must be a natural number. The property value supports only the following functions. You can invoke only the Ref function in Count to reference parameters. - The maximum number of resources in a processed template cannot exceed 300.
- You can specify the
ALIYUN::Index
pseudo parameter inProperties
of a resource for which theCount
property is specified. When the system preprocesses the template, the system replaces ALIYUN::Index with the values that correspond to expanded resources. For example, the system replacesALIYUN::Index
that is applied toA[0]
with 0 and replacesALIYUN::Index
that is applied toA[1]
with 1. You can useALIYUN::Index
only in Properties of a template. - If you specify
Count
for a resource and specify the resource inDependsOn
, the resource is replaced with multiplied resources. The following sample code provides an example on the original template:DependsOn: A
The following sample code provides an example on the processed template:
DependsOn: - A[0] - A[1] - A[2]
- If you specify
Count
for a resource and specify the resource inRef
andFn::GetAtt
, the resource is replaced with multiplied resources. The following sample code provides an example on the original template:Ref: A Fn::GetAtt: - A - PropertyName
The following sample code provides an example on the processed template:
- Ref: A[0] - Ref: A[1] - Ref: A[2] - Fn::GetAtt: - A[0] - PropertyName - Fn::GetAtt: - A[1] - PropertyName - Fn::GetAtt: - A[2] - PropertyName
If you specify the
Count
property for multiple resources and the resources are referenced by each other, we recommend that you use Count together withFn::Select
andALIYUN::Index
.Fn::Select: - Ref: ALIYUN::Index - Ref: A
In this example, Resource
A
is used. You reference ResourceA
in ResourceB
, and set theCount
property of ResourceB
to 2. The following sample code provides an example on a part of the expressions of ResourcesB[0]
andB[1]
after the template is processed:- Ref: A[0] - Ref: A[1]
- If you specify the
Count
property for a resource, theDependsOn
property also supports expressions. The functions that are supported by the expressions of theDependsOn
property are the same as the functions that are supported by the expressions of theCount
property. Both properties also support theALIYUN::Index
pseudo parameter. The following table describes the formats and the calculation results of the expressions.Format Example Calculation result Dictionary Fn::Split: - ',' - Server1,Server2
null. If the calculation result is null, the system removes the DependsOn property.
A string. - If the calculation result is an empty string, the system removes the DependsOn property.
- If the calculation result is not an empty string, the calculation result must be a valid resource name.
A list. - If the items in the list are null or empty strings, the system removes the items.
- If the list is empty, the system removes the DependsOn property.
- If the list is not empty, each item in the list must be a string and a valid resource name.
List - Server0 - Fn::Split: - ',' - Server1,Server2
The items in a list can be dictionaries or strings. Calculation results vary based on the item types. The following information describes the differences: - If the items are dictionaries, the system calculates the expressions and returns the following calculation results:
- If the items are null or empty strings, the system removes the items.
- If the items are not null or empty strings, the items must be strings and valid resource names.
- If the items are strings, the items must be valid resource names.
Note If the list is empty, the system removes the DependsOn property.String Server0
A string. The system does not process a string.
The following template shows how to specify Count to control the number of resources that can be created, and specify ParallelCount to control the maximum number of resources that can be created at a time.
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]
The processed templates that the system generates vary based on the values that you specify for Count and ParallelCount.
- If you set Count to 3 and ParallelCount to 1, the system generates the following processed template:
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
- If you set Count to 5 and ParallelCount to 2, the system generates the following processed template:
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
- If you set Count to 5 and ParallelCount to 3, the system generates the following processed template:
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
The following sample code provides an example on how to specify the Count property in the original template. In this template, a group of Elastic IP addresses (EIPs) and ECS instances are created, and each EIP is bound to an ECS instance. The same number of EIPs and ECS instances are created.
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
The following sample code provides an example on the processed template:
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
Resource declaration example
The following example shows how to declare resources:
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