La section Resources décrit les propriétés de chaque ressource d'une pile ainsi que les dépendances entre elles. Vous pouvez référencer une ressource depuis d'autres ressources ou dans la section Outputs.
Types d'entités de ressource
Les entités de ressource se divisent en ressources standard et ressources de source de données. Les ressources standard se subdivisent en ressources Alibaba Cloud et ressources personnalisées, comme l'indique le tableau suivant.
Type d'entité de ressource | Description |
Ressource standard (Resource) |
|
Ressource de source de données (DataSource) | Interroge les données de ressource d'un service Alibaba Cloud. Pour plus d'informations, consultez Ressources de source de données. |
Syntaxe
La section Resources comprend un ID de ressource et une description de ressource. La description de ressource est entourée d'accolades ({}). Si vous déclarez plusieurs ressources, séparez-les par des virgules (,). L'extrait de code suivant illustre la structure syntaxique de la section 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
Les paramètres sont décrits ci-après :
Le nom de la ressource doit être unique au sein du modèle. Utilisez ce nom pour référencer la ressource dans d'autres parties du modèle.
Le type de ressource (Type) indique la catégorie de ressource que vous déclarez. Par exemple, ALIYUN::ECS::Instance représente une instance ECS Alibaba Cloud. Pour obtenir la liste complète des types de ressources pris en charge par ROS, consultez Index des types de ressources.
Les propriétés de ressource (Properties) correspondent aux options supplémentaires que vous spécifiez pour une ressource. Par exemple, vous devez spécifier un ID d'image pour chaque instance ECS Alibaba Cloud.
Exemple
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
Si une ressource ne nécessite aucune propriété, omettez la section Properties pour cette ressource.
Une valeur de propriété peut être une chaîne de texte, une liste de chaînes, une valeur booléenne, un paramètre référencé ou une valeur de retour de fonction. Lorsque vous rédigez un modèle JSON, respectez les règles suivantes.
Si la valeur de propriété est une chaîne de texte, encadrez-la de guillemets doubles (" ").
Si la valeur de propriété est une liste de chaînes, encadrez la liste de crochets ([]).
Si la valeur de propriété est une fonction intrinsèque ou un paramètre référencé, encadrez-la d'accolades ({}).
Ces règles s'appliquent également lorsque vous combinez du texte, des listes, des paramètres référencés et des valeurs de retour de fonction. L'exemple suivant montre comment déclarer différents types de valeurs de propriété :
{
"Properties": {
"String": "string",
"LiteralList": [
"value1",
"value2"
],
"Boolean": true,
"ReferenceForOneValue": {
"Ref": "ResourceID"
},
"FunctionResultWithFunctionParams": {
"Fn::Join": [
"%",
[
"Key=",
{
"Ref": "SomeParameter"
}
]
]
}
}
}
DeletionPolicy
Lorsque vous supprimez une ressource, deux scénarios sont possibles :
Si vous définissez DeletionPolicy sur Delete, la ressource elle-même est supprimée lorsqu'elle est retirée de la pile.
Si vous définissez DeletionPolicy sur Retain, la ressource est conservée lorsqu'elle est retirée de la pile.
Par exemple, pour conserver une instance ECS lors de la suppression de la pile, déclarez la politique comme indiqué dans l'extrait de code suivant :
Resources:
ECSInstance:
Type: ALIYUN::ECS::Instance
Properties:
ImageId: m-25l0r****
DeletionPolicy: Retain
Dans cet exemple, si la pile correspondant à ce modèle est supprimée, la ressource ECSInstance est conservée.
Si une ressource dispose d'une configuration DeletionPolicy et que vous appelez l'opération DeleteStack en incluant la ressource dans le paramètre RetainResources, les principes suivants s'appliquent :
Si la ressource A possède DeletionPolicy=Delete dans le modèle, sa conservation dépend de son inclusion ou non dans RetainResources lors de la suppression de la pile.
Si la ressource A possède DeletionPolicy=Retain dans le modèle, elle est toujours conservée lors de la suppression de la pile, qu'elle soit incluse ou non dans RetainResources.
DependsOn
Dans un modèle, utilisez l'attribut DependsOn pour garantir qu'une ressource n'est créée qu'après la création d'une autre ressource spécifiée. Lorsque vous appliquez l'attribut DependsOn à une ressource, celle-ci n'est créée qu'une fois la ressource référencée par DependsOn entièrement provisionnée.
La ressource dont dépend DependsOn peut voir son Condition évalué à False. Une valeur False n'affecte pas la création de la ressource dépendante.
Les exemples suivants présentent deux façons d'utiliser cet attribut :
-
Dépendance envers une seule ressource :
DependsOn: ResourceName -
Dépendance envers plusieurs ressources :
DependsOn: - ResourceName1 - ResourceName2
Comme l'illustre l'extrait de code suivant, WebServer est créé uniquement après la création réussie de 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
Dans un modèle, utilisez l'attribut Condition pour spécifier si une ressource doit être créée. La ressource est créée uniquement si la valeur de condition spécifiée par Condition est True.
Comme l'illustre l'extrait de code suivant, la création de WebServer dépend de la valeur 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
Dans un modèle, après avoir spécifié Count pour une ressource, ROS prétraite le modèle et développe la ressource en plusieurs instances. Le modèle traité est ensuite utilisé lors des opérations sur la pile.
-
Par exemple, si une ressource est nommée
Aet que sa valeurCountest 3, le modèle traité ne contiendra pas la ressourceA. Il contiendra plutôt trois ressources :A[0],A[1]etA[2].Resources: A: Count: 3 ...Après traitement :
Resources: A[0]: ... A[1]: ... A[2]: ...ImportantSi le nom d'une ressource développée, tel que
A[1], existe déjà dans le modèle original, le prétraitement échoue et le modèle ne passe pas la validation.Évitez d'ajouter l'attribut
Countà des ressources existantes. Cela modifie le nom de la ressource et déclenche une opération de suppression. -
Le résultat final de
Countdoit être un nombre naturel. Seules les fonctions suivantes sont prises en charge :Ref (référence uniquement les paramètres)
Le nombre total de ressources dans le modèle traité ne doit pas dépasser la limite, qui est actuellement de 300.
Dans les
Propertiesd'une ressource avecCountspécifié, vous pouvez utiliser le pseudo-paramètreALIYUN::Index. Lors du prétraitement, ce paramètre est remplacé par le numéro correspondant. Par exemple, leALIYUN::Indexutilisé parA[0]est remplacé par 0, et leALIYUN::Indexutilisé parA[1]est remplacé par 1. Vous ne pouvez pas utiliserALIYUN::Indexailleurs dans le modèle.-
Si une ressource avec
Countspécifié apparaît dansDependsOn, elle est développée.DependsOn: AAprès traitement :
DependsOn: - A[0] - A[1] - A[2] -
Si une ressource avec
Countspécifié apparaît dans la fonctionRefouFn::GetAtt, elle est développée.Ref: A Fn::GetAtt: - A - PropertyNameAprès traitement :
- Ref: A[0] - Ref: A[1] - Ref: A[2] - Fn::GetAtt: - A[0] - PropertyName - Fn::GetAtt: - A[1] - PropertyName - Fn::GetAtt: - A[2] - PropertyNameSi plusieurs ressources utilisent
Countet ont des relations de référence, vous pouvez les utiliser avecFn::SelectetALIYUN::Index.Fn::Select: - Ref: ALIYUN::Index - Ref: APrenons
Acomme exemple.BréférenceA, et leCountpourBest 2. Après transformation, certaines parties des expressions dansB[0]etB[1]sont les suivantes :- Ref: A[0] - Ref: A[1] -
Si une ressource possède l'attribut
Count, l'attributDependsOnprend également en charge les expressions. Les fonctions utilisables dans l'expressionDependsOnsont les mêmes que celles de l'attributCount, et vous pouvez utiliser le pseudo-paramètreALIYUN::Index. Le tableau suivant décrit le format de l'expression et les résultats de calcul autorisés.Format
Exemple
Résultat de calcul autorisé
Dictionnaire
Fn::Split: - ',' - Server1,Server2null
Si la valeur est null, l'attribut DependsOn est supprimé.
Chaîne
Si la valeur est une chaîne vide, l'attribut DependsOn est supprimé.
Si la valeur est une chaîne non vide, elle doit correspondre à un nom de ressource valide.
Liste
Si un élément de liste est null ou une chaîne vide, l'élément est ignoré.
Si la liste est vide, l'attribut DependsOn est supprimé.
Si la liste n'est pas vide, chaque élément doit être une chaîne et un nom de ressource valide.
Liste
- Server0 - Fn::Split: - ',' - Server1,Server2Un élément de liste peut être un dictionnaire ou une chaîne. Les résultats de calcul autorisés varient selon le type d'élément :
Si l'élément de liste est un dictionnaire, l'expression est calculée. Les résultats de calcul autorisés sont les suivants :
Si la valeur est null ou une chaîne vide, l'élément est ignoré.
Sinon, elle doit être une chaîne et un nom de ressource valide.
Si l'élément de liste est une chaîne, il doit s'agir d'un nom de ressource valide.
RemarqueSi la liste est vide, l'attribut DependsOn est supprimé.
Chaîne
Server0Chaîne
Aucun traitement supplémentaire n'est effectué.
Le modèle d'exemple suivant contrôle la concurrence pour les ressources créées avec Count. Le paramètre Count spécifie le nombre de ressources à créer, et le paramètre ParallelCount spécifie le nombre maximal de créations simultanées.
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]Le modèle traité varie selon les valeurs de Count et ParallelCount :
-
Si vous définissez Count sur 3 et ParallelCount sur 1, le modèle traité est le suivant :
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 -
Si vous définissez Count sur 5 et ParallelCount sur 2, le modèle traité est le suivant :
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 -
Si vous définissez Count sur 5 et ParallelCount sur 3, le modèle traité est le suivant :
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
Voici un exemple de modèle pour Count. Le modèle crée un groupe d'EIP et un nombre égal d'instances ECS, puis associe chaque EIP à une instance 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
Après traitement :
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
Exemple de déclaration de ressource
Voici un exemple typique de déclaration de ressource :
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