Google Cloud Storage リポジトリ

Google Cloud Storage サービスを Snapshot/Restore のリポジトリとして使用できます。

はじめに

このリポジトリタイプは、Google Cloud Java Client for Storage を使用してストレージサービスに接続します。Google Cloud Storage を初めて使用する場合は、Google Cloud Platform Console に接続して新しいプロジェクトを作成する必要があります。プロジェクトが作成されたら、プロジェクトのために Cloud Storage サービスを有効にする必要があります。

バケットの作成

Google Cloud Storage サービスは、すべてのデータのコンテナとして バケット の概念を使用します。バケットは通常、Google Cloud Platform Console を使用して作成されます。このリポジトリタイプはバケットを自動的に作成しません。

新しいバケットを作成するには:

  • 1. Google Cloud Platform Console に接続します。
  • 2. プロジェクトを選択します。
  • 3. Storage Browser に移動します。
  • 4. Create Bucket ボタンをクリックします。
  • 5. 新しいバケットの名前を入力します。
  • 6. ストレージクラスを選択します。
  • 7. ロケーションを選択します。
  • 8. Create ボタンをクリックします。

詳細な手順については、Google Cloud ドキュメント を参照してください。

サービス認証

リポジトリは、Google Cloud Storage サービスへのリクエストを認証する必要があります。Google クライアントライブラリが application default credentials という戦略を採用することは一般的です。しかし、その戦略は Elasticsearch によって 部分的にサポート されています。リポジトリは、セキュリティマネージャーが有効な状態で実行される Elasticsearch プロセスの下で動作します。セキュリティマネージャーは、環境変数 GOOGLE_APPLICATION_CREDENTIALS がディスク上のローカルファイルを指すときに「自動的」な資格情報の発見を妨げます。ただし、Elasticsearch を実行しているリソースに添付されたサービスアカウントを取得することはできます。または、Compute Engine、Kubernetes Engine、または App Engine が提供するデフォルトのサービスアカウントにフォールバックすることもできます。自動資格情報の発見をサポートしない環境を使用している場合は、サービスアカウント の資格情報を構成する必要があります。

サービスアカウントの使用

サービスアカウント資格情報 を手動で取得して提供する必要があります。

JSON サービスアカウントファイルの生成に関する詳細情報は、Google Cloud ドキュメント を参照してください。このリポジトリタイプでは PKCS12 形式はサポートされていません。

手順の概要は次のとおりです:

  • 1. Google Cloud Platform Console に接続します。
  • 2. プロジェクトを選択します。
  • 3. Service Accounts タブを選択します。
  • 4. Create service account をクリックします。
  • 5. アカウントが作成されたら、それを選択し、Keys に移動します。
  • 6. Add Key を選択し、次に Create new key を選択します。
  • 7. Key Type として JSON を選択します。P12 はサポートされていません。

JSON サービスアカウントファイルは次のようになります:

Js

  1. {
  2. "type": "service_account",
  3. "project_id": "your-project-id",
  4. "private_key_id": "...",
  5. "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  6. "client_email": "service-account-for-your-repository@your-project-id.iam.gserviceaccount.com",
  7. "client_id": "...",
  8. "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  9. "token_uri": "https://accounts.google.com/o/oauth2/token",
  10. "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  11. "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[email protected]"
  12. }

このファイルをリポジトリに提供するには、Elasticsearch keystore に保存する必要があります。file 設定を gcs.client.NAME.credentials_file という名前で追加し、add-file サブコマンドを使用します。NAME はリポジトリのクライアント構成の名前です。暗黙のクライアント名は default ですが、リポジトリ設定で client キーを使用して異なるクライアント名を指定できます。

GOOGLE_APPLICATION_CREDENTIALS 環境変数を介してファイルパスを渡すことは サポートされていません

たとえば、keystore に gcs.client.my_alternate_client.credentials_file 設定を追加した場合、次のようにしてリポジトリがそれらの資格情報を使用するように構成できます:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_gcs_repository",
  3. repository={
  4. "type": "gcs",
  5. "settings": {
  6. "bucket": "my_bucket",
  7. "client": "my_alternate_client"
  8. }
  9. },
  10. )
  11. print(resp)
  12. ``````@
  13. #### Js
  14. ``````js
  15. const response = await client.snapshot.createRepository({
  16. name: "my_gcs_repository",
  17. repository: {
  18. type: "gcs",
  19. settings: {
  20. bucket: "my_bucket",
  21. client: "my_alternate_client",
  22. },
  23. },
  24. });
  25. console.log(response);

Console

  1. PUT _snapshot/my_gcs_repository
  2. {
  3. "type": "gcs",
  4. "settings": {
  5. "bucket": "my_bucket",
  6. "client": "my_alternate_client"
  7. }
  8. }

credentials_file 設定は reloadable です。これらの設定はノードが起動する前に定義するか、設定が定義された後に Nodes reload secure settings API を呼び出して実行中のノードに適用できます。

設定をリロードした後、スナップショットの内容を転送するために使用される内部 gcs クライアントは、keystore から最新の設定を利用します。

進行中のスナップショットまたはリストアジョブは、クライアントの credentials_file 設定の リロード によって中断されることはありません。操作が開始されたときに構築されたクライアントを使用して完了します。

クライアント設定

Google Cloud Storage に接続するために使用されるクライアントには、いくつかの設定が利用可能です。クライアント設定名は gcs.client.CLIENT_NAME.SETTING_NAME の形式で、elasticsearch.yml 内に指定されます。gcs リポジトリによって検索されるデフォルトのクライアント名は default と呼ばれますが、リポジトリ設定 client でカスタマイズできます。

たとえば:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_gcs_repository",
  3. repository={
  4. "type": "gcs",
  5. "settings": {
  6. "bucket": "my_bucket",
  7. "client": "my_alternate_client"
  8. }
  9. },
  10. )
  11. print(resp)
  12. ``````@
  13. #### Js
  14. ``````js
  15. const response = await client.snapshot.createRepository({
  16. name: "my_gcs_repository",
  17. repository: {
  18. type: "gcs",
  19. settings: {
  20. bucket: "my_bucket",
  21. client: "my_alternate_client",
  22. },
  23. },
  24. });
  25. console.log(response);

Console

  1. PUT _snapshot/my_gcs_repository
  2. {
  3. "type": "gcs",
  4. "settings": {
  5. "bucket": "my_bucket",
  6. "client": "my_alternate_client"
  7. }
  8. }

一部の設定は機密性が高く、Elasticsearch keystore に保存する必要があります。これはサービスアカウントファイルに該当します:

  1. bin/elasticsearch-keystore add-file gcs.client.default.credentials_file /path/service-account.json

以下は利用可能なクライアント設定です。keystore に保存する必要があるものは Secure としてマークされています。

  • credentials_file (Secure, reloadable)
  • Google Cloud Storage サービスに認証するために使用されるサービスアカウントファイル。
  • endpoint
  • 接続するための Google Cloud Storage サービスエンドポイント。これは Google Cloud Storage クライアントによって自動的に決定されますが、明示的に指定することもできます。
  • connect_timeout
  • Google Cloud Storage サービスへの接続を確立するためのタイムアウト。値は単位を指定する必要があります。たとえば、5s の値は 5 秒のタイムアウトを指定します。-1 の値は無限のタイムアウトに対応します。デフォルト値は 20 秒です。
  • read_timeout
  • 確立された接続からデータを読み取るためのタイムアウト。値は単位を指定する必要があります。たとえば、5s の値は 5 秒のタイムアウトを指定します。-1 の値は無限のタイムアウトに対応します。デフォルト値は 20 秒です。
  • application_name
  • Google Cloud Storage サービスを使用する際にクライアントによって使用される名前。カスタム名を設定することは、Google Cloud Platform にリクエスト統計がログされる際にクラスターを認証するのに役立ちます。デフォルトは repository-gcs です。
  • project_id
  • Google Cloud プロジェクト ID。これは資格情報ファイルから自動的に推測されますが、明示的に指定することもできます。たとえば、同じ資格情報が本番プロジェクトと開発プロジェクトの両方で使用可能な場合、プロジェクト間で切り替えるために使用できます。
  • proxy.host
  • Google Cloud Storage を介って接続するためのプロキシのホスト名。
  • proxy.port
  • Google Cloud Storage を介って接続するためのプロキシのポート。
  • proxy.type
  • クライアントのプロキシタイプ。サポートされている値は direct (プロキシなし)、http、および socks です。デフォルトは direct です。

リポジトリ設定

gcs リポジトリタイプは、Google Cloud Storage にデータがどのように保存されるかをカスタマイズするための設定をいくつかサポートしています。

これらはリポジトリを作成する際に指定できます。たとえば:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_gcs_repository",
  3. repository={
  4. "type": "gcs",
  5. "settings": {
  6. "bucket": "my_other_bucket",
  7. "base_path": "dev"
  8. }
  9. },
  10. )
  11. print(resp)
  12. ``````@
  13. #### Js
  14. ``````js
  15. const response = await client.snapshot.createRepository({
  16. name: "my_gcs_repository",
  17. repository: {
  18. type: "gcs",
  19. settings: {
  20. bucket: "my_other_bucket",
  21. base_path: "dev",
  22. },
  23. },
  24. });
  25. console.log(response);

Console

  1. PUT _snapshot/my_gcs_repository
  2. {
  3. "type": "gcs",
  4. "settings": {
  5. "bucket": "my_other_bucket",
  6. "base_path": "dev"
  7. }
  8. }

次の設定がサポートされています:

  • bucket
  • スナップショットに使用されるバケットの名前。(必須)
  • client
  • Google Cloud Storage に接続するために使用するクライアントの名前。デフォルトは default です。
  • base_path
  • リポジトリデータのためのバケット内のパスを指定します。デフォルトはバケットのルートです。
    Elastic Cloud Enterprise のスナップショットリポジトリを構成する際に base_path を設定しないでください。Elastic Cloud Enterprise は、複数のデプロイメントが同じバケットを共有できるように、各デプロイメントのために base_path を自動的に生成します。
  • chunk_size
  • 大きなファイルは、スナップショット作成中に blob ストア内の複数の小さな blob に分割できます。この値をデフォルトから変更することは推奨されません。リポジトリ内の blob のサイズを制限する明示的な理由がない限り、デフォルトよりも小さい値を設定すると、スナップショット作成やリストア操作中に Google Cloud Storage サービスへの API コールの数が増加し、両方の操作が遅くなり、コストがかかる可能性があります。チャンクサイズを値と単位で指定します。たとえば: 10MB, 5KB, 500B。デフォルトは Google Cloud Storage サービス内の blob の最大サイズで、5TB です。
  • compress
  • true に設定すると、メタデータファイルは圧縮形式で保存されます。この設定は、デフォルトで既に圧縮されているインデックスファイルには影響しません。デフォルトは true です。
  • max_restore_bytes_per_sec
  • (オプション、バイト値) ノードごとの最大スナップショットリストアレート。デフォルトは無制限です。リストアは 回復設定 を通じても制限されることに注意してください。
  • max_snapshot_bytes_per_sec
  • (オプション、バイト値) ノードごとの最大スナップショット作成レート。デフォルトは 40mb 秒あたりです。管理サービスの 回復設定 が設定されている場合、デフォルトは無制限になり、レートはさらに 回復設定 を通じて制限されます。

  • readonly

  • (オプション、ブール値) true の場合、リポジトリは読み取り専用です。クラスターはリポジトリからスナップショットを取得およびリストアできますが、リポジトリに書き込んだり、スナップショットを作成したりすることはできません。
    書き込みアクセス権を持つクラスターのみがリポジトリにスナップショットを作成できます。リポジトリに接続されている他のすべてのクラスターは、readonly パラメータを true に設定する必要があります。
    false の場合、クラスターはリポジトリに書き込み、スナップショットを作成できます。デフォルトは false です。
    同じスナップショットリポジトリを複数のクラスターで登録する場合、1 つのクラスターのみがリポジトリへの書き込みアクセス権を持つべきです。同時に複数のクラスターがリポジトリに書き込むと、リポジトリの内容が破損するリスクがあります。
  • application_name
  • [6.3.0] 6.3.0 で非推奨。この設定は現在 クライアント設定 に定義されています。Google Cloud Storage サービスを使用する際にクライアントによって使用される名前。

推奨されるバケット権限

バケットにアクセスするために使用されるサービスアカウントは、バケットに対して「Writer」アクセス権を持っている必要があります:

  • 1. Google Cloud Platform Console に接続します。
  • 2. プロジェクトを選択します。
  • 3. Storage Browser に移動します。
  • 4. バケットを選択し、「Edit bucket permission」を選択します。
  • 5. サービスアカウントは「User」として「Writer」アクセス権を持つように構成する必要があります。

線形可変レジスタの実装

GCS リポジトリの線形可変レジスタの実装は、put-blob 操作に対する強い整合性の前提条件に基づいています。レジスタに対して比較と交換の操作を実行するために、Elasticsearch はレジスタの blob とその現在の世代を取得し、観察された世代を前提条件として使用して更新された blob をアップロードします。この前提条件は、その間に世代が変更されていないことを保証します。