Amazon Elasticsearch Service から別の OpenSearch クラスタへデータを移行する方法を解説します。本記事では、Scroll API と Bulk API を使用したシンプルかつ確実な移行手法を紹介します。

背景

クラウドサービスの移行やコスト最適化のため、Elasticsearch/OpenSearch クラスタ間でデータを移行する必要が生じることがあります。今回は以下の環境間での移行を行いました。

  • 移行元 : Amazon Elasticsearch Service (AWS)
  • 移行先 : セルフホスト OpenSearch

移行の流れ

  1. 移行元・移行先のインデックス確認
  2. マッピング情報の取得と調整
  3. 移行先にインデックスを作成
  4. Scroll API + Bulk API でデータ移行
  5. 移行結果の確認

事前準備:インデックスの確認

まず、移行元と移行先のインデックス一覧を確認します。

#c#cuurrll--uu""uusseerr::ppaasssswwoorrdd""""hhttttppss::////sdoeusrtc-ec-lculsutsetre/r_/c_acta/ti/nidnidciecse?sv?&vs&=si=nidnedxe"x"

Step 1: マッピング情報の取得

移行元からマッピング情報を取得します。

cur">lhtm-tasppsp-:iu/n/g"ssuo.sujersrco:enp-acslsuwsotredr"/i\ndex_name/_mapping"\

Step 2: マッピングの調整

移行先の環境によっては、カスタムアナライザーが利用できない場合があります。例えば、日本語形態素解析用の kuromoji プラグインがインストールされていない場合、アナライザー設定を除去する必要があります。

defr"iere"flem"itoifuvsiffreifoion_nrsras'iontadkrnirbaaneeestejlanalymtemyncl,oamozaeyovnvel(zbvecieryoeja_en_(zbr[la(aoej''unoonbr,aeabbajinljjl)dnaiy,:y:ilnzzcoyeletbzorir)jeb(s(::rjvti'.a)t]il:e"tum"ee)"m)s():

Step 3: 移行先にインデックスを作成

調整したマッピングを使用してインデックスを作成します。

iifdmmreppofoomrrc#wmci}rprttrrialnereeetpedsitjrqahpaepnuseutminx'}'ofjatroqeeoan__s,mn"su(nnus_ppgmbeas{otfetiepsaotpednh"rssnnipdt''pe==Cet.d(n=pyinni=sidrssaefginuuntneepux'smn=gmmgr_dsaot({_agsbbseuettnhssdps{'ee'qrx_esooap:rr:ul_aeiuuti=__e}bu{.mrran{oocs/otdspccgrfflt{dhetoee=se__esdysar___msra.e,tttiijdohenps_unnsavap_utisHddoterlmt_n_Teena_dia(idcTxx.[ascpneoP,}lsn'apdxdB_ooa:sie}eadmaul'nx:seadry1:g}iisp(cz,s"Snctpfee1,tA_i)_ra[uini(t2tngnmu0hdsdas0e.ep,xjxp{,s]ir2o[ne0dn'gs1e'msp]s)a)otpn_apsusiern.lfgs,:st'ad]teusst__caoudteh})":)

Step 4: データ移行スクリプト

Scroll API を使用して移行元からデータを取得し、Bulk API で移行先に投入します。

iifiSSDDdmmrmOOEEeppopUUSSfoomoRRTTrrrCC__mp#sq}ridshtpmesw#rprttrtEEUAircuefaciorirtheree__RUgiSrestrttigraiSqitjrqtUALTrncorpraosanrorlcunuseuiRUHatrly""oeprlltarte#bf#hbie#erep#sidshrefjatroqemLT=t(olsqnsre=l=(ts_uoeufllatrcfacios"su(nnuseH=efl_=iuspit_=fethBlrBalsatairtrtlt{otfet='_"luzeeonurid"d=iiukudkbepenosaoslsSnh"Tss=hHi=r{erntredadTmtl_habble_fdhaurim:pes=tlfjacbl.O==\rt.'tTn=Al"y=s(nstao=0eskbicuukrr"aeulefirre=(l"surr=l=dU{SnusahHtTd=P:"efp=att:ottllse{tatksgird(ff_{otoe_eR"O\eutTpPeI=:r."Fo[aa0=dikksDadh_urrnomt""rSnhlasidlCsUnttTsBxMbesEand'[lyio__=pE=e=rlefatr=io\-eO==lkcdaeEcRChpP:a(ifa{qtrlsah'tnnbboSbrDetsot(sgtrsU{S_rtt_rCosB/ssg"t"uarsetihdi=oo{nTusEsureftraP{pR"Oro=aeUoEmi:a/ior{cmetoe.atiomh=dd"s_l=Sp=ld"+ialrroCsUel[(Rl_pm/sdcuaShasurj[stce"iyyCeUkhTotiiB=mtoanEcRsld'LlAlp/ieArtO_tts:s''su."t{oR_e_nb.tf+uee-gts_rCp_ah}_UeoscsuciUscs_o_]'mts"++n=LbaAsuge=ll.dreeUoEorti/iTtroAttenRih.c{ns[]ei:i==t}dUelem'ketme:Rl_neat_dHetuu-h_gCz_por(c'[nmnerdeT.kteelni/is.=LlAss[ss"drtc(iEeaode)rh'tedjjne_yrHs_(irree(mgs0}"Uep''e::Hchl'n{_,lsesoits(esstqb,str'nrrnrheer:fr/:T.o_]aTe(uudsUltplto:)xoo-uu,aeeoo(ri(la}e_Hsns[rs{T-'sseoR"(!olst"nnTeltsrrrrhot)at{qs"tsc'ccmPcutexuL:s=n_'a{:..yskupre'sirspemdue5aerhhriBlser,r}csi]ltddpt"soost:)-sdioeamt.oi/ogauer'c/{r2ed'o{uues,_nrui+se)gcsr"ujltslrssr',de{}o0.']t"mm".cssln=){sdrstc,sslsclait'e_s}l0t][a_pp:poe'tbt/a/sh_o_'r_tce,'siol:e'lissod.)[i1uaits./"cni]oieArptnu_xv}n(("sej:'tlrfreepsso(dlddu''a_druta"dahatsiektadcoccd)'l}}tpsiecr}l)ecip(=otm__et}srre]",hasnxel"uxttp=ne.rtle/-too,dswd}_,)e"i[l(mgeia{(ll!osoei':o'i2)sesmpitEll=cwrxnj]n_c0'tpesfoT"_uod,dsd)sa0](oetA,i2mr'eoeot::'ndra:d0ed)b{xns+uiisal"0n'ad}=trone>t}{::t)te/q_"cnd.eescs_uie/et0(ts,htsenn'xxe>{ac__erd"]-'xem:r{siaye)n,tl0i.oeinr,xd[sg0lrzdc,+j{:eerflreehas}2la}_o=x?u""o)00stsir1}st_\n:0ee"ds0chin"]d,}}0=r=d"}}0*,0=oS""1ee)=lO:)0nr:"lU0dr)=Rh/=o5Ci/'rmEtt's"_[o,"A't)U_afTillHd}u)'%s])h}=}"True)

Step 5: 移行の実行と確認

#mmm#ciiiugggrrrrlaaattt-eeeu___iii"nnnudddseeeexxxr(((:'''piiiattmseeasmmgwsseo12sr'''d,,,"'''"ccchjjjt---tiiipttmseea:mmg/sse/12sd'''e)))st-cluster/_cat/indices?v&s=index"

注意点とベストプラクティス

1. カスタムアナライザーの対応

移行先に kuromoji などのプラグインがない場合、以下の選択肢があります。

  • アナライザーなしで移行 : 日本語検索の精度は下がるが、データは保持される
  • プラグインをインストール : 移行先に必要なプラグインを事前にインストール
  • 代替アナライザーを使用 : standard アナライザーなどで代用

2. バッチサイズの調整

#m#miiggrraattee__iinndd:e:exx((''slmaarlgle__ddooccss'',,''ddeesstt__slmaarlgle'',,bbaattcchh__ssiizzee==5500000))

3. 並列実行

複数のインデックスを並列で移行することで、全体の移行時間を短縮できます。

#pppwyyyatttihhhtooonnnmmmiiigggrrraaattteee...pppyyyiiittmeeammgsse12scccjjj---iiittmeeammgsse12s&&&

4. エラーハンドリング

Bulk API のレスポンスを確認し、エラーが発生したドキュメントを記録・リトライする仕組みを実装することを推奨します。

ifrefsourltii.tfgeem'teee#l(irrro'nrrrgeooogrrrrrire'__nosdrgruioe.slncae't_sr)[iior:'tdnoiertm==(e.fmgii"settF'teea](mmi:'[[li''eniiddnn:eddxee{'xxe,''r]]r{[[o}''r)_e_:irddro'oc]r_'i]d[}'r-ea{seornr'o]r_reason}")

5. ドキュメント数の検証

移行後、ソースと移行先のドキュメント数を比較して、データの整合性を確認します。

#c#cuurrll--ss--uu""uusseerr::ppaasssswwoorrdd""""hhttttppss::////sdoeusrtc/e_/c_ocuonutn?tq?=q*="*"

パフォーマンスの目安

移行速度は環境やドキュメントサイズによって異なりますが、一般的に以下の程度が期待できます。

  • 小〜中規模ドキュメント : 500〜1,000 docs/sec
  • 大規模ドキュメント : 100〜500 docs/sec
  • ネットワーク帯域 : クラスタ間の距離や帯域幅が速度に大きく影響

まとめ

Scroll API と Bulk API を組み合わせることで、大規模なデータでも安定して移行できます。カスタムアナライザーの有無など、環境の差異に注意しながら移行を進めることが重要です。

参考リンク