OpenSearchでVPC内にあるドメイン同士でRemote Reindexをする

はじめに

Amazon OpenSearch Serviceで、同一VPC内にあるドメイン同士でRemote Reindexをする方法を紹介します。

まず、公式ドキュメント docs.amazonaws.cn

前提条件

注意すべきは前提条件の部分です。

ドメインでデータ ノードに T2 または T3 インスタンス タイプを使用している場合、リモート再インデックスは使用できません。

検証用でT3インスタンスを使っている場合はインスタンスタイプを変更しましょう。

リモートドメインは、ローカルドメインからアクセス可能である必要があります。VPC 内に存在するリモートドメインでは、ローカルドメインVPC へのアクセスが必要です。このプロセスはネットワーク構成によって異なりますが、VPN またはマネージドネットワークへの接続、もしくは、ネイティブの VPC エンドポイント接続の使用が必要となる場合がほとんどです。詳細については、「VPC 内で Amazon OpenSearch Service ドメインを起動する」を参照してください

これは分かりにくいですが非常に重要です。次で説明をします。

組み込みのVPCエンドポイント接続機能

Migrating Amazon OpenSearch Service indexes using remote reindex - Amazon OpenSearch Service に説明がありますが、同一VPC内にあるドメイン同士であっても、組み込みのVPCエンドポイント接続機能を使ってローカルドメイン(データのコピー先)からリモートドメイン(データのコピー元)へのアクセスができるようにする必要があります。(てっきり同一VPC内にあれば設定いらんやろと思って読み飛ばしていたら必要でハマりました…)

組み込みのVPCエンドポイント接続機能とは?と思いますが、 このセクションReindex data with the Amazon Web Services Management Consoleにやり方が書いてますので、Remote Reindex APIの実行手前までそれ通り進めます。コンソールをぽちぽちやれば終わるはずです。

Remote Reindex API

さて、VPCエンドポイント接続設定が終わったらいよいよRemote Reindex APIの実行です。
ドキュメントには以下のように書かれていると思います。

POST _reindex
{
   "source":{
      "remote":{
         "host":"endpoint",
         "username":"username",
         "password":"password"
      },
      "index":"remote-domain-index-name"
   },
   "dest":{
      "index":"local-domain-index-name"
   }
}

きめ細かなアクセスコントロールを有効にしていて、かつユーザー管理にIAMを使用していない場合でなければusername, paswordはパラメーターとして渡さなくて大丈夫なはずです。
そうすると以下のようになりますが、

POST _reindex
{
   "source":{
      "remote":{
         "host":"endpoint"
      },
      "index":"remote-domain-index-name"
   },
   "dest":{
      "index":"local-domain-index-name"
   }
}

実行すると

  "error" : {
    "type" : "null_pointer_exception",
    "reason" : null
  }

といったエラーが返ってきます。

ドキュメントには書いてないですが、"external": trueオプション必要です。 medium.com の記事を見てやっとエラーが解消できました…。

最終的に以下の形になります。

POST _reindex
{
   "source":{
      "remote":{
         "host":"endpoint",
         "external": true
      },
      "index":"remote-domain-index-name"
   },
   "dest":{
      "index":"local-domain-index-name"
   }
}

なお"host":"endpoint"の部分の endpointOpenSearchドメインエンドポイントにport番号:443をつける必要があります。 つまりこんな感じになります。
"host": "https://hogehoge.ap-northeast-1.es.amazonaws.com:443"

まとめ

Amazon OpenSearch Serviceで、同一VPC内にあるドメイン同士でRemote Reindexをする方法を紹介しました。 remote reindexは snapshot&restoreと比べると snapshot用のS3バケットの作成, snapshotリポジトリの登録、それ用のIAM Role作成などをしなくていいので楽ですね。