
# 部署资源栈
#### 功能介绍
部署资源栈（DeployStack）
此API用于部署一个已有的资源栈
- 用户可以使用此API更新模板、参数等并触发一个新的部署
  
- 此API会直接触发部署，如果用户希望先确认部署会发生的时间，请使用执行计划，即使用CreateExecutionPlan以创建执行计划、使用GetExecutionPlan以获取执行计划
  
- 此API为全量API，即用户每次部署都需要给予所想要使用的template、vars的全量
  
- 部署资源栈时，用户将模板中定义的资源删除（包括Import定义的资源），会触发实际资源的删除。建议通过CreateExecutionPlan查看模板修改后资源栈的部署行为，以避免误操作非预期资源
  
- 当触发的部署失败时，如果资源栈开启了自动回滚，会触发自动回滚的流程，否则就会停留在部署失败时的状态
  
- 若指定 encrypt_kms_key_id 启用模板加密功能，请确保资源栈委托角色（如已配置）或当前账号身份拥有该主密钥的 kms:dek:create（创建数据密钥） 和 kms:dek:decrypt（解密数据密钥） 访问权限。
  
 
#### 调试
您可以在[API Explorer](https://console.huaweicloud.com/apiexplorer/#/openapi/AOS/doc?api=DeployStack)中调试该接口，支持自动认证鉴权。API Explorer可以自动生成SDK代码示例，并提供SDK代码示例调试功能。
#### URI
POST /v1/{project_id}/stacks/{stack_name}/deployments
表1路径参数 
| 参数         | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| project_id | 是    | String | 项目ID，可以从调用API处获取，也可以从控制台获取。 [项目ID获取方式](https://support.huaweicloud.com/api-ticket/ticket_api_20002.html) 最小长度：**3** 最大长度：**64** |
| stack_name | 是    | String | 资源栈的名称。此名字在domain_id+区域+project_id下应唯一，可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文，区分大小写。 最小长度：**1** 最大长度：**128**                                                                                                    |
   
#### 请求参数
表2请求Header参数 
| 参数                | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                    |
|:---|:---|:---|:---|
| Client-Request-Id | 是    | String | 用户指定的，对于此请求的唯一ID，用于定位某个请求，推荐使用UUID 最小长度：**36** 最大长度：**128** |
   
表3请求Body参数 
| 参数                 | 是否必选 | 参数类型                                                                                                                | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| template_body      | 否    | String                                                                                                              | HCL模板，描述了资源的目标状态。资源编排服务将比较此模板与当前远程资源的状态之间的区别。 template_body，template_uri和private_template必须有且只有一个存在 在CreateStack API中，template_body，template_uri和private_template可以都不给予 **注意：** - template_body中默认不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的template_body。如为敏感信息，建议在模板中抽取变量并声明为sensitive，将敏感信息通过vars_structure参数化，并设置encryption字段开启加密    （如果变量variable在模板中被标记为sensitive，则在 GetStackMetadata 和 GetExecutionPlanMetadata 接口返回的 vars_structure、vars_uri_content、vars_body 中，该变量的值将被脱敏） 最小长度：**0** 最大长度：**51200**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| template_uri       | 否    | String                                                                                                              | HCL模板的OBS地址，该模板描述了资源的目标状态。资源编排服务将比较此模板与当前远程资源的状态之间的区别。 请确保OBS地址所在局点与使用RFS服务局点一致。 对应的文件应该是纯tf文件或zip压缩包 纯tf文件需要以.tf或者.tf.json结尾，并遵守HCL语法 压缩包目前只支持zip格式，文件需要以.zip结尾。解压后的文件不得包含.tfvars文件且必须是UTF8编码（其中.tf.json不能包含BOM头），zip压缩包当前支持的子文件数量最大为100 template_body，template_uri和private_template必须有且只有一个存在 在CreateStack API中，template_body，template_uri和private_template可以都不给予 **注意：** - template_uri对应的模板文件中默认不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的模板文件内容。如为敏感信息，建议在模板中抽取变量并声明为sensitive，将敏感信息通过vars_structure参数化，并设置encryption字段开启加密   - template_uri对应的模板文件如果为zip类型，则内部的文件或文件夹名称长度不得超过255个字节，最深路径长度不得超过2048字节，zip包大小不得超过1MB    （如果变量variable在模板中被标记为sensitive，则在 GetStackMetadata 和 GetExecutionPlanMetadata 接口返回的 vars_structure、vars_uri_content、vars_body 中，该变量的值将被脱敏） 最小长度：**0** 最大长度：**2048** |
| vars_structure     | 否    | Array of [VarsStructure] objects | HCL参数结构。HCL模板支持参数传入，即，同一个模板可以给予不同的参数而达到不同的效果。 - var_structure可以允许客户提交最简单的字符串类型的参数   - 资源编排服务支持vars_structure，vars_body和vars_uri，如果以上三种方式中声明了同一个变量，将报错400   - vars_structure中的值只支持简单的字符串类型，如果需要使用其他类型，需要用户自己在HCL引用时转换，   - vars_structure最多允许100项，如果vars_structure过大，可以使用vars_uri   - 注意：vars_structure中默认不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的vars。如为敏感信息，建议设置encryption字段开启加密    或者用户可以使用vars_uri、vars_body，vars_uri和vars_body中支持HCL支持的各种类型以及复杂结构 数组长度：**0 - 100**                                                                                              |
| vars_body          | 否    | String                                                                                                              | HCL参数文件的内容。HCL模板支持参数传入，即，同一个模板可以给予不同的参数而达到不同的效果。 - vars_body使用HCL的tfvars格式，用户可以将".tfvars"中的内容提交到vars_body中。   - 资源编排服务支持vars_structure，vars_body和vars_uri，如果以上三种方式中声明了同一个变量，将报错400   - vars_body最大长度为51200字节，如果vars_body过大，可以使用vars_uri   - 如果vars中都是简单的字符串格式，可以使用var_structure   - 注意：vars_body中不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的vars。如为敏感信息，建议通过vars_structure并设置encryption字段传递    最小长度：**0** 最大长度：**51200**                                                                                                                                               |
| vars_uri           | 否    | String                                                                                                              | HCL参数文件的OBS地址。HCL模板支持参数传入，即，同一个模板可以给予不同的参数而达到不同的效果。 请确保OBS地址所在局点与使用RFS服务局点一致。 - vars_uri最大长度为2048字节，vars_uri所指向的HCL参数文件大小最大长度为1MB。   - 资源编排服务支持vars_structure，vars_body和vars_uri，如果以上三种方式中声明了同一个变量，将报错400   - vars_uri中的内容使用HCL的tfvars格式，用户可以将".tfvars"中的内容保存到文件并上传到OBS中，并将OBS pre-signed URL传递给vars_uri。   - 注意：vars_uri的内容不应该含有任何敏感信息，资源编排服务会直接明文使用、log、展示和存储对应的vars。如为敏感信息，建议通过vars_structure并设置encryption字段传递    最小长度：**0** 最大长度：**2048**                                                                                                                                                                                                                                                                                                                              |
| encrypt_kms_key_id | 否    | String                                                                                                              | 用于加密模板的KMS主密钥ID，当前仅支持 AES_256 算法的密钥。设置后，RFS将使用该密钥对Terraform模板进行加密存储。请注意，使用此密钥会产生相应的KMS服务费用。重要：该密钥一旦被用于加密，请谨慎删除。若密钥被删除，将导致相关堆栈无法访问，操作风险由您自行承担。 最小长度：**36** 最大长度：**36**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| stack_id           | 否    | String                                                                                                              | 资源栈（stack）的唯一ID。 此Id由资源编排服务在生成资源栈的时候生成，为UUID。 由于资源栈名仅仅在同一时间下唯一，即用户允许先生成一个叫HelloWorld的资源栈，删除，再重新创建一个同名资源栈。 对于团队并行开发，用户可能希望确保，当前我操作的资源栈就是我认为的那个，而不是其他队友删除后创建的同名资源栈。因此，使用ID就可以做到强匹配。 资源编排服务保证每次创建的资源栈所对应的ID都不相同，更新不会影响ID。如果给予的stack_id和当前资源栈的ID不一致，则返回400 最小长度：**36** 最大长度：**36**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| private_template   | 否    | [PrivateTemplate] object       |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   
 表4VarsStructure 
| 参数         | 是否必选 | 参数类型                                                                                                                  | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                  |
|:---|:---|:---|:---|
| var_key    | 是    | String                                                                                                                | 参数的名字 最小长度：**1** 最大长度：**32**                                                                                                                                                                                                                                              |
| var_value  | 是    | String                                                                                                                | 参数的值。 注意，参数需要以字符串形式存在，如果是数字，也需要以字符串形式存在，如'10'。 如果需要支持不同类型，或者复杂结构，请使用vars_uri或vars_body 最小长度：**0** 最大长度：**2048** |
| encryption | 否    | [EncryptionStructure] object | 如果用户传递的var_value是已经加密过的，可以通过声明此项以要求资源编排服务在使用前进行解密，目前暂时只支持KMS加解密                                                                                                                                                                                                                                                                                                                                                                     |
   
 表5EncryptionStructure 
| 参数  | 是否必选 | 参数类型                                                                                                    | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| kms | 是    | [KmsStructure] object | 如果用户给予的var_value是经过KMS加密的，可以通过传递相关加密信息，资源编排服务在使用的时候会帮助用户进行KMS解密 更多关于KMS加密以及KMS加密的样例代码请见：[KMS加密使用场景介绍](https://support.huaweicloud.com/productdesc-dew/dew_01_0006.html) **注意：** - 请确保用户给予资源编排服务的委托中包含对指定密钥ID的操作权限   - KMS每个月有免费试用的额度，如果超过，则KMS需要收费，此费用不是资源编排服务收取，具体标准见：<https://www.huaweicloud.com/pricing.html?tab=detail#/dew>   - KMS加密只代表资源编排服务在存储和传输的时候传递的是密文，但是在stack-events中依然是明文，如果希望在log中以密文形式对待，请在模板中声明sensitive，更多关于sensitive的介绍见：<https://developer.hashicorp.com/terraform/tutorials/configuration-language/sensitive-variables>    |
   
 表6KmsStructure 
| 参数          | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                                       |
|:---|:---|:---|:---|
| id          | 是    | String | 解密时，资源编排服务应该使用的KMS密钥的ID，通常是加密时所使用的密钥ID 最小长度：**36** 最大长度：**36** |
| cipher_text | 是    | String | 数据加密密钥所对应的密文 最小长度：**2** 最大长度：**2048**                          |
   
 表7PrivateTemplate 
| 参数               | 是否必选 | 参数类型   | 描述                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| template_id      | 是    | String | 私有模板（PrivateTemplate）的Id。 最小长度：**36** 最大长度：**36** |
| template_version | 是    | String | 模板版本Id，以大写V开头。 最小长度：**2** 最大长度：**11**             |
   
#### 响应参数
**状态码：202**
表8响应Body参数 
| 参数            | 参数类型   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|
| deployment_id | String | 部署ID 接受请求，进行异步处理。可以调用GetStackMetadata来获取异步请求的部署状态 **注意：** - 部署资源栈后，资源编排服务持久化请求并立即返回，客户端不等待请求最终处理完成，用户无法实时感知请求处理结果   - 资源编排服务最终会将异步部署请求排队，在服务端空闲的情况下逐个处理。用户最大等待时长为6小时    |
   
**状态码：400**
表9响应Body参数 
| 参数                            | 参数类型                                                                                                   | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                 | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                 | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                 | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表10Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：401**
表11响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表12Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：403**
表13响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表14Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：404**
表15响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表16Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：409**
表17响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表18Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：429**
表19响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表20Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
**状态码：500**
表21响应Body参数 
| 参数                            | 参数类型                                                                                                     | 描述                                                                                                                                                                                    |
|:---|:---|:---|
| error_code                    | String                                                                                                   | 响应码 最小长度：**11** 最大长度：**11** |
| error_msg                     | String                                                                                                   | 响应消息                                                                                                                                                                                  |
| encoded_authorization_message | String                                                                                                   | 包含有关未经授权请求的信息。                                                                                                                                                                        |
| details                       | Array of [Detail] objects | 权限拒绝时服务返回的详细错误信息。                                                                                                                                                                     |
   
 表22Detail 
| 参数         | 参数类型   | 描述   |
|:---|:---|:---|
| error_code | String | 响应码  |
| error_msg  | String | 响应消息 |
   
#### 请求示例
- 通过OBS Signed URL传递模板和参数信息
  ```
  POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/deployments
  {
    "template_uri" : "https://my_hello_world_bucket.{region}.myhuaweicloud.com/my-hello-world-template.tf",
    "vars_uri" : "https://my_hello_world_bucket.{region}.myhuaweicloud.com/my-hello-world-vars.tfvars",
    "stack_id" : "1b15e005-bdbb-4bd7-8f9a-a09b6774b4b3"
  }
  ```
  
- 使用私有模板部署资源栈
  ```
  POST https://{endpoint}/v1/ba2b9930c977f71edaeaa3a5e96a8ff1/stacks/my_hello_world_stack/deployments
  {
    "private_template" : {
      "template_id" : "69f8d5ea-eaa4-4a3b-a96d-bae9230e97c9",
      "template_version" : "V1"
    }
  }
  ```
  
 
#### 响应示例
**状态码：202**
请求接受，异步处理
```
{
  "deployment_id" : "3fef5d3e-27b6-44e8-9769-1d7262bd9430"
}
```
#### 状态码
| 状态码 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|
| 202 | 请求接受，异步处理                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| 400 | 用户请求非法                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 401 | 用户身份认证失败                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| 403 | 1. 资源栈状态非法，不允许部署   2. 用户无权限调用此API    |
| 404 | 资源栈不存在                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 409 | 部署冲突，另一个请求正在操作此资源栈                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| 429 | 请求数量过多                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| 500 | 服务器内部错误                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   
