S3リポジトリ

AWS S3をスナップショット/復元のリポジトリとして使用できます。

AWS上でのElasticsearchのホスティングソリューションをお探しの場合は、
https://www.elastic.co/cloud/をご覧ください。

はじめに

S3リポジトリを登録するには、リポジトリを作成する際にタイプをs3として指定します。リポジトリは、認証のためにデフォルトでECS IAMロールの資格情報を使用します。また、認証のためにKubernetesサービスアカウントを使用することもできます。

唯一の必須設定はバケット名です:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_s3_repository",
  3. repository={
  4. "type": "s3",
  5. "settings": {
  6. "bucket": "my-bucket"
  7. }
  8. },
  9. )
  10. print(resp)

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_s3_repository",
  3. repository: {
  4. type: "s3",
  5. settings: {
  6. bucket: "my-bucket",
  7. },
  8. },
  9. });
  10. console.log(response);

コンソール

  1. PUT _snapshot/my_s3_repository
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "bucket": "my-bucket"
  6. }
  7. }

クライアント設定

S3に接続するために使用するクライアントには、いくつかの設定があります。設定はs3.client.CLIENT_NAME.SETTING_NAMEの形式を持ちます。デフォルトでは、s3リポジトリはdefaultという名前のクライアントを使用しますが、これはリポジトリ設定clientを使用して変更できます。例えば:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_s3_repository",
  3. repository={
  4. "type": "s3",
  5. "settings": {
  6. "bucket": "my-bucket",
  7. "client": "my-alternate-client"
  8. }
  9. },
  10. )
  11. print(resp)

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_s3_repository",
  3. repository: {
  4. type: "s3",
  5. settings: {
  6. bucket: "my-bucket",
  7. client: "my-alternate-client",
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT _snapshot/my_s3_repository
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "bucket": "my-bucket",
  6. "client": "my-alternate-client"
  7. }
  8. }

ほとんどのクライアント設定は、セキュア設定を除いてelasticsearch.yml構成ファイルに追加できます。セキュア設定はElasticsearchキーストアに追加します。Elasticsearchキーストアの作成と更新に関する詳細は、セキュア設定を参照してください。

例えば、S3にアクセスするために特定の資格情報を使用したい場合は、次のコマンドを実行してこれらの資格情報をキーストアに追加します。

  1. bin/elasticsearch-keystore add s3.client.default.access_key
  2. bin/elasticsearch-keystore add s3.client.default.secret_key
  3. # セッショントークンはオプションであり、次のコマンドは必要ない場合があります
  4. bin/elasticsearch-keystore add s3.client.default.session_token

代わりに、インスタンスロールまたはコンテナロールを使用してS3にアクセスしたい場合は、これらの設定を未設定のままにする必要があります。特定の資格情報の使用からインスタンスロールまたはコンテナロールのデフォルトに切り替えるには、次のようにキーストアからこれらの設定を削除します:

  1. bin/elasticsearch-keystore remove s3.client.default.access_key
  2. bin/elasticsearch-keystore remove s3.client.default.secret_key
  3. # セッショントークンはオプションであり、次のコマンドは必要ない場合があります
  4. bin/elasticsearch-keystore remove s3.client.default.session_token

すべてのクライアントセキュア設定はこのリポジトリタイプでリロード可能です。これらの設定をノードが起動する前に定義するか、設定が定義された後にノードリロードセキュア設定APIを呼び出して、実行中のノードに適用できます。

設定をリロードした後、スナップショットコンテンツを転送するために使用される内部s3クライアントは、キーストアから最新の設定を利用します。既存のs3リポジトリと新しく作成されたリポジトリは、キーストアに保存された新しい値を取得します。

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

以下のリストには、利用可能なクライアント設定が含まれています。キーストアに保存する必要があるものは「セキュア」とマークされており、リロード可能です。他の設定はelasticsearch.ymlファイルに属します。

  • access_key (セキュア, リロード可能)
  • S3アクセスキー。設定されている場合、secret_key設定も指定する必要があります。未設定の場合、クライアントはインスタンスまたはコンテナロールを使用します。
  • secret_key (セキュア, リロード可能)
  • S3シークレットキー。設定されている場合、access_key設定も指定する必要があります。
  • session_token (セキュア, リロード可能)
  • S3セッショントークン。設定されている場合、access_keyおよびsecret_key設定も指定する必要があります。
  • endpoint
  • 接続するS3サービスエンドポイント。デフォルトはs3.amazonaws.comですが、AWSドキュメントには代替のS3エンドポイントがリストされています。S3互換サービスを使用している場合は、サービスのエンドポイントに設定する必要があります。
  • protocol
  • S3に接続するために使用するプロトコル。有効な値はhttpまたはhttpsのいずれかです。デフォルトはhttpsです。HTTPSを使用する場合、このリポジトリタイプはJVM全体のトラストストアを使用してリポジトリの証明書チェーンを検証します。JVMのkeytoolツールを使用して、ルート証明書機関がこのトラストストアに含まれていることを確認してください。S3リポジトリ用のカスタム証明書機関を持っている場合、ElasticsearchのバンドルJDKを使用している場合は、ElasticsearchをアップグレードするたびにCA証明書を再インストールする必要があります。
  • proxy.host
  • S3を介して接続するためのプロキシのホスト名。
  • proxy.port
  • S3を介して接続するためのプロキシのポート。
  • proxy.scheme
  • S3へのプロキシ接続に使用するスキーム。有効な値はhttpまたはhttpsのいずれかです。デフォルトはhttpです。この設定により、プロキシサーバーとの通信に使用されるプロトコルを指定できます。
  • proxy.username (セキュア, リロード可能)
  • proxy.hostに接続するためのユーザー名。
  • proxy.password (セキュア, リロード可能)
  • proxy.hostに接続するためのパスワード。
  • read_timeout
  • (時間値) Elasticsearchがリポジトリへの確立されたオープン接続を介して次のバイトを受信するのを待つ最大時間。デフォルト値は50秒です。
  • max_connections
  • S3への同時接続の最大数。デフォルト値は50です。
  • max_retries
  • S3リクエストが失敗したときに使用する再試行の回数。デフォルト値は3です。
  • use_throttle_retries
  • 再試行を制限するかどうか(つまり、バックオフする必要があるか)。trueまたはfalseである必要があります。デフォルトはtrueです。
  • path_style_access
  • パススタイルアクセスパターンの使用を強制するかどうか。trueの場合、パススタイルアクセスパターンが使用されます。falseの場合、アクセスパターンはAWS Java SDKによって自動的に決定されます(詳細はAWSドキュメントを参照)。デフォルトはfalseです。


    バージョン7.07.17.2、および7.3では、すべてのバケット操作は現在非推奨のパススタイルアクセスパターンを使用していました。デプロイメントがパススタイルアクセスパターンを必要とする場合、アップグレード時にこの設定をtrueに設定する必要があります。

  • disable_chunked_encoding

  • チャンクエンコーディングを無効にするかどうか。falseの場合、チャンクエンコーディングが有効になり、適切な場合に使用されます。trueの場合、チャンクエンコーディングは無効になり、使用されません。これにより、スナップショット操作がより多くのリソースを消費し、完了に時間がかかる可能性があります。チャンクエンコーディングをサポートしていないストレージサービスを使用している場合にのみtrueに設定する必要があります。詳細はAWS Java SDKドキュメントを参照してください。デフォルトはfalseです。
  • region
  • 使用する署名リージョンを指定できます。この設定を手動で指定する必要はほとんどのユースケースではありません。一般的に、SDKは使用する署名リージョンを正しく推測します。これは、v4署名を必要とし、デフォルトのus-east-1以外のリージョンを使用するS3互換APIをサポートするための専門的な設定と見なされるべきです。デフォルトは空の文字列で、SDKは自動的に正しい署名リージョンを決定しようとします。
  • signer_override
  • S3クライアントによるリクエスト署名に使用する署名アルゴリズムの名前を指定できます。この設定を指定する必要はほとんどのユースケースではありません。これは、SDKが自動的に決定する署名アルゴリズムをサポートしないS3互換APIをサポートするための専門的な設定と見なされるべきです。詳細はAWS Java SDKドキュメントを参照してください。デフォルトは空の文字列で、署名アルゴリズムのオーバーライドは使用されません。

リポジトリ設定

  1. #### Python
  2. ``````python
  3. resp = client.snapshot.create_repository(
  4. name="my_s3_repository",
  5. repository={
  6. "type": "s3",
  7. "settings": {
  8. "bucket": "my-bucket",
  9. "another_setting": "setting-value"
  10. }
  11. },
  12. )
  13. print(resp)
  14. `

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_s3_repository",
  3. repository: {
  4. type: "s3",
  5. settings: {
  6. bucket: "my-bucket",
  7. another_setting: "setting-value",
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. PUT _snapshot/my_s3_repository
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "bucket": "my-bucket",
  6. "another_setting": "setting-value"
  7. }
  8. }

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

  • bucket
  • (必須) スナップショットに使用するS3バケットの名前。
    バケット名は、AmazonのS3バケット命名規則に従う必要があります。
  • client
  • S3に接続するために使用するS3クライアントの名前。デフォルトはdefaultです。
  • base_path
  • バケット内のリポジトリデータへのパスを指定します。デフォルトは空の文字列で、リポジトリはバケットのルートにあります。この設定の値は/で始まったり終わったりしてはいけません。
    Elastic Cloud Enterpriseのスナップショットリポジトリを構成する際はbase_pathを設定しないでください。Elastic Cloud Enterpriseは、複数のデプロイメントが同じバケットを共有できるように、各デプロイメントのためにbase_pathを自動的に生成します。
  • chunk_size
  • (バイト値) 大きなファイルは、必要に応じてスナップショット中にチャンクに分割できます。チャンクサイズを値と単位で指定します。例えば:1TB1GB10MB。デフォルトはS3のブロブの最大サイズである5TBです。
  • compress
  • trueに設定すると、メタデータファイルは圧縮形式で保存されます。この設定は、デフォルトで圧縮されているインデックスファイルには影響しません。デフォルトはtrueです。
  • max_restore_bytes_per_sec
  • (オプション、バイト値) ノードごとの最大スナップショット復元率。デフォルトは無制限です。復元は回復設定を通じても制限されます。
  • max_snapshot_bytes_per_sec
  • (オプション、バイト値) ノードごとの最大スナップショット作成率。デフォルトは40mb毎秒です。管理サービスの回復設定が設定されている場合、デフォルトは無制限で、さらに回復設定を通じて制限されます。

  • readonly

  • (オプション、ブール値) trueの場合、リポジトリは読み取り専用です。クラスターはリポジトリからスナップショットを取得および復元できますが、リポジトリに書き込んだり、スナップショットを作成したりすることはできません。
    書き込みアクセス権を持つクラスターのみがリポジトリにスナップショットを作成できます。リポジトリに接続されている他のすべてのクラスターは、readonlyパラメータをtrueに設定する必要があります。
    falseの場合、クラスターはリポジトリに書き込み、スナップショットを作成できます。デフォルトはfalseです。
    同じスナップショットリポジトリを複数のクラスターで登録する場合、1つのクラスターのみがリポジトリへの書き込みアクセス権を持つべきです。複数のクラスターが同時にリポジトリに書き込むと、リポジトリの内容が破損するリスクがあります。
  • server_side_encryption
  • trueに設定すると、ファイルはAES256アルゴリズムを使用してサーバー側で暗号化されます。デフォルトはfalseです。
  • buffer_size
  • (バイト値) チャンクが単一のリクエストを使用してアップロードされるしきい値。これを超えると、S3リポジトリはAWSマルチパートアップロードAPIを使用してチャンクをいくつかの部分に分割し、各部分をbuffer_sizeの長さで独立してアップロードします。バッファサイズを5mb未満に設定することは許可されていません。そうしないと、マルチパートAPIの使用が妨げられ、アップロードエラーが発生する可能性があります。バッファサイズを5gbより大きく設定することもできません。これはS3によって許可される最大アップロードサイズです。デフォルトは100mbまたは5%のJVMヒープの小さい方です。
  • canned_acl
  • S3リポジトリはすべてのS3缶詰ACLをサポートしています:privatepublic-readpublic-read-writeauthenticated-readlog-delivery-writebucket-owner-readbucket-owner-full-control。デフォルトはprivateです。canned_acl設定を使用して缶詰ACLを指定できます。S3リポジトリがバケットとオブジェクトを作成するとき、缶詰ACLがバケットとオブジェクトに追加されます。
  • storage_class
  • リポジトリに書き込まれるオブジェクトのS3ストレージクラスを設定します。値はstandardreduced_redundancystandard_iaonezone_iaintelligent_tieringのいずれかです。デフォルトはstandardです。詳細についてはS3ストレージクラスを参照してください。
  • delete_objects_max_size
  • (数値) DeleteObjectsリクエストに使用される最大バッチサイズを1から1000の範囲で設定します。デフォルトは1000で、これはAWS DeleteObjects APIによってサポートされる最大値です。

以下に文書化されたリポジトリ設定でクライアント設定を定義するオプションは非推奨と見なされ、将来のバージョンで削除される予定です。

上記の設定に加えて、リポジトリ設定にすべての非セキュアクライアント設定を指定することもできます。この場合、リポジトリ設定に見つかったクライアント設定は、リポジトリで使用される名前付きクライアントの設定とマージされます。クライアント設定とリポジトリ設定の間の競合は、リポジトリ設定がクライアント設定よりも優先されることによって解決されます。

例えば:

Python

  1. resp = client.snapshot.create_repository(
  2. name="my_s3_repository",
  3. repository={
  4. "type": "s3",
  5. "settings": {
  6. "client": "my-client",
  7. "bucket": "my-bucket",
  8. "endpoint": "my.s3.endpoint"
  9. }
  10. },
  11. )
  12. print(resp)

Js

  1. const response = await client.snapshot.createRepository({
  2. name: "my_s3_repository",
  3. repository: {
  4. type: "s3",
  5. settings: {
  6. client: "my-client",
  7. bucket: "my-bucket",
  8. endpoint: "my.s3.endpoint",
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. PUT _snapshot/my_s3_repository
  2. {
  3. "type": "s3",
  4. "settings": {
  5. "client": "my-client",
  6. "bucket": "my-bucket",
  7. "endpoint": "my.s3.endpoint"
  8. }
  9. }

これは、my_client_nameクライアントからのすべてのクライアント設定を使用するリポジトリを設定しますが、endpointはリポジトリ設定によってmy.s3.endpointにオーバーライドされます。`

S3ストレージクラス

Amazon S3は、異なる操作特性を提供するさまざまなストレージクラスをサポートしています。たとえば、いくつかのクラスは、保存されたバイトあたりのコストが低いですが、リクエストあたりのコストが高く、他のクラスは可用性の保証に関して異なる場合があります。

Elasticsearchがデータオブジェクトを保存するために使用するストレージクラスをstorage_classリポジトリ設定で指定できます。

既存のリポジトリでstorage_class設定を変更すると、新しく作成されたオブジェクトのストレージクラスにのみ影響し、ストレージクラスの混在使用が発生します。

S3ライフサイクルポリシーを使用して、リポジトリ内の既存のオブジェクトのストレージクラスを調整できますが、グレイシャークラスなどのサポートされていないクラスにオブジェクトを移行してはいけません。また、オブジェクトを期限切れにしてはいけません。グレイシャーストレージクラスや他のサポートされていないストレージクラス、またはオブジェクトの期限切れを使用すると、リポジトリの内容へのアクセスを永久に失う可能性があります。

  1. S3ストレージクラスに関する詳細は、[AWSストレージクラスガイド](https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html)を参照してください。
  2. ## 推奨されるS3権限
  3. Elasticsearchスナップショットプロセスを最小限のリソースに制限するために、既存のS3バケットと組み合わせてAmazon IAMを使用することをお勧めします。以下は、"snaps.example.com"という名前のS3バケットへのスナップショットアクセスを許可するポリシーの例です。これはAWS IAMコンソールを通じて、カスタムポリシーを作成し、次のようなポリシードキュメントを使用して構成できます(snaps.example.comをバケット名に変更)。
  4. #### Js
  5. ``````js
  6. {
  7. "Statement": [
  8. {
  9. "Action": [
  10. "s3:ListBucket",
  11. "s3:GetBucketLocation",
  12. "s3:ListBucketMultipartUploads",
  13. "s3:ListBucketVersions"
  14. ],
  15. "Effect": "Allow",
  16. "Resource": [
  17. "arn:aws:s3:::snaps.example.com"
  18. ]
  19. },
  20. {
  21. "Action": [
  22. "s3:GetObject",
  23. "s3:PutObject",
  24. "s3:DeleteObject",
  25. "s3:AbortMultipartUpload",
  26. "s3:ListMultipartUploadParts"
  27. ],
  28. "Effect": "Allow",
  29. "Resource": [
  30. "arn:aws:s3:::snaps.example.com/*"
  31. ]
  32. }
  33. ],
  34. "Version": "2012-10-17"
  35. }
  36. `

バケット内のプレフィックスを指定することで、権限をさらに制限できます。この例では、”foo”という名前のプレフィックスを指定しています。

Js

  1. {
  2. "Statement": [
  3. {
  4. "Action": [
  5. "s3:ListBucket",
  6. "s3:GetBucketLocation",
  7. "s3:ListBucketMultipartUploads",
  8. "s3:ListBucketVersions"
  9. ],
  10. "Condition": {
  11. "StringLike": {
  12. "s3:prefix": [
  13. "foo/*"
  14. ]
  15. }
  16. },
  17. "Effect": "Allow",
  18. "Resource": [
  19. "arn:aws:s3:::snaps.example.com"
  20. ]
  21. },
  22. {
  23. "Action": [
  24. "s3:GetObject",
  25. "s3:PutObject",
  26. "s3:DeleteObject",
  27. "s3:AbortMultipartUpload",
  28. "s3:ListMultipartUploadParts"
  29. ],
  30. "Effect": "Allow",
  31. "Resource": [
  32. "arn:aws:s3:::snaps.example.com/foo/*"
  33. ]
  34. }
  35. ],
  36. "Version": "2012-10-17"
  37. }

スナップショットのためにリポジトリを登録するには、バケットが存在する必要があります。バケットを作成していない場合、リポジトリの登録は失敗します。

認証のためのKubernetesサービスアカウントのIAMロールの使用

認証のためにKubernetesサービスアカウントを使用したい場合は、リポジトリがサービスアカウントの読み取りアクセスを持つために、S3リポジトリ設定ディレクトリに$AWS_WEB_IDENTITY_TOKEN_FILE環境変数(Kubernetesポッドによって自動的に設定されるべき)へのシンボリックリンクを追加する必要があります(リポジトリは設定ディレクトリの外のファイルを読み取ることはできません)。例えば:

Bash

  1. mkdir -p "${ES_PATH_CONF}/repository-s3"
  2. ln -s $AWS_WEB_IDENTITY_TOKEN_FILE "${ES_PATH_CONF}/repository-s3/aws-web-identity-token-file"

シンボリックリンクは、すべてのデータおよびマスターノードに作成され、elasticsearchユーザーによって読み取れる必要があります。デフォルトでは、Elasticsearchはユーザーelasticsearchとして、uid:gid 1000:0を使用して実行されます。

シンボリックリンクが存在する場合、明示的なclient資格情報を持たないすべてのS3リポジトリによってデフォルトで使用されます。

マルチパートアップロードのクリーンアップ

Elasticsearchは、S3のマルチパートアップロードプロセスを使用して、リポジトリに大きなブロブをアップロードします。マルチパートアップロードプロセスは、各ブロブを小さな部分に分割し、各部分を独立してアップロードし、その後、別のステップでアップロードを完了することによって機能します。これにより、アップロードが失敗した場合にElasticsearchが再送信しなければならないデータの量が減ります:Elasticsearchは、全体のブロブの最初から再送信するのではなく、失敗した部分のみを再送信する必要があります。各部分のストレージは、部分がアップロードされた時点から独立して課金されます。

マルチパートアップロードが完了できない場合は、成功裏にアップロードされた部分を削除するために中止する必要があります。これにより、さらなるストレージ料金の蓄積を防ぎます。Elasticsearchは失敗時に自動的にマルチパートアップロードを中止しますが、時には中止リクエスト自体が失敗することがあります。たとえば、リポジトリにアクセスできなくなったり、Elasticsearchが実行されているインスタンスが突然終了した場合、Elasticsearchは進行中のアップロードを完了または中止できません。

失敗したアップロードが最終的に中止されることを確認し、不要なストレージコストを回避する必要があります。マルチパートアップロードのリストAPIを使用して進行中のアップロードをリストし、異常に長時間実行されているものを探すか、バケットライフサイクルポリシーを構成して、特定の年齢に達した未完了のアップロードを自動的に中止することができます。

AWS VPC帯域幅設定

AWSインスタンスはS3エンドポイントをパブリックIPに解決します。ElasticsearchインスタンスがAWS VPCのプライベートサブネットに存在する場合、S3へのすべてのトラフィックはVPCのNATインスタンスを通過します。VPCのNATインスタンスが小さいインスタンスサイズ(例:t2.micro)であるか、高いネットワークトラフィックを処理している場合、S3への帯域幅はそのNATインスタンスのネットワーク帯域幅制限によって制限される可能性があります。代わりに、プライベートサブネットに存在するインスタンスがS3に接続できるようにするVPCエンドポイントを作成することをお勧めします。これにより、VPCのNATインスタンスのネットワーク帯域幅によって課せられる制限が排除されます。

AWS VPCのパブリックサブネットに存在するインスタンスは、VPCのインターネットゲートウェイを介してS3に接続し、VPCのNATインスタンスによって帯域幅が制限されることはありません。

S3互換サービス

S3互換APIを提供するストレージシステムがいくつかあり、s3リポジトリタイプを使用すると、これらのシステムをAWS S3の代わりに使用できます。そのためには、s3.client.CLIENT_NAME.endpoint設定をシステムのエンドポイントに設定する必要があります。この設定はIPアドレスやホスト名を受け入れ、ポートを含むことができます。たとえば、エンドポイントは172.17.0.2または172.17.0.2:9000のようになります。

デフォルトでは、ElasticsearchはHTTPSを使用してストレージシステムと通信し、JVM全体のトラストストアを使用してリポジトリの証明書チェーンを検証します。JVM全体のトラストストアにリポジトリのエントリが含まれていることを確認してください。HTTPSの代わりに非セキュアなHTTP通信を使用したい場合は、s3.client.CLIENT_NAME.protocolhttpに設定します。

MinIOは、S3互換APIを提供するストレージシステムの一例です。s3リポジトリタイプは、ElasticsearchがMinIOバックエンドのリポジトリやAWS S3に保存されたリポジトリと連携できるようにします。他のS3互換ストレージシステムもElasticsearchと連携できる場合がありますが、これらはElasticsearchのテストスイートには含まれていません。

非常に有名なストレージベンダーのいくつかを含む多くのシステムが、S3の動作を完全にエミュレートできないにもかかわらず、S3互換APIを提供すると主張しています。このようなシステムをスナップショットに使用している場合は、標準化されたプロトコル(NFSなど)に基づく共有ファイルシステムリポジトリを使用してストレージシステムにアクセスすることを検討してください。s3リポジトリタイプは、S3との完全な互換性を必要とします。特に、同じAPIエンドポイントのセットをサポートし、同じパラメータを持ち、失敗時に同じエラーを返し、複数のノードによって同時にアクセスされてもS3と同等以上の一貫性とパフォーマンスを提供する必要があります。発生する互換性の問題を解決するために、ストレージシステムのサプライヤーと協力する必要があります。S3互換であると主張するストレージシステムに関するElasticsearchの問題を報告しないでください。正当なAWS S3リポジトリを使用している場合に同じ問題が存在することを示すことができない限り。

ストレージシステムの適合性を基本的にチェックするために、リポジトリアナリシスAPIを使用できます。このAPIが正常に完了しない場合、またはパフォーマンスが悪いことを示す場合、ストレージシステムはAWS S3と完全に互換性がないため、スナップショットリポジトリとしての使用には適していません。ただし、これらのチェックは完全な互換性を保証するものではありません。

ほとんどのストレージシステムは、Elasticsearchとの相互作用の詳細をログに記録するように構成できます。AWS S3との互換性の問題を調査している場合、通常はこれらのログを収集し、ストレージシステムのサプライヤーに提供してさらなる分析を行うのが最も簡単です。ストレージシステムが出力するログから互換性の問題が明確でない場合、ElasticsearchがS3 APIに対して行うすべてのリクエストをログに記録するように構成します。com.amazonaws.requestロガーのログレベルを設定してDEBUGにします。

資格情報やキーなどの機密情報がログに漏れないようにするために、Elasticsearchは不正なネットワークトレースログが有効になっていない限り、高い冗長性でこのロガーを構成することを拒否します。これを行うには、各ノードでシステムプロパティes.insecure_network_trace_enabledtrueに設定して明示的に有効にする必要があります。

有効にすると、com.amazonaws.requestロガーを構成できます:

Python

  1. resp = client.cluster.put_settings(
  2. persistent={
  3. "logger.com.amazonaws.request": "DEBUG"
  4. },
  5. )
  6. print(resp)

Ruby

  1. response = client.cluster.put_settings(
  2. body: {
  3. persistent: {
  4. 'logger.com.amazonaws.request' => 'DEBUG'
  5. }
  6. }
  7. )
  8. puts response

Js

  1. const response = await client.cluster.putSettings({
  2. persistent: {
  3. "logger.com.amazonaws.request": "DEBUG",
  4. },
  5. });
  6. console.log(response);

コンソール

  1. PUT /_cluster/settings
  2. {
  3. "persistent": {
  4. "logger.com.amazonaws.request": "DEBUG"
  5. }
  6. }

失敗した分析の期間をカバーするElasticsearchのログをすべてのノードから収集し、ストレージシステムのサプライヤーと分析応答を共有して、問題を特定できるようにします。詳細についてはAWS Java SDKのドキュメントを参照してください。他のロガーの詳細も含まれています。これらのロガーを使用して、さらに詳細なログを取得できます。サプライヤーが必要とするログを収集し終えたら、ロガー設定をnullに戻してデフォルトのログ構成に戻し、不正なネットワークトレースログを再度無効にします。詳細についてはロガーおよびクラスター更新設定を参照してください。

線形レジスタの実装

S3リポジトリの線形レジスタ実装は、マルチパートアップロードAPIの強く一貫したセマンティクスに基づいています。Elasticsearchは最初にマルチパートアップロードを作成して、線形レジスタ操作を実行する意図を示します。次に、Elasticsearchは同じレジスタの他のすべてのマルチパートアップロードをリストしてキャンセルします。Elasticsearchはその後、アップロードを完了しようとします。アップロードが正常に完了した場合、比較と交換操作は原子的でした。