クラスター間でのES|QLの使用

ES|QLのクラスター間検索は技術プレビュー中であり、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。

ES|QLを使用すると、複数のクラスターにわたって単一のクエリを実行できます。

前提条件

  • クラスター間検索にはリモートクラスターが必要です。Elasticsearch Serviceでリモートクラスターを設定するには、Elasticsearch Serviceでのリモートクラスターの設定を参照してください。自分のハードウェアでElasticsearchを実行している場合は、リモートクラスターを参照してください。
    リモートクラスターの設定がクラスター間検索をサポートしていることを確認するには、サポートされているクラスター間検索の設定を参照してください。
  • クラスター間検索の完全な機能を利用するには、ローカルクラスターとリモートクラスターが同じサブスクリプションレベルである必要があります。
  • ローカルコーディネーティングノードは、remote_cluster_clientノードロールを持っている必要があります。
  • スニッフモードを使用する場合、ローカルコーディネーティングノードはリモートクラスターのシードノードおよびゲートウェイノードに接続できる必要があります。コーディネーティングノードとして機能できるゲートウェイノードの使用をお勧めします。シードノードはこれらのゲートウェイノードのサブセットである可能性があります。
  • プロキシモードを使用する場合、ローカルコーディネーティングノードは設定されたproxy_addressに接続できる必要があります。このアドレスのプロキシは、リモートクラスターのゲートウェイおよびコーディネーティングノードへの接続をルーティングできる必要があります。
  • クラスター間検索には、ローカルクラスターとリモートクラスターで異なるセキュリティ権限が必要です。クラスター間検索のための権限の設定およびリモートクラスターを参照してください。

セキュリティモデル

Elasticsearchは、クラスター間検索(CCS)用に2つのセキュリティモデルをサポートしています:

クラスターに接続するために使用されているセキュリティモデルを確認するには、GET _remote/infoを実行します。APIキー認証メソッドを使用している場合、応答に"cluster_credentials"キーが表示されます。

TLS証明書認証

TLS証明書認証は、相互TLSを使用してリモートクラスターを保護します。これは、単一の管理者が両方のクラスターを完全に制御している場合に好まれるモデルです。一般的に、役割とその権限は両方のクラスターで同一であることをお勧めします。

前提条件および詳細な設定手順については、TLS証明書認証を参照してください。

APIキー認証

以下の情報は、APIキーに基づくセキュリティモデルを使用してクラスター間でES|QLを使用することに関するものです。そのページの完全な設定手順に従う必要があります。このページには、ES|QLに特有の追加情報のみが含まれています。

APIキーに基づくクラスター間検索(CCS)は、クラスター間の許可されたアクションに対するより詳細な制御を可能にします。これは、異なるクラスターに異なる管理者がいる場合や、誰がどのデータにアクセスできるかをより制御したい場合に好まれるモデルです。このモデルでは、クラスター管理者はクラスターとユーザーに与えられるアクセスを明示的に定義する必要があります。

次の手順を実行する必要があります:

APIキーに基づくセキュリティモデルでES|QLを使用するには、従来のクエリDSLベースの検索を使用する場合には必要ないかもしれない追加の権限が必要です。以下の例のAPI呼び出しは、APIキーに基づくセキュリティモデルを使用してES|QLを使用してリモートインデックスをクエリできる役割を作成します。最終的な権限であるremote_clusterは、リモートエンリッチ操作を許可するために必要です。

Python

  1. resp = client.security.put_role(
  2. name="remote1",
  3. cluster=[
  4. "cross_cluster_search"
  5. ],
  6. indices=[
  7. {
  8. "names": [
  9. ""
  10. ],
  11. "privileges": [
  12. "read"
  13. ]
  14. }
  15. ],
  16. remote_indices=[
  17. {
  18. "names": [
  19. "logs-*"
  20. ],
  21. "privileges": [
  22. "read",
  23. "read_cross_cluster"
  24. ],
  25. "clusters": [
  26. "my_remote_cluster"
  27. ]
  28. }
  29. ],
  30. remote_cluster=[
  31. {
  32. "privileges": [
  33. "monitor_enrich"
  34. ],
  35. "clusters": [
  36. "my_remote_cluster"
  37. ]
  38. }
  39. ],
  40. )
  41. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "remote1",
  3. cluster: ["cross_cluster_search"],
  4. indices: [
  5. {
  6. names: [""],
  7. privileges: ["read"],
  8. },
  9. ],
  10. remote_indices: [
  11. {
  12. names: ["logs-*"],
  13. privileges: ["read", "read_cross_cluster"],
  14. clusters: ["my_remote_cluster"],
  15. },
  16. ],
  17. remote_cluster: [
  18. {
  19. privileges: ["monitor_enrich"],
  20. clusters: ["my_remote_cluster"],
  21. },
  22. ],
  23. });
  24. console.log(response);

コンソール

  1. POST /_security/role/remote1
  2. {
  3. "cluster": ["cross_cluster_search"],
  4. "indices": [
  5. {
  6. "names" : [""],
  7. "privileges": ["read"]
  8. }
  9. ],
  10. "remote_indices": [
  11. {
  12. "names": [ "logs-*" ],
  13. "privileges": [ "read","read_cross_cluster" ],
  14. "clusters" : ["my_remote_cluster"]
  15. }
  16. ],
  17. "remote_cluster": [
  18. {
  19. "privileges": [
  20. "monitor_enrich"
  21. ],
  22. "clusters": [
  23. "my_remote_cluster"
  24. ]
  25. }
  26. ]
  27. }
ローカル クラスターにはcross_cluster_searchクラスター権限が必要です。
通常、ユーザーはローカルおよびリモートインデックスの両方を読み取る権限を持っています。ただし、役割がリモートクラスターのみを検索することを意図している場合、ローカルクラスターにはread権限が必要です。ローカルクラスターへの読み取りアクセスを提供し、ローカルクラスター内のインデックスを読み取ることを禁止するには、namesフィールドを空の文字列にすることができます。
リモートクラスターへの読み取りアクセスが許可されているインデックス。設定されたクラスター間APIキーもこのインデックスの読み取りを許可する必要があります。
APIキーに基づくセキュリティモデルでクラスター間でES/QLを使用する場合、read_cross_cluster権限は常に必要です。
これらの権限が適用されるリモートクラスター。
このリモートクラスターは、クラスター間APIキーで構成され、リモートインデックスをクエリする前にリモートクラスターに接続されている必要があります。
リモートクラスター情報 APIを使用して接続を確認します。
リモートエンリッチを許可するために必要です。これがないと、ユーザーはリモートクラスターの.enrichインデックスから読み取ることができません。remote_clusterセキュリティ権限は、バージョン8.15.0で導入されました。

その後、上記で作成した権限を持つユーザーまたはAPIキーが必要です。以下の例のAPI呼び出しは、remote1役割を持つユーザーを作成します。

Python

  1. resp = client.security.put_user(
  2. username="remote_user",
  3. password="<PASSWORD>",
  4. roles=[
  5. "remote1"
  6. ],
  7. )
  8. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "remote_user",
  3. password: "<PASSWORD>",
  4. roles: ["remote1"],
  5. });
  6. console.log(response);

コンソール

  1. POST /_security/user/remote_user
  2. {
  3. "password" : "<PASSWORD>",
  4. "roles" : [ "remote1" ]
  5. }

ローカルクラスターからのすべてのクラスター間リクエストは、リモートクラスターの管理者によって制御されるクラスター間APIキーの権限に制約されることを忘れないでください。

バージョン8.15.0以前に作成されたクラスター間APIキーは、ES|QLとENRICHに必要な新しい権限を追加するために置き換えるか更新する必要があります。

リモートクラスターの設定

セキュリティモデルが設定されると、リモートクラスターを追加できます。

次のクラスター更新設定 APIリクエストは、3つのリモートクラスターを追加します:cluster_onecluster_twocluster_three

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "cluster": {
  4. "remote": {
  5. "cluster_one": {
  6. "seeds": [
  7. "35.238.149.1:9300"
  8. ],
  9. "skip_unavailable": True
  10. },
  11. "cluster_two": {
  12. "seeds": [
  13. "35.238.149.2:9300"
  14. ],
  15. "skip_unavailable": False
  16. },
  17. "cluster_three": {
  18. "seeds": [
  19. "35.238.149.3:9300"
  20. ]
  21. }
  22. }
  23. }
  24. },
  25. )
  26. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. cluster: {
  5. remote: {
  6. cluster_one: {
  7. seeds: [
  8. '35.238.149.1:9300'
  9. ],
  10. skip_unavailable: true
  11. },
  12. cluster_two: {
  13. seeds: [
  14. '35.238.149.2:9300'
  15. ],
  16. skip_unavailable: false
  17. },
  18. cluster_three: {
  19. seeds: [
  20. '35.238.149.3:9300'
  21. ]
  22. }
  23. }
  24. }
  25. }
  26. }
  27. )
  28. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. cluster: {
  4. remote: {
  5. cluster_one: {
  6. seeds: ["35.238.149.1:9300"],
  7. skip_unavailable: true,
  8. },
  9. cluster_two: {
  10. seeds: ["35.238.149.2:9300"],
  11. skip_unavailable: false,
  12. },
  13. cluster_three: {
  14. seeds: ["35.238.149.3:9300"],
  15. },
  16. },
  17. },
  18. },
  19. });
  20. console.log(response);

コンソール

  1. PUT _cluster/settings
  2. {
  3. "persistent": {
  4. "cluster": {
  5. "remote": {
  6. "cluster_one": {
  7. "seeds": [
  8. "35.238.149.1:9300"
  9. ],
  10. "skip_unavailable": true
  11. },
  12. "cluster_two": {
  13. "seeds": [
  14. "35.238.149.2:9300"
  15. ],
  16. "skip_unavailable": false
  17. },
  18. "cluster_three": {
  19. "seeds": [
  20. "35.238.149.3:9300"
  21. ]
  22. }
  23. }
  24. }
  25. }
  26. }
cluster_threeskip_unavailableが設定されていなかったため、falseのデフォルトを使用します。詳細については、オプションのリモートクラスターのセクションを参照してください。

複数のクラスターにわたるクエリ

  1. #### Esql
  2. ``````esql
  3. FROM cluster_one:my-index-000001
  4. | LIMIT 10
  5. `

同様に、このES|QLリクエストは、3つのクラスターからmy-index-000001インデックスをクエリします:

  • ローカル(「クエリ中」)クラスター
  • 2つのリモートクラスター、cluster_onecluster_two

Esql

  1. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  2. | LIMIT 10

同様に、このES|QLリクエストは、すべてのリモートクラスター(cluster_onecluster_two、およびcluster_three)からmy-index-000001インデックスをクエリします:

Esql

  1. FROM *:my-index-000001
  2. | LIMIT 10

クラスター間でのエンリッチ

ES|QLのクラスター間でのエンリッチは、ローカルエンリッチと同様に機能します。エンリッチポリシーとそのエンリッチインデックスがすべてのクラスターで一貫している場合、リモートクラスターがない場合と同様にエンリッチコマンドを記述するだけです。このデフォルトモードでは、ES|QLはローカルクラスターまたはリモートクラスターのいずれかでエンリッチコマンドを実行でき、計算やクラスター間データ転送を最小限に抑えることを目指します。ポリシーがローカルクラスターとリモートクラスターの両方で一貫したデータを持っていることを確認することは、ES|QLが一貫したクエリ結果を生成するために重要です。

APIキーに基づくセキュリティモデルを使用したES|QLのクラスター間でのエンリッチは、バージョン8.15.0で導入されました。バージョン8.15.0以前に作成されたクラスター間APIキーは、新しい必要な権限を使用するために置き換えるか更新する必要があります。APIキー認証セクションの例を参照してください。

次の例では、cluster_oneリモートクラスターでhostsポリシーを使用してエンリッチを実行できます。

Esql

  1. FROM my-index-000001,cluster_one:my-index-000001
  2. | ENRICH hosts ON ip
  3. | LIMIT 10

リモートクラスターに対してのみES|QLクエリを使用したエンリッチもローカルクラスターで発生する可能性があります。これは、以下のクエリがローカルクラスターにもhostsエンリッチポリシーが存在する必要があることを意味します。

Esql

  1. FROM cluster_one:my-index-000001,cluster_two:my-index-000001
  2. | LIMIT 10
  3. | ENRICH hosts ON ip

コーディネーターモードでのエンリッチ

ES|QLは、ES|QLがローカルクラスターでエンリッチコマンドを実行するように強制する_coordinatorモードを提供します。このモードは、リモートクラスターでエンリッチポリシーが利用できない場合や、クラスター間でエンリッチインデックスの一貫性を維持することが困難な場合に使用する必要があります。

Esql

  1. FROM my-index-000001,cluster_one:my-index-000001
  2. | ENRICH _coordinator:hosts ON ip
  3. | SORT host_name
  4. | LIMIT 10
  1. ### リモートモードでのエンリッチ
  2. ES|QLは、ターゲットインデックスが存在する各リモートクラスターでエンリッチコマンドを独立して実行するようにES|QLを強制する`````_remote`````モードも提供します。このモードは、ターゲット(メイン)インデックスがこれらのホストからのログイベントを含む各地域のホストの詳細情報など、各クラスターで異なるエンリッチデータを管理するのに便利です。
  3. 以下の例では、`````hosts`````エンリッチポリシーがすべてのリモートクラスターに存在する必要があります:`````querying`````クラスター(ローカルインデックスが含まれているため)、リモートクラスター`````cluster_one`````、および`````cluster_two`````
  4. #### Esql
  5. ``````esql
  6. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  7. | ENRICH _remote:hosts ON ip
  8. | SORT host_name
  9. | LIMIT 10
  10. `

statsコマンドの後に_remoteエンリッチを実行することはできません。以下の例はエラーになります:

Esql

  1. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  2. | STATS COUNT(*) BY ip
  3. | ENRICH _remote:hosts ON ip
  4. | SORT host_name
  5. | LIMIT 10

複数のエンリッチコマンド

同じクエリに異なるモードで複数のエンリッチコマンドを含めることができます。ES|QLは、それに応じて実行しようとします。たとえば、このクエリは、最初に任意のクラスターでhostsポリシーを使用してエンリッチを実行し、その後ローカルクラスターでvendorsポリシーを使用してエンリッチを実行します。

Esql

  1. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  2. | ENRICH hosts ON ip
  3. | ENRICH _coordinator:vendors ON os
  4. | LIMIT 10
  1. #### Esql
  2. ``````esql
  3. FROM my-index-000001,cluster_one:my-index-000001,cluster_two:my-index-000001
  4. | ENRICH _coordinator:hosts ON ip
  5. | ENRICH _remote:vendors ON os
  6. | LIMIT 10
  7. `

ES|QLクエリからクラスターまたはインデックスを除外する

クラスター全体を除外するには、FROMコマンドでクラスターエイリアスの前にマイナス記号を付けます。たとえば:-my_cluster:*:

Esql

  1. FROM my-index-000001,cluster*:my-index-000001,-cluster_three:*
  2. | LIMIT 10

特定のリモートインデックスを除外するには、FROMコマンドでインデックスの前にマイナス記号を付けます。たとえばmy_cluster:-my_index:

Esql

  1. FROM my-index-000001,cluster*:my-index-*,cluster_three:-my-index-000001
  2. | LIMIT 10

オプションのリモートクラスター

ES|QLのクラスター間検索は現在、skip_unavailable設定を尊重していません。その結果、リクエストで指定されたリモートクラスターが利用できないか失敗した場合、ES|QLクエリのクラスター間検索は設定に関係なく失敗します。

私たちは、ES|QLのクラスター間検索の動作を他のクラスター間検索APIと整合させるために積極的に取り組んでいます。これには、応答内の各クラスターに対する詳細な実行情報(実行時間、選択されたターゲットインデックス、シャードなど)を提供することが含まれます。

アップグレード中のクラスター間クエリ

ローカルクラスターでローリングアップグレードを実行している間でも、リモートクラスターを検索することができます。ただし、ローカルコーディネーティングノードの「アップグレード元」と「アップグレード先」バージョンは、リモートクラスターのゲートウェイノードと互換性がある必要があります。

アップグレードの期間を超えて同じクラスター内で複数のバージョンのElasticsearchを実行することはサポートされていません。

アップグレードに関する詳細については、Elasticsearchのアップグレードを参照してください。