更新时间:2024-12-13 GMT+08:00

创建私有hook

功能介绍

创建私有hook(CreatePrivateHook)

创建一个带有初始默认版本的私有hook,创建私有hook的时候需要同时创建一个初始化的默认版本,不允许空私有hook的创建。

设置配置(Configuration)后的私有hook才会在触发资源栈部署时生效,资源栈使用私有hook的默认版本。若创建私有hook时未指定配置项,则该私有hook在资源栈部署时不生效,后续可通过UpdatePrivateHook API更新配置。

  • 支持hook策略模板检验的资源栈服务API:

    CreateExecutionPlan

    ApplyExecutionPlan

    CreateStack

    DeployStack

    ContinueDeployStack

    DeleteStack

    DeleteStackEnhanced

  • 创建私有hook时指定的版本为初始默认版本。

  • 如果同名的私有hook在当前domain_id+region下已经存在,则会返回409。

  • 私有hook版本号遵循语义化版本号(Semantic Version),为用户自定义。

  • 资源编排服务会对私有hook进行校验,如文件大小,策略文件语法校验等。若存在错误,则会创建失败。

  • 当前仅支持部署资源前的检测,不支持部署资源过程中的检测。如果通过了部署资源前的检测,资源栈则会继续部署资源。反之会停止部署资源,并记录资源栈事件(stack events)。

  • 仅支持OPA开源引擎识别的,以Rego(https://www.openpolicyagent.org/docs/latest/policy-language/)语言编写的策略模板(用户可以通过policy_uri或policy_body给予策略文件内容)。

  • 策略模板中的决策结果使用object类型的hook_result,hook_result所在包的包名必须使用policy。hook_result格式如下:

    hook_result := {
      "is_passed": Bool,
      "err_msg": String,
    }

    其中is_passed必选,err_msg可选。RFS通过查询policy.hook_result[is_passed]判断是否通过策略校验。

    • 如果policy.hook_result[is_passed]的结果是true,则表示通过策略校验,资源编排服务会继续部署资源。

    • 如果policy.hook_result[is_passed]的结果是false,则表示没有通过策略校验,资源编排服务会停止部署资源。并记录资源栈事件信息,信息的内容为policy.hook_result[err_msg]。如果没有设置err_msg,则资源栈事件信息内容为默认错误信息(校验私有hook失败)。

    • 如果没有使用policy.hook_result,则该策略不会生效,资源编排服务会继续部署资源。

  • 策略模板中不支持调用其他服务API等方式获取数据、不支持任何形式的网络访问、不支持以任何形式的自定义函数或者方法等、不支持读取本地文件以及系统操作。

私有hook的策略模板语法如下:

package policy

import rego.v1

hook_result := {
  "is_passed": input.message == "world",
  "err_msg": "The error msg when private hook is not passed the validation",
}

URI

POST /v1/private-hooks

请求参数

表1 请求Header参数

参数

是否必选

参数类型

描述

Client-Request-Id

String

用户指定的,对于此请求的唯一Id,用于定位某个请求,推荐使用UUID

表2 请求Body参数

参数

是否必选

参数类型

描述

hook_name

String

私有hook的名字。此名字在domain_id+region下应唯一,可以使用中文、大小写英文、数字、下划线、中划线。首字符需为中文或者英文,区分大小写。

推荐用户使用三段命名空间:{自定义hook名称}-{hook应用场景}-hook。

hook_version

String

私有hook的版本号。版本号必须遵循语义化版本号(Semantic Version),为用户自定义。

hook_description

String

私有hook的描述。可用于客户识别创建的私有hook。可通过UpdatePrivateHook API更新私有hook的描述。

hook_version_description

String

私有hook版本的描述。可用于客户识别创建私有hook的版本。注意:hook版本为不可更新(immutable),所以该字段不可更新,如果需要更新,请删除后重建。

configuration

configuration object

私有hook配置项,可以指定私有hook生效的目标资源栈以及私有hook校验失败后资源栈的行为。可通过UpdatePrivateHook API更新私有hook配置项。

policy_uri

String

策略文件的OBS地址。内容仅支持OPA开源引擎识别的,以Rego(https://www.openpolicyagent.org/docs/latest/policy-language/)语言编写的策略模板。

请确保OBS地址所在局点与使用RFS服务局点一致。

策略文件当前支持单文件或zip压缩包,单文件需要以".rego"结尾,压缩包当前只支持zip格式,文件需要以.zip结尾。

关于策略文件的校验要求如下:

  • 文件必须是UTF8编码

  • 创建时会对大小、格式、语法等进行校验

  • 策略文件必须是UTF-8编码

  • 单文件或压缩包解压前后的大小应控制在1MB以内

  • 压缩包内的文件数量不能超过100个

  • 压缩包内的文件路径最长为2048

  • 压缩包内的文件名最长为255个字节

policy_uri和policy_body必须有且只有一个存在

policy_body

String

策略内容。仅支持OPA开源引擎识别的,以Rego(https://www.openpolicyagent.org/docs/latest/policy-language/)语言编写的策略模板。

policy_body和policy_uri 必须有且只有一个存在

表3 configuration

参数

是否必选

参数类型

描述

target_stacks

String

指定私有hook生效的目标资源栈,有效值为NONE或ALL。

NONE:指定此私有hook不会作用于任何资源栈

ALL:指定此私有hook将会应用于账号下的所有资源栈

failure_mode

String

指定私有hook校验失败后的行为,有效值为FAIL或WARN。

FAIL:指定此私有hook校验失败后资源栈将停止部署,资源栈状态将更新为DEPLOYMENT_FAILED。

WARN:指定此私有hook校验失败后仅通过资源栈事件展示警告消息,但不影响资源栈部署。

响应参数

状态码: 201

表4 响应Body参数

参数

参数类型

描述

hook_id

String

私有hook(private-hook)的唯一Id。

此Id由资源编排服务在生成私有hook的时候生成,为UUID。

由于私有hook名称仅仅在同一时间下唯一,即用户允许先生成一个叫HelloWorld的私有hook,删除,再重新创建一个同名私有hook。

对于团队并行开发,用户可能希望确保,当前我操作的私有hook就是我认为的那个,而不是其他队友删除后创建的同名私有hook。因此,使用Id就可以做到强匹配。

资源编排服务保证每次创建的私有hook所对应的Id都不相同,更新不会影响Id。如果给予的hook_id和当前hook的Id不一致,则返回400。

状态码: 400

表5 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表6 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 401

表7 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表8 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 403

表9 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表10 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 409

表11 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表12 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 429

表13 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表14 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

状态码: 500

表15 响应Body参数

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

encoded_authorization_message

String

包含有关未经授权请求的信息。

details

Array of Detail objects

权限拒绝时服务返回的详细错误信息。

表16 Detail

参数

参数类型

描述

error_code

String

响应码

error_msg

String

响应消息

请求示例

创建一个带有初始默认版本的私有hook

POST https://{endpoint}/v1/private-hooks

{
  "hook_name" : "my-hello-world-hook-name",
  "hook_version" : "0.0.1",
  "policy_uri" : "https://my_hello_world_bucket.{region}.myhuaweicloud.com/policy.rego",
  "configuration" : {
    "target_stacks" : "NONE",
    "failure_mode" : "WARN"
  },
  "hook_description" : "my first private hook",
  "hook_version_description" : "my first private hook version"
}

响应示例

状态码: 201

创建成功

{
  "hook_id" : "1b15e005-bdbb-4bd7-8f9a-a09b6774b4b3"
}

状态码

状态码

描述

201

创建成功

400

用户请求非法

401

用户身份认证失败

403

  1. 用户无权限调用此API

  2. 私有hook数量达到上限

409

创建冲突,同名的私有hook已经存在

429

请求数量过多

500

服务器内部错误