通过跨集群搜索实现跨区域和跨账户数据访问
使用 Amazon OpenSearch 无服务器中的跨集群搜索,您可跨多个相连的域执行查询和聚合。
Amazon OpenSearch 无服务器中的跨集群搜索使用源域和目标域的概念。跨集群搜索请求源自源域。目标域可位于不同的 Amazon Web Services 账户 或 Amazon Web Services 区域(或两者兼而有之)中,供源域进行查询。通过跨集群搜索,您可以在同一账户中配置源域以关联至您的 OpenSearch UI,随后创建与目标域的连接。因此,即使目标域位于不同账户或区域,您仍可使用 OpenSearch UI 访问其数据。
您需为传入和传出 Amazon OpenSearch Service 的数据支付标准 Amazon 数据传输费用
您可以使用跨集群搜索作为机制,使您的 OpenSearch UI 关联到不同账户或不同区域中的集群。默认情况下,对域之间的请求在传输过程中进行加密,作为节点到节点加密的一部分。
注意
开源 OpenSearch 工具也记录跨集群搜索
最值得注意的是,在 Amazon OpenSearch 无服务器中,您使用 Amazon Web Services 管理控制台 配置跨集群连接,而不是使用 cURL 请求。除精细访问控制外,托管式服务还使用 Amazon Identity and Access Management(IAM)进行跨集群身份验证。
因此,我们建议您使用本主题中的内容为您的域配置跨集群搜索,而非参考开源 OpenSearch 文档。
使用跨集群搜索时的功能差异
相较于常规域,使用跨集群搜索创建的目标域具有以下功能差异和要求:
-
您无法向远程集群写入或运行
PUT命令。您对远程集群的访问权限为只读权限。 -
源域和目标域必须同为 OpenSearch 域。无法连接 Elasticsearch 域或适用于 OpenSearch UI 的自主管理型 OpenSearch/Elasticsearch 集群
-
一个域最多可与其他域建立 20 个连接。这同时包括传出和传入连接。
-
源域的 OpenSearch 版本必须与目标域相同或更高。如果要在两个域之间建立双向连接,则这两个域的版本应相同。我们建议在建立连接前,将两个域都升级到最新版本。如果需在建立双向连接后更新域,必须先删除该连接,然后再重新创建。
-
不能将自定义字典或 SQL 用于远程搜索。
-
不能使用 Amazon CloudFormation 连接域。
-
不能在 M3 和可突增(T2 和 T3)实例上使用跨集群搜索。
-
跨集群搜索不适用于 Amazon OpenSearch 无服务器集合。
OpenSearch UI 跨集群搜索的先决条件
在为两个 OpenSearch 域设置跨集群搜索之前,请确保域满足以下要求:
-
两个域的精细访问控制均已启用
-
两个域的节点到节点加密均已启用
通过跨集群搜索设置跨区域和跨账户数据访问的访问权限
当向源域发送跨集群搜索请求时,该域将根据其域访问策略评估该请求。跨集群搜索需要精细访问控制。以下是在源域上实施开放访问策略的示例。
注意
如果路径中包含远程索引,则必须在域 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。以下是示例:
源域上的精细访问控制会评估请求,以确定其是否使用有效的 IAM 或 HTTP 基础凭证进行签名。如果是,精细访问控制接下来会评估用户是否具有执行搜索和访问数据的权限。
以下是有关搜索的权限要求:
-
如果该请求仅搜索目标域中的数据(例如,
dest-alias:dest-index/_search)),则只需目标域的权限。 -
如果该请求在两个域中搜索数据(例如,
source-index,dest-alias:dest-index/_search)),则需要两个域的权限。 -
在精细访问控制中,除相关索引的标准读取或搜索权限之外,用户还必须拥有
indices:admin/shards/search_shards权限。
源域将请求传递到目标域。目标域根据其域访问策略评估该请求。要支持 OpenSearch UI 中的所有功能(例如索引文档和执行标准搜索),必须设置完全权限。以下是我们针对目标域的推荐策略示例:
如果仅需执行基础搜索,最低策略要求是针对目标域应用 es:ESCrossClusterGet 权限,且不支持通配符。例如,在上述策略中,您应将域名指定为 /my-destination-domain,而非 /my-destination-domain/*。
在此情况下,目标域执行搜索,并将结果返回到源域。源域将自己的结果(如果有)与目标域的结果相结合,并将它们返回给您。
在域之间创建连接
跨集群搜索连接是从源域到目标域的单向连接。这意味着目标域(位于不同账户或区域)无法查询源域,而源域是 OpenSearch UI 的本地域。源域创建到目标域的出站连接。目标域接收来自源域的入站连接请求。
在域之间创建连接
-
登录到位于 https://console.aws.amazon.com/aos/home 的 Amazon OpenSearch Service 控制台。
-
在左侧导航栏中,选择域。
-
选择要用作源域的域名,然后选择连接选项卡。
-
在出站连接区域,选择请求。
-
对于Connection alias(连接别名),输入您的连接的名称。OpenSearch UI 中使用连接别名以选择目标域。
-
对于连接模式,请选择直接模式以进行跨集群搜索或复制。
-
要指定连接在搜索过程中应跳过不可用的集群,请选中跳过不可用的集群复选框。选择此选项可确保即使一个或多个远程集群发生故障,跨集群查询仍能返回部分结果。
-
对于目标集群,请在连接到此 Amazon Web Services 账户 中的集群和连接到其他 Amazon Web Services 账户 中的集群之间进行选择。
-
对于远程域 ARN,输入集群的 Amazon 资源名称(ARN)。域 ARN 可在域详情页面的一般信息区域中找到。
域必须满足以下要求:
-
ARN 的格式必须为
arn:。例如:partition:es:regionaccount-id:type/domain-idarn:aws:es:us-east-2:111222333444:domain/my-domain -
域必须配置为使用 OpenSearch 版本 1.0(或更高版本)或 Elasticsearch 版本 6.7(或更高版本)。
-
必须在域上启用精细访问控制。
-
域必须正在运行 OpenSearch。
-
-
选择请求。
跨集群搜索首先验证连接请求,以确保满足先决条件。如果域不兼容,则连接请求将进入 Validation failed 状态。
如果连接请求验证成功,则将其发送到目标域,该请求必须在目标域进行审批。在此审批进行之前,连接将保持 Pending acceptance 状态。当连接请求被目标域接受后,状态将更改为 Active,且目标域变为可供查询。
域页面显示了目标域的整体域运行状况和实例运行状况的详细信息。只有域拥有者具备创建、查看、删除和监控域之间的连接的灵活性。
连接建立之后,在所连接域节点之间流动的任何流量都将进行加密。如果将 VPC 域连接到非 VPC 域,且非 VPC 域是可接收 Internet 流量的公有端点,则域之间的跨集群流量仍是加密且安全的。
通过跨集群搜索测试跨区域和跨账户数据访问的安全设置
通过跨集群搜索为跨区域和跨账户数据访问设置访问权限后,我们建议使用 Postman
使用 Postman 设置您的安全设置
-
在目标域上,为文档编制索引。示例请求如下:
POST https://dst-domain.us-east-1.es.amazonaws.com/books/_doc/1 { "Dracula": "Bram Stoker" } -
要从源域查询此索引,请在查询内包含目标域的连接别名。您可以在域控制面板的连接选项卡上找到连接别名。以下是请求示例及截断响应:
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" } } ] } -
(可选)您可以在单次搜索中创建包含多个域名的配置。例如,假设您设置以下内容:
domain-a到domain-b的连接,连接别名为cluster_bdomain-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 } } ] } }
如果您没有选择在连接设置中跳过不可用集群,搜索的所有目标集群必须可用才能成功运行搜索请求。否则,整个请求将失败——即使只有一个域不可用,也不会返回任何搜索结果。
删除连接
删除连接会停止目标域上的任何跨集群搜索操作。
您可以在源域或目标域上执行以下步骤以删除连接。删除连接之后,其状态为 Deleted,仍会显示 15 天。
不能删除具有活动跨集群连接的域。要删除域,请首先从该域中删除所有传入和传出连接。这是为了确保在删除域之前考虑到了跨集群域用户。
删除连接
-
登录到位于 https://console.aws.amazon.com/aos/home 的 Amazon OpenSearch Service 控制台。
-
在左侧导航栏中,选择域。
-
选择要删除的域名称,然后选择连接选项卡。
-
选择要删除的连接名称。
-
选择删除,然后确认删除。