

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 跨集群搜索
<a name="application-cross-cluster-search"></a>

在 Amazon OpenSearch Serverless 中使用[跨集群搜索](cross-cluster-search.md)，您可以跨多个连接的域执行查询和聚合。

Amazon OpenSearch Serverless 中的跨集群搜索使用*源域和*目标*域*的概念。跨集群搜索请求源自源域。目标域可以位于不同的 AWS 区域 （ AWS 账户 或两者兼而有之）中，供源域进行查询。使用跨集群搜索，您可以将源域配置为在同一个账户中与您的 OpenSearch 用户界面关联，然后创建与目标域的连接。因此，即使目标网域位于不同的账户或区域中，您也可以使用 OpenSearch 用户界面处理来自目标域的数据。

您需要为传入和[传出亚马逊 OpenSearch 服务的数据支付标准 AWS 数据传输费用](https://aws.amazon.com/opensearch-service/pricing/)。您无需为 OpenSearch 服务域内的节点之间传输的数据付费。有关数据“传入”和“传出”费用的更多信息，请参阅 *Amazon EC2 按需定价*页面中的[数据传输](https://aws.amazon.com/ec2/pricing/on-demand/#Data_Transfer)。

您可以使用跨集群搜索作为将 OpenSearch 用户界面与不同账户或不同区域中的集群关联的机制。默认情况下，作为加密的一部分，域之间的请求在传输过程中会进行 node-to-node加密。

**注意**  
开源 OpenSearch 工具还记录了[跨集群搜索](https://opensearch.org/docs/latest/search-plugins/cross-cluster-search/)。请注意，与托管 Amazon OpenSearch Serverless 域相比，开源集群的开源工具设置差异很大。  
最值得注意的是，在 Amazon OpenSearch Serverless 中，您可以使用 AWS 管理控制台 而不是请求来配置跨集群连接。`cURL`除精细访问控制外，托管式服务还使用 AWS Identity and Access Management （IAM）进行跨集群身份验证。  
因此，我们建议使用本主题中的内容来配置域名的跨集群搜索，而不是使用开源 OpenSearch文档。

**使用跨集群搜索时的功能差异**  
相较于常规域，使用跨集群搜索创建的目标域具有以下功能差异和要求：
+ 您无法向远程集群写入或运行 `PUT` 命令。您对远程集群的访问权限为*只读*权限。
+ 源域和目标域都必须是 OpenSearch 域。您无法连接 Elasticsearch 域或用于用户界面的自行管理的 OpenSearch /Elasticsearch 集群。 OpenSearch 
+ 一个域最多可与其他域建立 20 个连接。这同时包括传出和传入连接。
+ 源域的版本必须与目标域相同或更高。 OpenSearch 如果要在两个域之间建立双向连接，则这两个域的版本应相同。我们建议在建立连接前，将两个域都升级到最新版本。如果需在建立双向连接后更新域，必须先删除该连接，然后再重新创建。
+ 不能将自定义字典或 SQL 用于远程搜索。
+ 您不能使用 CloudFormation 来连接域名。
+ 不能在 M3 和可突增（T2 和 T3）实例上使用跨集群搜索。
+ 跨集群搜索不适用于 Amazon OpenSearch Serverless 馆藏。

**UI 的跨集群搜索先决条件 OpenSearch**  
在设置包含两个 OpenSearch 域的跨集群搜索之前，请确保您的域满足以下要求：
+ 两个域的精细访问控制均已启用
+ Node-to-node 两个域都启用了加密

**Topics**
+ [通过跨集群搜索设置跨区域和跨账户数据访问的访问权限](#cross-cluster-search-security)
+ [在域之间创建连接](#cross-cluster-search-create-connection)
+ [通过跨集群搜索测试跨区域和跨账户数据访问的安全设置](#cross-cluster-search-security-testing)
+ [删除连接](#cross-cluster-search-deleting-connection)

## 通过跨集群搜索设置跨区域和跨账户数据访问的访问权限
<a name="cross-cluster-search-security"></a>

当向源域发送跨集群搜索请求时，该域将根据其域访问策略评估该请求。跨集群搜索需要精细访问控制。以下是在源域上实施开放访问策略的示例。

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
"Statement": [
    {
        "Effect": "Allow",
        "Principal": {
          "AWS": [
            "*"
        ]
      },
      "Action": [
        "es:ESHttp*"
      ],
      "Resource": "arn:aws:es:us-east-1:111222333444:domain/src-domain/*"
    }
  ]
}
```

------

**注意**  
如果路径中包含远程索引，则必须在域 ARN 中对 URI 进行 URL 编码。  
例如，使用以下 ARN 格式：  
`:arn:aws:es:us-east-1:111222333444:domain/my-domain/local_index,dst%3Aremote_index`  
请勿使用以下 ARN 格式：  
`arn:aws:es:us-east-1:111222333444:domain/my-domain/local_index,dst:remote_index.`

如果除了精细访问控制，还选择使用限制性访问策略，则策略必须至少允许访问 `es:ESHttpGet`。以下是示例：

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::111222333444:user/john-doe"
        ]
      },
      "Action": "es:ESHttpGet",
      "Resource": "arn:aws:es:us-east-1:111122223333:domain/my-domain/*"
    }
  ]
}
```

------

源域上的[精细访问控制](fgac.md)会评估请求，以确定其是否使用有效的 IAM 或 HTTP 基础凭证进行签名。如果是，精细访问控制接下来会评估用户是否具有执行搜索和访问数据的权限。

以下是有关搜索的权限要求：
+ 如果该请求仅搜索目标域中的数据（例如，`dest-alias:dest-index/_search)`），则只需目标域的权限。
+ 如果该请求在两个域中搜索数据（例如，`source-index,dest-alias:dest-index/_search)`），则需要两个域的权限。
+ 在精细访问控制中，除相关索引的标准读取或搜索权限之外，用户还必须拥有 `indices:admin/shards/search_shards` 权限。

源域将请求传递到目标域。目标域根据其域访问策略评估该请求。要支持 OpenSearch UI 中的所有功能，例如为文档编制索引和执行标准搜索，必须设置完全权限。以下是我们针对目标域的推荐策略示例：

------
#### [ JSON ]

****  

```
{
"Version":"2012-10-17",		 	 	 
 "Statement": [
    {
       "Effect": "Allow",
       "Principal": {
         "AWS": [
           "*"
        ]
      },
      "Action": [
        "es:ESHttp*"
      ],
      "Resource": "arn:aws:es:us-east-2:111222333444:domain/my-destination-domain/*"
    },
    {
    "Effect": "Allow",
        "Principal": {
    "AWS": "*"
      },
      "Action": "es:ESCrossClusterGet",
      "Resource": "arn:aws:es:us-east-2:111222333444:domain/"
    }
  ]
}
```

------

如果仅需执行基础搜索，最低策略要求是针对目标域应用 `es:ESCrossClusterGet` 权限，且不支持通配符。例如，在前面的策略中，您可以将域名指定为*/my-destination-domain*，而不是指定*/my-destination-domain/\$1*。

在此情况下，目标域执行搜索，并将结果返回到源域。源域将自己的结果（如果有）与目标域的结果相结合，并将它们返回给您。

## 在域之间创建连接
<a name="cross-cluster-search-create-connection"></a>

跨集群搜索连接是从源域到目标域的单向连接。这意味着目标域名（在不同的账户或区域中）无法查询 OpenSearch 用户界面的本地源域名。源域创建到目标域的*出站*连接。目标域接收来自源域的*入站*连接请求。

![\[此图说明跨集群搜索连接是从源域到目标域的单向连接。\]](http://docs.aws.amazon.com/zh_cn/opensearch-service/latest/developerguide/images/ui-oubound-inbound-connections.png)


**在域之间创建连接**

1. 在[https://console.aws.amazon.com/aos/家](https://console.aws.amazon.com/aos/home)中登录亚马逊 OpenSearch 服务控制台。

1. 在左侧导航栏中，选择**域**。

1. 选择要用作源域的域名，然后选择**连接**选项卡。

1. 在**出站连接**区域，选择**请求**。

1. 对于**Connection alias（连接别名）**，输入您的连接的名称。 OpenSearch 用户界面中使用连接别名来选择目标域。

1. 对于**连接模式**，请选择**直接**模式以进行跨集群搜索或复制。

1. 要指定连接在搜索过程中应跳过不可用的集群，请选中**跳过不可用的集群**复选框。选择此选项可确保即使一个或多个远程集群发生故障，跨集群查询仍能返回部分结果。

1. 对于**目标集群**，请在**连接到此 AWS 账户中的集群**和**连接到其他 AWS 账户中的集群**之间进行选择。

1. 对于**远程域 ARN**，输入集群的 Amazon 资源名称（ARN）。域 ARN 可在域详情页面的**一般信息**区域中找到。

   域必须满足以下要求：
   + ARN 的格式必须为 `arn:partition:es:regionaccount-id:type/domain-id`。例如：

     `arn:aws:es:us-east-2:111222333444:domain/my-domain`
   + 必须将该域配置为使用 OpenSearch 版本 1.0（或更高版本）或 Elasticsearch 版本 6.7（或更高版本）。
   + 必须在域上启用精细访问控制。
   + 域名必须正在运行 OpenSearch。

1. 选择**请求**。

跨集群搜索首先验证连接请求，以确保满足先决条件。如果域不兼容，则连接请求将进入 `Validation failed` 状态。

如果连接请求验证成功，则将其发送到目标域，该请求必须在目标域进行审批。在此审批进行之前，连接将保持 `Pending acceptance` 状态。当连接请求被目标域接受后，状态将更改为 `Active`，且目标域变为可供查询。

域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。

连接建立之后，在所连接域节点之间流动的任何流量都将进行加密。如果将 VPC 域连接到非 VPC 域，且非 VPC 域是可接收 Internet 流量的公有端点，则域之间的跨集群流量仍是加密且安全的。

## 通过跨集群搜索测试跨区域和跨账户数据访问的安全设置
<a name="cross-cluster-search-security-testing"></a>

通过跨集群搜索为跨区域和跨账户数据访问设置访问权限后，我们建议使用 [https://www.postman.com/](https://www.postman.com/)（即用于协作 API 开发的第三方平台）测试设置。

**使用 Postman 设置您的安全设置**

1. 在目标域上，为文档编制索引。示例请求如下：

   ```
   POST https://dst-domain.us-east-1.es.amazonaws.com/books/_doc/1
   {
   "Dracula": "Bram Stoker"
   }
   ```

1. 要从源域查询此索引，请在查询内包含目标域的连接别名。您可以在域控制面板的连接选项卡上找到连接别名。以下是请求示例及截断响应：

   ```
   GET https://src-domain.us-east-1.es.amazonaws.com/connection_alias:books/_search
   {
   ...
     "hits": [
   {
   "_index": "source-destination:books",
     "_type": "_doc",
     "_id": "1",
     "_score": 1,
     "_source": {
   "Dracula": "Bram Stoker"
     }
   }
     ]
   }
   ```

1. （可选）您可以在单次搜索中创建包含多个域名的配置。例如，假设您设置以下内容：

   `domain-a` 到 `domain-b` 的连接，连接别名为 `cluster_b`

   `domain-a` 到 `domain-c` 的连接，连接别名为 `cluster_c`

   在此情况下，您的搜索包括内容 `domain-a`、`domain-b` 和 `domain-c`。以下是请求示例及响应：

   请求

   ```
   GET https://src-domain.us-east-1.es.amazonaws.com/local_index,cluster_b:b_index,cluster_c:c_index/_search
   {
     "query": {
   "match": {
     "user": "domino"
   }
     }
   }
   ```

   响应：

   ```
   {
   "took": 150,
     "timed_out": false,
     "_shards": {
   "total": 3,
   "successful": 3,
   "failed": 0,
   "skipped": 0
     },
     "_clusters": {
   "total": 3,
   "successful": 3,
   "skipped": 0
     },
     "hits": {
   "total": 3,
   "max_score": 1,
   "hits": [
     {
   "_index": "local_index",
       "_type": "_doc",
       "_id": "0",
       "_score": 1,
       "_source": {
   "user": "domino",
         "message": "This is message 1",
         "likes": 0
       }
     },
     {
   "_index": "cluster_b:b_index",
       "_type": "_doc",
       "_id": "0",
       "_score": 2,
       "_source": {
   "user": "domino",
         "message": "This is message 2",
         "likes": 0
       }
     },
     {
   "_index": "cluster_c:c_index",
       "_type": "_doc",
       "_id": "0",
       "_score": 3,
       "_source": {
   "user": "domino",
         "message": "This is message 3",
         "likes": 0
       }
     }
   ]
     }
   }
   ```

如果您没有选择在连接设置中跳过不可用集群，搜索的所有目标集群必须可用才能成功运行搜索请求。否则，整个请求将失败——即使只有一个域不可用，也不会返回任何搜索结果。

## 删除连接
<a name="cross-cluster-search-deleting-connection"></a>

删除连接会停止目标域上的任何跨集群搜索操作。

您可以在源域或目标域上执行以下步骤以删除连接。删除连接之后，其状态为 `Deleted`，仍会显示 15 天。

不能删除具有活动跨集群连接的域。要删除域，请首先从该域中删除所有传入和传出连接。这是为了确保在删除域之前考虑到了跨集群域用户。

**删除连接**

1. 在[https://console.aws.amazon.com/aos/家](https://console.aws.amazon.com/aos/home)中登录亚马逊 OpenSearch 服务控制台。

1. 在左侧导航栏中，选择**域**。

1. 选择要删除的域名称，然后选择**连接**选项卡。

1. 选择要删除的连接名称。

1. 选择**删除**，然后确认删除。