# 设置镜像回源规则(Node.js SDK)
#### 功能介绍
OBS提供数据回源功能，可以在被请求的数据不存在时，通过回源规则从源站获取对应数据。
#### 接口约束
表1约束与限制 
| 限制分类       | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|
| **桶版本限制** | 仅桶版本号为3.0及以上的桶支持镜像回源。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| **时间限制**  | 修改镜像回源规则，需要5分钟之后才能生效。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| **规则数量限制**  | 最多创建10条镜像数据回源规则。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| **功能限制**  | - 不支持匿名用户配置镜像回源规则。  - 不支持企业联邦用户使用镜像回源功能，更多关于联邦用户的相关信息请参考[账号与用户的关系](https://support.huaweicloud.com/iam_faq/iam_01_0615.html)和[身份提供商概述](https://support.huaweicloud.com/usermanual-iam/iam_08_0001.html)。    - 不支持给并行文件系统配置镜像回源规则。  - 不支持OBS静态网站，即通过OBS静态网站域名下载对象出现404，不会触发镜像回源规则。  - 不支持在镜像回源规则中指定当前OBS桶域名，即源桶与目标桶不能是同一个桶。  - 私有桶的镜像回源当前仅支持部分云厂商。  - 设置回源策略时，不支持两个桶相互配置为回源桶，即A桶配置回源桶为B桶时，不支持再配置B桶的回源桶为A桶。  - 不支持源站使用Transfer-Encoding: chunked方式传输数据，即从源站下载对象的响应中必须包含Content-Length头域来指明源对象大小，使用Transfer-Encoding: chunked方式会导致回源失败。 此种场景在数据回源中的配置方式为：创建/编辑数据回源规则 \> HTTP header传递规则 \> 允许传递所有参数 \> 打开"禁止传递指定参数"开关 \> 输入"Accept-Encoding"。   - 如果同时配置了CDN加速域名和镜像回源规则，且CDN侧开启了Range回源，则需要源站至少返回Etag和Last-Modified两个Header的其中一个，否则可能会导致请求中断。  - 如果回源源站中使用Nginx反向代理源站，请关闭Nginx的chunked_transfer_encoding配置项： ``` location / { chunked_transfer_encoding off; } ```    |
| **权限限制**   | - 需要使用IAM的角色与策略授权功能，增加Tenant Administrator权限后才能设置、获取和删除镜像回源规则。  - 镜像回源需使用IAM的角色与策略授权功能，创建云服务委托，委托OBS获取源站数据。委托需要给OBS服务授予obs:object:PutObject、obs:object:GetObject、obs:bucket:ListBucket、obs:object:AbortMultipartUpload权限。  - 如果桶开启了SSE-KMS服务端加密功能，对OBS的云服务委托中还需要使用IAM的角色与策略授权功能，配置kms:cmk:get、kms:cmk:list、kms:cmk:create、kms:dek:create、kms:dek:encrypt、kms:dek:decrypt权限。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| **其他限制**   | - 镜像回源暂时不收费。  - 如果一个请求同时满足镜像回源规则和重定向回源规则，OBS先执行镜像回源流程，如果源站没有该对象，则再执行重定向回源流程。  - 不允许多条镜像回源规则配置的文件名前缀存在相互包含或重叠的关系，即对同一个对象的请求不能同时匹配两条镜像回源规则。  - 针对镜像回源配置未遵循[RFC Range Requests标准](https://www.rfc-editor.org/rfc/rfc7233)的源站，客户在使用分段（Range）回源时，HTTP请求需携带Range头域并检查Range头域取值的有效性。 Range头域指定回源获取的内容范围，取值不能超过文件大小。例如，对大小为1024字节的对象做分段回源，可以指定回源前512字节（Range值为0\~511），Range值有效。指定回源2048个字节（Range值为0\~2047），超过对象大小，Range值无效，回源失败。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   
#### 方法定义
ObsClient.setBucketMirrorBackToSource(params)
#### 请求参数说明
表2请求参数列表 
| 参数名称 | 参数类型  | 是否必选 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
|:---|:---|:---|:---|
| Bucket    | string     | 必选       | **参数解释：** 桶名。 **约束限制：** - 桶的名字需全局唯一，不能与已有的任何桶名称重复，包括其他用户创建的桶。  - 桶命名规则如下： - 3～63个字符，数字或字母开头，支持小写字母、数字、"-"、"."。  - 禁止使用IP地址。  - 禁止以"-"或"."开头及结尾。  - 禁止两个"."相邻（如："my..bucket"）。  - 禁止"."和"-"相邻（如："my-.bucket"和"my.-bucket"）。    - 同一用户在同一个区域多次创建同名桶不会报错，创建的桶属性以第一次请求为准。   **取值范围：** 长度为3～63个字符。 **默认取值：** 无 |
| Rules | string | 必选 | **参数解释：** 镜像回源规则列表，JSON格式的字符串。 **约束限制：** - 同一个桶下的不同规则前缀不能重复和起始包含，委托建议使用同一个。  - 每个桶最多创建10条镜像数据回源规则。   **默认取值：** 不涉及                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   
#### 返回结果
表3返回结果 
| **参数类型**                                                                                                                | 描述                                                                                        |
|:---|:---|
| [表4] 说明： 该接口返回是一个Promise类型，需要使用Promise、async/await语法处理。 | **参数解释：** 接口返回信息，详见[表4]。 |
   
 表4Response 
| **参数名称**           | **参数类型**                                | 描述                                                                                                                                                                            |
|:---|:---|:---|
| CommonMsg        | [ICommonMsg] | **参数解释：** 接口调用完成后的公共信息，包含HTTP状态码，操作失败的错误码等，详见[ICommonMsg]。                                                          |
| InterfaceResult | [表6]        | **参数解释：** 操作成功后的结果数据，详见[表6]。 **约束限制：** 当Status大于300时为空。 |
   
 表5ICommonMsg 
|  **参数名称**  | **参数类型** |                                                                                                                                                                                                                   **描述**                                                                                                                                                                                                                    |
|---|---|---|
| Status      | number  | **参数解释：** OBS服务端返回的HTTP状态码。 **取值范围：** 状态码是一组从2xx（成功）到4xx或5xx（错误）的数字代码，状态码表示了请求响应的状态。完整的状态码列表请参见[状态码](https://support.huaweicloud.com/api-obs/obs_04_0114.html)。 |
| Code         | string    | **参数解释：** OBS服务端返回的错误码。                                                                                                                                                                                                                                                                                                                                                              |
| Message     | string  | **参数解释：** OBS服务端返回的错误描述。                                                                                                                                                                                                                                                                                                                                                          |
| HostId     | string    | **参数解释：** OBS服务端返回的请求服务端ID。                                                                                                                                                                                                                                                                                                                                                      |
| RequestId  | string   | **参数解释：** OBS服务端返回的请求ID。                                                                                                                                                                                                                                                                                                                                                          |
| Id2          | string   | **参数解释：** OBS服务端返回的请求ID2。                                                                                                                                                                                                                                                                                                                                                      |
| Indicator | string    | **参数解释：** OBS服务端返回的详细错误码。                                                                                                                                                                                                                                                                                                                                                         |
   
 表6BaseResponseOutput 
| **参数名称** | **参数类型** | **描述**                                                                                                                             |
|:---|:---|:---|
| RequestId     | string     | **参数解释：** OBS服务端返回的请求ID。 |
   
#### 代码示例
您可以通过ObsClient.setBucketMirrorBackToSource设置镜像回源规则。代码示例如下：
```
// 引入obs库
// 使用npm安装
const ObsClient = require("esdk-obs-nodejs");
// 使用源码安装
// var ObsClient = require('./lib/obs');
// 创建ObsClient实例
const obsClient = new ObsClient({
  // 推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险
  // 您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html
  access_key_id: process.env.ACCESS_KEY_ID,
  secret_access_key: process.env.SECRET_ACCESS_KEY,
  // 【可选】如果使用临时AK/SK和SecurityToken访问OBS，同样建议您尽量避免使用硬编码，以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK，也可以使用其他外部引入方式传入
  // security_token: process.env.SECURITY_TOKEN,
  // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例，其他地区请按实际情况填写
  server: "https://obs.cn-north-4.myhuaweicloud.com",
});
async function setBucketMirrorBackToSource() {
  try {
    // 构建镜像回源规则（JSON字符串）
    const rules = JSON.stringify({
      rules: [{
        id: 'rule-001',
        condition: {
          httpErrorCodeReturnedEquals: '404',
          objectKeyPrefixEquals: 'video/'
        },
        redirect: {
          agency: 'your_agency',
          publicSource: {
            sourceEndpoint: {
              master: ['http://bucket1.example.com'],
              slave: ['http://bucket2.example.com']
            }
          },
          passQueryString: true,
          mirrorFollowRedirect: false
        }
      }]
    });
    const params = {
      // 指定存储桶名称
      Bucket: "examplebucket",
      // 指定镜像回源规则
      Rules: rules,
    };
    // 设置镜像回源规则
    const result = await obsClient.setBucketMirrorBackToSource(params);
    if (result.CommonMsg.Status <= 300) {
      console.log("Set bucket mirror back to source successful!\n");
      console.log("RequestId: %s", result.CommonMsg.RequestId);
      return;
    };
    console.log("An ObsError was found, which means your request sent to OBS was rejected with an error response.");
    console.log("Status: %d", result.CommonMsg.Status);
    console.log("Code: %s", result.CommonMsg.Code);
    console.log("Message: %s", result.CommonMsg.Message);
    console.log("RequestId: %s", result.CommonMsg.RequestId);
  } catch (error) {
    console.log("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.");
    console.log(error);
  };
};
setBucketMirrorBackToSource();
```
