Amazon Elasticsearch Service クラスターのアップグレード中に表示される「以前のスナップショットオペレーションがまだ完了していません」というエラーを解決する方法を教えてください。

最終更新日: 2020 年 9 月 10 日

Amazon Elasticsearch Service (Amazon ES) クラスターをアップグレードしたいのですが、「以前のスナップショットオペレーションがまだ完了していません」というエラーメッセージが表示されて失敗します。この問題を解決する方法を教えてください。

簡単な説明

Amazon ES クラスターをアップグレードすると、クラスターは以下の理由で失敗することがあります。

  • スナップショットはすでに進行中である。
  • 進行中のスナップショットがスタックしている。
  • 進行中のスナップショットに、赤色のステータスのクラスターがある。
  • スナップショットのタイムアウトまたは失敗。

Amazon ES のアップグレード失敗の詳細については、「アップグレードのトラブルシューティング」をご参照してください。

解決方法

スナップショットはすでに進行中である

注: 「以前のスナップショットオペレーションがまだ完了していません」というエラーメッセージが表示された場合は、エラーはスナップショットがすでに進行中であることを示します。

暗号化されたドメインの場合、次の構文を使用して、自動スナップショットが進行中かどうかを確認します。

curl -X GET  'https://es_endpoint/_snapshot/cs-automated-enc/_status'

暗号化されていないドメインの場合、次の構文を使用して、自動スナップショットが進行中かどうかを確認します。

curl -X GET 'https://es_endpoint/_snapshot/cs-automated/_status'

実行中のスナップショットがない場合、次の出力が表示されます。

{  "snapshots" : [ ]}

空の括弧は、アップグレードを安全に実行できることを示します。Amazon ES がスナップショットが進行中かどうかを確認できない場合、アップグレードが失敗する可能性があります。

進行中のスナップショットがスタックする

次のコマンド構文を使用して、時間単位のスナップショットの開始時刻と終了時刻を確認します。

curl -X GET  'https://es_endpoint/_cat/snapshots/cs-automated?v&s=id'

次に、awk コマンドにパイプ処理された cURL 出力を使用して、開始時刻を出力します。

curl -X GET  'https://es_endpoint/_cat/snapshots/cs-automated?v&s=id' |awk -F" " ' { print $4  } '

出力は、1 時間あたりのスナップショットが発生した時刻を示します。たとえば、次の出力は、各時間の約 52 分目に出力を実行することを示しています。

22:51:11
23:51:18
00:51:19
01:51:14
02:51:16
03:51:18
04:51:16
05:51:11

次に、Amazon ES アップグレードの適格性を確認します。スナップショットステータス API を使用して、スナップショットが完了したかどうかを確認します。スナップショットが完了すると、API は空のセットを返します。このデータは設定が変更された後に変更する可能性があるため、スケジュール済みジョブの計画にスナップショットを使用することはできません。

現在のステータスが進行中で、しばらく変わらない場合、スナップショットはスタックしている可能性があります。中止したスナップショットにも同じことが当てはまり、他のスナップショットが作成されない場合があります。クラスターのステータスが赤色の場合、または書き込みブロックがある場合は、ステータスまたはブロックをクリアして障害を解決します。

重要: スナップショットが完了しない限り、アップグレードの適格性チェックを実行しないでください。

進行中のスナップショットに、赤色のステータスのクラスターがある

ドメインに登録されているリポジトリ名のみを一覧表示するには、次の構文を使用します。

curl -XGET "http://es_endpoint/_cat/repositories?v&h=id"

ドメインに登録されているリポジトリ名、タイプ、その他の設定を一覧表示するには、次の構文を使用します。

curl -XGET "http://es_endpoint/_snapshot?pretty"
curl -XGET "https://es_endpoint/_cluster/state/metadata"

cs-automated または cs-automated-enc リポジトリを除く、各リポジトリのスナップショットを一覧表示できるかどうかを確認します。複数のリポジトリがある場合は、次のような bash スクリプトを使用してください。

#!/bin/bash
repos=$(curl -s https://es_endpoint/_cat/repositories 2>&1 |grep  -v "cs-automated" | awk '{print $1}')

for i in $repos; do
echo "Snapshots in ... :" $i >>/tmp/snapshot
`curl -s -XGET https://es_endpoint/_cat/snapshots/$i >> /tmp/snapshot`
\echo "done..."
done

重要: cs-automated または cs-automated-enc リポジトリでスタックしたスナップショットを手動で削除することはできません。

/tmp/snapshot フォルダーの出力を表示するには、次の構文を使用します。

cat /tmp/snapshot

コマンドは次のようなレスポンスを返します。

Snapshots in ... : snapshot-manual-repo
axa_snapshot-1557497454881 SUCCESS 1557639400 05:36:40 1557639405 05:36:45  4.6s  7 31 0 31
2019-05-15                 SUCCESS 1560503610 09:13:30 1560503622 09:13:42 11.8s  4 16 0 16
epoch_test                 SUCCESS 1569151317 11:21:57 1569151335 11:22:15 18.1s 15 56 0 56

返されたエラーメッセージは、Amazon Simple Storage (Amazon S3) バケットがすでに削除され、スナップショットリポジトリとして登録されていることを示します。

Snapshots in ... : snapshot-manual-repo
{"error":{"root_cause":[{"type":n","reason":"[snapshot-manual-repo] could not read repository data from index blob"}],"type":"repository_exception","reason":"[snapshot-manual-repo] could not read repository data from index blob","caused_by":{"type":"i_o_exception","reason":"Exception when listing blobs by prefix [index-]","caused_by":{"type":"a_w_s_security_token_service_exception","reason":"a_w_s_security_token_service_exception: User: arn:aws:sts::999999999999:assumed-role/cp-sts-grant-role/swift-us-east-1-prod-666666666666 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::666666666666:policy/my-manual-es-snapshot-creator-policy (Service: AWSSecurityTokenService; Status Code: 403; Error Code: AccessDenied; Request ID: 6b9374fx-11xy-11yz-ff66-918z9bb08193)"}}},"status":500}

手動スナップショットリポジトリが Amazon S3 バケットから削除されたことを確認します。

aws s3 ls | grep -i "snapshot-manual-repo"

注: snapshot-manual-repo をバケット名に置き換えます。

次に、Amazon ES からリポジトリを削除します。

curl -XDELETE "https://es_endpoint/_snapshot/snapshot-example-manual-repo"

スナップショットのタイムアウトまたは失敗

手動スナップショットを作成できるかどうかを確認します。「手動スナップショットを取得できません」エラーが表示された場合は、_cat/snapshots API を呼び出します。

curl -XGET/_cat/snapshots/s3_repository

注: s3_repository を S3 バケットの名前に置き換えます。

上記の構文で、現在のスナップショットを実行している時間を確認します。期間が妥当と思われる場合は、完了するまで待ってから、もう一度試してください。

次に、クラスターのヘルスステータスを確認します。

curl -XGET "https://es_endpoint/_cluster/health?pretty"

クラスターが赤色の場合は、最初に赤色のクラスターをクリアします。シャードを再配置または初期化する場合は、プロセスが完了するのを待ってから、アクセスポリシーを設定します。シャードの再割り当てにより、クラスターのコンピューティングリソースが大幅に増加する可能性があることにご注意ください。赤色のクラスターのトラブルシューティングの詳細については、「赤のクラスター状態」をご参照ください。