A seção Resources descreve as propriedades de cada recurso em uma pilha e as dependências entre eles. Você pode referenciar um recurso a partir de outros recursos ou na seção Outputs.
Tipos de entidade de recurso
As entidades de recurso classificam-se como recursos regulares e recursos de fonte de dados. Os recursos regulares dividem-se em recursos da Alibaba Cloud e recursos personalizados, conforme mostra a tabela a seguir.
Tipo de entidade de recurso | Descrição |
Recurso regular (Resource) |
|
Recurso de fonte de dados (DataSource) | Consulta os dados de recurso de um serviço da Alibaba Cloud. Para mais informações, consulte Recursos de fonte de dados. |
Sintaxe
A seção Resources consiste em um ID de recurso e uma descrição do recurso. A descrição do recurso fica entre chaves ({}). Ao declarar vários recursos, separe-os por vírgulas (,). O trecho de código a seguir apresenta a estrutura sintática da seção Resources:
Resources:
Resource1 Name:
Type: Resource type
Condition: Condition for creating this resource
Properties: Resource property description
Resource2 Name:
Type: Resource type
Condition: Condition for creating this resource
Properties: Resource property description
Os parâmetros têm a seguinte descrição:
O nome do recurso deve ser exclusivo no modelo. Use esse nome para referenciar o recurso em outras partes do modelo.
O tipo de recurso (Type) indica qual tipo você declara. Por exemplo, ALIYUN::ECS::Instance representa uma instância ECS da Alibaba Cloud. Para obter a lista completa de tipos de recurso compatíveis com o ROS, consulte Índice de tipos de recurso.
As propriedades do recurso (Properties) são opções adicionais que você especifica para ele. Por exemplo, defina um Image ID para cada instância ECS da Alibaba Cloud.
Exemplo
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
Se um recurso não exigir propriedades, omita a seção Properties correspondente.
Um valor de propriedade pode ser uma string de texto, uma lista de strings, um valor booleano, um parâmetro referenciado ou o retorno de uma função. Ao escrever um modelo JSON, siga estas regras:
Se o valor da propriedade for uma string de texto, coloque-o entre aspas duplas (" ").
Para valores que representam uma lista de strings, use colchetes ([]).
Quando o valor for uma função intrínseca ou um parâmetro referenciado, envolva-o em chaves ({}).
Essas regras também se aplicam ao combinar texto, listas, parâmetros referenciados e retornos de funções. O exemplo abaixo ilustra como declarar diferentes tipos de valores de propriedade:
{
"Properties": {
"String": "string",
"LiteralList": [
"value1",
"value2"
],
"Boolean": true,
"ReferenceForOneValue": {
"Ref": "ResourceID"
},
"FunctionResultWithFunctionParams": {
"Fn::Join": [
"%",
[
"Key=",
{
"Ref": "SomeParameter"
}
]
]
}
}
}
DeletionPolicy
Ao remover um recurso, dois cenários são possíveis:
Se DeletionPolicy estiver definido como Delete, o próprio recurso será excluído quando removido da pilha.
Caso DeletionPolicy esteja configurado como Retain, o recurso permanecerá mesmo após a remoção da pilha.
Por exemplo, para preservar uma instância ECS quando a pilha for excluída, declare a política conforme o trecho de código a seguir:
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
DeletionPolicy: Retain
Neste exemplo, se a pilha associada a este modelo for excluída, o recurso ECSInstance permanecerá preservado.
Se um recurso tiver DeletionPolicy configurado e você chamar a operação DeleteStack incluindo esse recurso no parâmetro RetainResources, aplicam-se os seguintes princípios:
Quando o Recurso A possui DeletionPolicy=Delete no modelo, sua retenção depende da inclusão dele em RetainResources durante a exclusão da pilha.
Se o Recurso A tiver DeletionPolicy=Retain no modelo, ele sempre permanecerá na exclusão da pilha, independentemente de estar listado em RetainResources.
DependsOn
Em um modelo, utilize o atributo DependsOn para garantir que um recurso seja criado somente após a criação de outro recurso específico. Ao aplicar o atributo DependsOn a um recurso, ele não será provisionado até que o recurso referenciado por DependsOn esteja totalmente pronto.
O recurso do qual DependsOn depende pode ter seu Condition avaliado como False. Um valor False não impede a criação do recurso dependente.
Os exemplos a seguir mostram duas formas de usar esse atributo:
-
Dependência de um único recurso:
DependsOn: ResourceName -
Dependência de vários recursos:
DependsOn: - ResourceName1 - ResourceName2
Conforme ilustrado no trecho de código abaixo, o WebServer é criado apenas depois que o DatabaseServer for criado com sucesso:
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
No modelo, use o atributo Condition para determinar se um recurso deve ser criado. A criação ocorre apenas se o valor da condição especificado por Condition for True.
No trecho de código a seguir, a criação do WebServer depende do valor de MaxAmount:
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
Ao especificar Count para um recurso no modelo, o ROS pré-processa o modelo e expande esse recurso em vários recursos. O modelo processado é então utilizado nas operações da pilha.
-
Por exemplo, se um recurso chamado
Ativer o valor deCountigual a 3, o modelo processado não conterá o recursoA. Em vez disso, haverá três recursos:A[0],A[1]eA[2].Resources: A: Count: 3 ...Após o processamento:
Resources: A[0]: ... A[1]: ... A[2]: ...ImportanteSe o nome de um recurso expandido, como
A[1], já existir no modelo original, o pré-processamento falhará e o modelo não passará na validação.Evite adicionar o atributo
Counta recursos existentes. Isso altera o nome do recurso e aciona uma operação de exclusão. -
O resultado final de
Countdeve ser um número natural. Apenas as seguintes funções são suportadas: O número total de recursos no modelo processado não deve exceder o limite, que atualmente é de 300.
Nas
Propertiesde um recurso comCountespecificado, use o pseudoparâmetroALIYUN::Index. Durante o pré-processamento, esse parâmetro é substituído pelo número correspondente. Por exemplo, oALIYUN::Indexusado porA[0]torna-se 0, e oALIYUN::Indexusado porA[1]torna-se 1. Não é possível usarALIYUN::Indexem outras partes do modelo.-
Caso um recurso com
Countespecificado apareça emDependsOn, ele será expandido.DependsOn: AApós o processamento:
DependsOn: - A[0] - A[1] - A[2] -
Se um recurso com
Countespecificado aparecer na funçãoRefouFn::GetAtt, ele será expandido.Ref: A Fn::GetAtt: - A - PropertyNameApós o processamento:
- Ref: A[0] - Ref: A[1] - Ref: A[2] - Fn::GetAtt: - A[0] - PropertyName - Fn::GetAtt: - A[1] - PropertyName - Fn::GetAtt: - A[2] - PropertyNameQuando vários recursos usam
Counte possuem relações de referência, combine-os comFn::SelecteALIYUN::Index.Fn::Select: - Ref: ALIYUN::Index - Ref: ATome
Acomo exemplo.BreferenciaA, e oCountdeBé 2. Após a transformação, partes das expressões emB[0]eB[1]ficam assim:- Ref: A[0] - Ref: A[1] -
Se um recurso possuir o atributo
Count, o atributoDependsOntambém aceitará expressões. As funções permitidas na expressão deDependsOnsão as mesmas do atributoCount, sendo possível usar também o pseudoparâmetroALIYUN::Index. A tabela a seguir descreve o formato da expressão e os resultados de cálculo permitidos.Formato
Exemplo
Resultado de cálculo permitido
Dicionário
Fn::Split: - ',' - Server1,Server2null
Se o valor for null, o atributo DependsOn será removido.
String
Valores de string vazia resultam na remoção do atributo DependsOn.
Strings não vazias devem corresponder a um nome de recurso válido.
Lista
Itens de lista nulos ou strings vazias são descartados.
Listas vazias causam a remoção do atributo DependsOn.
Em listas não vazias, cada item deve ser uma string e um nome de recurso válido.
Lista
- Server0 - Fn::Split: - ',' - Server1,Server2Um item da lista pode ser um dicionário ou uma string. Os resultados de cálculo permitidos variam conforme o tipo do item:
Para itens de lista do tipo dicionário, a expressão é calculada. Os resultados permitidos são:
Valores null ou strings vazias resultam no descarte do item.
Caso contrário, deve ser uma string e um nome de recurso válido.
Itens de lista do tipo string devem ser nomes de recursos válidos.
NotaSe a lista estiver vazia, o atributo DependsOn será removido.
String
Server0String
Nenhum processamento adicional é realizado.
O modelo de exemplo a seguir controla a concorrência para recursos criados com Count. O parâmetro Count define a quantidade de recursos a serem criados, enquanto ParallelCount estabelece o número máximo de criações simultâneas.
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]O modelo processado varia conforme os valores de Count e ParallelCount:
-
Definindo Count como 3 e ParallelCount como 1, o modelo processado será:
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 -
Com Count igual a 5 e ParallelCount igual a 2, o resultado do processamento é:
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 -
Para Count definido como 5 e ParallelCount como 3, o modelo processado fica assim:
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
Abaixo está um modelo de exemplo para Count. Ele cria um grupo de EIPs e uma quantidade equivalente de instâncias ECS, vinculando cada EIP a uma instância 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
Após o processamento:
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
Exemplo de declaração de recurso
Veja a seguir um exemplo típico de declaração de recurso:
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