
# 在IaC代码中声明资源
定义component是IaC将一个环境的资源组织起来的方式，我们可以把同一类资源组织起来成为一个component。所有被IaC定义的资源必须属于某一个component。一个component下可以定义多个资源，所有的资源描述都存放于resources.yaml中，资源的type和name构成资源的唯一标记，以列表的形式存在。
#### component定义
定义component是IaC将一个环境的资源组织起来的方式，我们可以把同一类资源组织起来成为一个component。所有被IaC定义的资源必须属于某一个component。在以下样例中，IaC代码定义了WiseEyeChaosMonkeyMgrService和WiseEyeChaosMonkeyPortal两个component。
```
├── global/
       │    ├── meta.yaml
       │    ├── WiseEyeChaosMonkeyMgrService/...
       │    └── WiseEyeChaosMonkeyPortal/...
```
#### 资源定义
一个component下可以定义多个资源，所有的资源描述都存放于resources.yaml中，资源的type和name构成资源的唯一标记，以列表的形式存在。
在以下样例中，WiseEyeChaosMonkeyPortal下的resources.yaml中定义了该组件下的全量资源。
图1资源定义   
![](https://support.huaweicloud.com/devg-appstage/zh-cn_image_0000001912674633.png)
表1resources.yaml字段说明 
| 字段         | 含义                                                                                                       |
|:---|:---|
| name       | 微服务平台显示的资源名称，最大长度为16字符。                                                                                  |
| type       | 资源类型。支持配置管理、NUWA Container及SLB。                                                                          |
| properties | 属性值，包含资源的详细参数。详细参数介绍请参见[IaC资源参数介绍](https://support.huaweicloud.com/devg-appstage/appstage_06_0076.html)。 |
   
如果资源文件过大可以通过引用的方式对文件进行拆分及复用如图，我们可以把配置的定义放在config/business_config.yaml文件下。
图2resources.yaml文件拆分   
![](https://support.huaweicloud.com/devg-appstage/zh-cn_image_0000001866600554.png)
business_config.yaml文件可以复用：
图3business_config.yaml文件复用   
![](https://support.huaweicloud.com/devg-appstage/zh-cn_image_0000001912640869.png)
#### component内部资源编排
component内部允许同一个资源出现多次，这表示同一个资源的不同变更阶段，这一场景下该资源的所有节点必须声明alias字段并且alias取值必须在component内全局唯一，同一个资源的所有alias之间必须显式地在dependsOn字段中声明串行依赖。
component的resources属性中描述资源列表，通过设置资源的dependsOn属性描述对其他资源的依赖。
dependsOn是列表类型，每个元素使用type、name、alias等字段描述对其他资源的引用，其中name字段是必填字段，type、alias是可选字段；component解析某资源的dependsOn时，会根据元素属性从相同component中搜索满足条件的资源作为当前资源的依赖。
部分资源之间已经有隐式引用关系，系统自动添加dependsOn，不需要再显式声明。每种类型的哪些属性隐含引用关系，可以参考其文档，具体请参见[IaC资源参数介绍](https://support.huaweicloud.com/devg-appstage/appstage_06_0076.html)。
资源不能有循环依赖（A dependsOn B,B dependsOn C,C dependsOn A），不能依赖自己。
以下示例定义了两个资源，一个名为chaosmonkey-elb的ELB，一个名为chaosmonkey-slb的SLB；chaosmonkey-slb依赖于chaosmonkey-elb。在变更时，先变更chaosmonkey-elb，变更成功后再变更chaosmonkey-slb，如果chaosmonkey-elb变更失败，则不会变更chaosmonkey-slb。
```
- name: chaosmonkey-elb                  # 资源名称
  type: WiseCloud::LoadBalancer::ELBV2   # 资源类型
  properties:
    listeners:
      - name: listener
        protocol: HTTP
        protocolPort: 80
        poolName: pool_a
    pools:
      - name: pool_a
        protocol: HTTP
- name: chaosmonkey-slb                  # 资源名称
  type: WiseCloud::LoadBalancer::SLB     # 资源类型
  dependsOn:                             # 定义对其他资源的依赖
    - name: chaosmonkey-elb              # 依赖的资源名称
  properties:
    elbName: chaosmonkey-elb
    elbPoolNames: ["pool_a"]
    deployVersion: 1.4.12
    slbConfigs:
      targets:
        - clusterName: mgr
      routes:
        - location: /
          target: mgr
```
