

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon OpenSearch Service 中的跨叢集搜尋
<a name="cross-cluster-search"></a>

Amazon OpenSearch Service 中的跨叢集搜尋可讓您跨多個已連線網域執行查詢和彙總。通常使用多個較小的網域 (而不是單一大型網域) 會比較有意義，尤其是在執行不同類型工作負載的情況下。

透過工作負載特定網域可執行以下任務：
+ 選擇特定工作負載的執行個體類型以優化每個網域。
+ 建立多個工作負載間的故障隔離界限。也就是說，如果其中一個工作負載失敗，此故障會包含在該特定網域內，而且不會影響其他工作負載。
+ 更輕鬆地跨網域進行擴展。

跨叢集搜尋可支援 OpenSearch Dashboards，因此您可以跨所有網域建立視覺效果和儀表板。對於在網域之間傳輸的搜尋結果，您需要支付[標準 AWS 資料傳輸費用](https://aws.amazon.com/opensearch-service/pricing/)。

**注意**  
開放原始碼 OpenSearch 也有跨叢集搜尋[的文件](https://opensearch.org/docs/latest/search-plugins/cross-cluster-search/)。相較於 受管 Amazon OpenSearch Service 網域，開放原始碼叢集的設定有很大差異。最值得注意的是，在 OpenSearch Service 中，您使用 AWS 管理主控台 而不是透過 cURL 來設定跨叢集連線。此外，除了精細存取控制之外，受管服務還會使用 AWS Identity and Access Management (IAM) 進行跨叢集身分驗證。因此，我們建議您使用本文件而非開放原始碼 OpenSearch 文件，為您的網域設定跨叢集搜尋。

**Topics**
+ [

## 限制
](#cross-cluster-search-limitations)
+ [

## 跨叢集搜尋先決條件
](#cross-cluster-search-pp)
+ [

## 跨叢集搜尋定價
](#cross-cluster-search-pricing)
+ [

## 設定連線
](#cross-cluster-search-set-up-connection)
+ [

## 移除連線
](#cross-cluster-search-remove-connection)
+ [

## 設定安全性和範例演練
](#cross-cluster-search-walkthrough)
+ [

## OpenSearch Dashboards
](#cross-cluster-search-dashboards)

## 限制
<a name="cross-cluster-search-limitations"></a>

跨叢集搜尋有多項重要限制：
+ 您無法將 Elasticsearch 網域連線至 OpenSearch 網域。
+ 您無法連線至自我管理的 OpenSearch/Elasticsearch 叢集。
+ 若要連線區域間的網域，這兩個網域都必須位於 Elasticsearch 7.10 或更高版本或 OpenSearch 上。
+ 一個網域最多可以有 20 個外寄連線。同樣地，一個網域最多可以有 20 個傳入連線。換句話說，一個網域最多可連線到 20 個其他網域。
+ 來源網域的版本必須與目的地網域相同或更高。如果您在兩個網域之間設定雙向連線，並且想要升級其中一個或兩個網域，您必須先刪除其中一個連線。
+ 您無法將自訂字典或 SQL 使用跨叢集搜尋搭配使用。
+ 您無法使用 CloudFormation 來連接網域。
+ 您無法在 M3 或高載 (T2 和 T3) 執行個體上使用跨叢集搜尋。

## 跨叢集搜尋先決條件
<a name="cross-cluster-search-pp"></a>

設定跨叢集搜尋前，請確認網域符合下列需求：
+ 兩個 OpenSearch 網域，或 6.7 版或更新版本的 Elasticsearch 網域
+ 已啟用精細存取控制
+ 已啟用節點對節點加密
+ 如果任一網域位於 VPC 中，則必須透過 VPC 對等互連或傳輸閘道來連接網域，且安全群組必須允許它們之間的流量。

## 跨叢集搜尋定價
<a name="cross-cluster-search-pricing"></a>

跨網域搜尋無須額外付費。

## 設定連線
<a name="cross-cluster-search-set-up-connection"></a>

「來源」網域是指跨叢集搜尋請求的來源位置。換句話說，來源網域是您傳送初始搜尋請求的目標位置。

「目的地」網域是來源網域查詢的網域。

跨叢集連線為單向 (從來源到目的地網域)。也就是說，目的地網域無法查詢來源網域。不過，您可以設定相反方向的其他連線。

![\[跨叢集搜尋授權流程\]](http://docs.aws.amazon.com/zh_tw/opensearch-service/latest/developerguide/images/ccs.png)


來源網域會建立「傳出」至目的地網域的連線。目的地網域會接收來自來源網域的「傳入」連線請求。

**如何設定連線**

1. 在網域儀表板上，選擇網域並移至 **Connections** (連線) 索引標籤。

1. 在 **Outbound connections** (傳出連線) 區段中，選擇 **Request** (請求)。

1. 對於 **Connection alias** (連線別名)，輸入連線的名稱。

1. 選擇連線到您 AWS 帳戶 和 區域中的網域，或另一個帳戶或區域中的網域。
   + 若要連線到 AWS 帳戶 和 區域中的叢集，請從下拉式功能表中選取網域，然後選擇**請求**。
   + 若要連線到另一個 AWS 帳戶 或區域中的叢集，請選取遠端網域的 ARN，然後選擇**請求**。若要連線區域間的網域，這兩個網域必須執行 Elasticsearch 7.10 或更高版本或 OpenSearch。

1. 若要略過叢集查詢無法使用的叢集，請選取**略過無法使用**。此設定可確保跨叢集查詢即使一或多個遠端叢集發生故障，仍會傳回部分結果。

1. 跨叢集搜尋會先驗證連線請求，確認是否符合先決條件。如果發現網域不相容，連線請求則會進入 `Validation failed` 狀態。

1. 連線請求驗證成功後，則會傳送至目的地網域，需要在這裡進行核准。在此核准發生前，連線會保持在 `Pending acceptance` 狀態。在目的地網域接受連線請求後，狀態會變更為 `Active`，而目的地網域會變為可供查詢。
   + 網域頁面會顯示目的地網域的整體網域運作狀態和執行個體運作狀態詳細資訊。只有網域擁有者才能靈活建立、檢視、移除和監控與其網域的連線。

建立連線後，在連線網域節點之間流動的任何流量都會加密。如果您將 VPC 網域連接至非 VPC 網域，且該非 VPC 網域是可從網際網路接收流量的公有端點，網域之間的跨叢集流量仍為加密且安全的狀態。

## 移除連線
<a name="cross-cluster-search-remove-connection"></a>

移除連線會停止其索引上的任何跨叢集操作。

1. 在網域儀表板上，前往 **Connections** (連線) 索引標籤。

1. 選取您要移除的網域連線並選擇 **Delete** (刪除)，然後確認刪除。

您可以在來源或目的地網域上執行這些步驟，以移除連線。移除連線後，在 15 天內仍可見，狀態為 `Deleted`。

您無法刪除具有作用中跨叢集連線的網域。若要刪除網域，請先從該網域中移除所有傳入和傳出連線。這可確保您在刪除網域前，將跨叢集網域使用者納入考量。

## 設定安全性和範例演練
<a name="cross-cluster-search-walkthrough"></a>

1. 您會將跨叢集搜尋請求傳送至來源網域。

1. 來源網域會根據其網域存取政策評估請求。由於跨叢集搜尋需要精細存取控制，建議您在來源網域上使用開放式存取政策。

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

****  

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

------
**注意**  
如果您在路徑中包含遠端索引，則必須對網域 ARN 中的 URI 進行 URL 編碼。例如，使用 `arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst%3Aremote_index` 而非 `arn:aws:es:us-east-1:123456789012:domain/my-domain/local_index,dst:remote_index`。

   除了精細存取控制以外，如果您還選擇使用限制性存取政策，政策則必須至少允許對 `es:ESHttpGet` 的存取權。

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

****  

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

------

1. 來源網域上的[精細存取控制](fgac.md)會評估請求：
   + 請求是否以有效的 IAM 或 HTTP 基本登入資料簽署？
   + 如果是這樣，使用者是否具備執行搜尋和存取資料的許可？

   如果請求只搜尋目的地網域上的資料 (例如 `dest-alias:dest-index/_search`)，您只需要目的地網域上的許可。

   如果請求同時搜尋兩個網域上的資料 (例如 `source-index,dest-alias:dest-index/_search`)，您需要兩個網域上的許可。

   在精細存取控制中，除了相關索引的標準`read`或`indices:admin/shards/search_shards`許可之外，使用者還必須擁有 `search`許可。

1. 來源網域會將請求傳遞至目的地網域。目的地網域會根據其網域存取政策評估此請求。您必須在目的地網域上包含 `es:ESCrossClusterGet` 許可：

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

****  

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

------

   確認已針對 `/dst-domain` (而不是 `/dst-domain/*`) 套用 `es:ESCrossClusterGet` 許可。

   不過，此最低政策只允許跨叢集搜尋。若執行其他操作 (例如為文件編製索引和執行標準搜尋)，則需要額外的許可。建議在目的地網域上使用下列政策：

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

****  

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

------
**注意**  
根據預設，網域之間的所有跨叢集搜尋請求在傳輸中都會經過加密，做為節點對節點加密的一部分。

1. 目的地網域會執行搜尋並將結果傳回至來源網域。

1. 來源網域會將其自身結果 (如果有的話) 與來自目的地網域的結果加以結合，然後將其傳回給您。

1. 建議針對測試請求使用 [Postman](https://www.postman.com/)：
   + 在目的地網域上，為文件編製索引：

     ```
     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"
           }
         }
       ]
     }
     ```

     您可以在網域儀表板的 **Connections** (連線) 索引標籤上找到連線別名。
   + 如果在具有連線別名 `cluster_b` 的 `domain-a -> domain-b` 與具有連線別名 `cluster_c` 的 `domain-a -> domain-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
             }
           }
         ]
       }
     }
     ```

     如果您未選擇在連線設定中略過無法使用的叢集，則您搜尋的所有目的地叢集都必須可供搜尋請求成功執行。否則，整個請求會失敗，即使其中一個網域無法使用，也不會傳回任何搜尋結果。

## OpenSearch Dashboards
<a name="cross-cluster-search-dashboards"></a>

您可以透過與從單一網域相同的方式，從多個連線網域視覺化資料，但您必須使用 `connection-alias:index` 存取遠端索引時除外。因此，索引模式必須符合 `connection-alias:index`。