概要

TEI/XMLファイルをS3互換のオブジェクトストレージでホストする機会がありましたので、備忘録です。具体的には、mdx Iのオブジェクトストレージを対象にします。

https://mdx.jp/mdx1/p/about/system

背景

TEI/XMLファイルを読み込み、その内容を可視化するウェブアプリケーション(Next.js)を構築します。この時、ファイル数やサイズが小さい場合は、publicフォルダに格納していましたが、これらが大きくなった場合、別の場所でホストすることを考えました。

場所の選択肢は多々ありますが、今回はS3互換であるmdx Iのオブジェクトストレージを対象にします。

GUIを用いたオブジェクトストレージへのファイルアップロード

オブジェクトストレージへTEI/XMLファイルをGUI経由でアップロードする方法も多々あります。その中で、これまではCyberduckを使用する方法や、GakunNin RDMを使用する方法などを紹介しました。

一方、今回の事例では、TEI/XML以外のコンテンツをDrupalで管理していました。そこで、Drupalとオブジェクトストレージを接続し、ユーザはDrupalの操作で完結できるようにしました。

Drupalとオブジェクトストレージの接続

以下のモジュールを使用します。

https://www.drupal.org/project/s3fs

インストール後、環境設定のページ/admin/configから、S3 File Systemを選択します。

そして、アクセスキーや秘密鍵を登録し、さらにS3のバケット名を登録します。

またAdvanced Configuration OptionsのCustom Host Settingsにおいて、https://s3ds.mdx.jpを入力します。

これでオブジェクトストレージとの接続設定は完了です。

その後、各コンテンツタイプのフィード設定において、アップロード先として「S3 File System」を選択します。

また、今回はTEI/XMLファイルがアップロード対象となるため、「許可されている拡張子」として、xmlを入力します。

この結果、DrupalのGUIを介してアップロードしたTEI/XMLファイルが、mdx Iのオブジェクトストレージに格納されるようになりました。

(参考)DrupalのJSON:APIを用いたファイルの一括アップロード

TEI/XMLの初期登録にあたり、Pythonを用いた一括登録を行いました。JSON:APIを用いたファイルの一括アップロードの方法は、以下の記事などが参考になりました。

https://www.drupal.org/node/3024331

一例ですが、以下のようなスクリプトで実現できました。

iiifffcmmmrrrlpppoooaooommmsrrrsddddtttdgteeeeolqAffffrjotodpessebmil#s###ssl#llig#cieuu#f#whhh#rieqonC_oeeeooofesflpriieeeeflunviiliaDlsllgggtCrsllltaaassemmindrfeffiiil_Sfceoehdddpresippei_u.l..nnnljhoscR_fcs##s}:#sa=nfeeeoei:ptmoontdpDfUP(__osegesFt"oreedaoirrrnsfrsprrt_oaR.SAsurgoailro{ofrslrl_fmplsssspiott:_tlUJBESereindnffksk_eefaff"eee[[eovnr(ePSaRSllsn=e_._eeittl."""i.i{n_=''nepttgtsnAOsNWfp_{rrstnleoufhCAXscls=(dCC=srr(lqevLJNiAO)=ou"seeo_fskr.eoc-eseefasooebiflodl(_SAcMR:nrn=sskr.=encancCr(loitennr.on"obmfoUBOPEDfsla{pseeDsnsdteSEfsfslalttessta)vRANI"e,m"oinsRe_creepRx_e..efeeqte(d:eLS:_=={eCno(pUlrsfrntFctlDp_=.nnua:f_rEAEs="osnsoPfer_st"-eofRaphttet"dr_PNooe:ne_enA.sft-:Tpk,Utafe--suoiUIDsslrt.clsLsp_o=TotePht.aTDtstdRP..fesesofe_eotky"kintA.hrdyis_eeLOgg.qento)Bsnoe{paeoyLb,eeps.cn=IeeDultak:=Assknepnn=p_aareppovT=NttRef-tiSiee"p"(eBs'ds'oodrTeeUs.TuerEo.n=:l:fN,Aer(.]sseuonnPtUysse_ns_i"oSnb)cites=vvAsSp_qU_trc"ccCnuEa'o=t(=:).((L.Eec=uRcaesaasSeu_m)piu=gf""_pR"oeLotsrptrRiUey'or{e"DDBoN:dls}upfpifFdR(a(anl2rt{RRAsAeotkso_lo_,Lfs)p',0:eesUUStM"gssi_ntint}ip]0snePPE(Ea=i.eecsoc/of/lflh:{pvlAA_,p=ngssoekavkije:i=efo(fLLUp_esd.etnees_cain".__R"l2rtietnidnlopafdlsDDUPLpi0e(o#e_o._dnat'eeeRRSA}ac0sn=xrnar,atiarn.UUES/sa:p/=te/pe:photsasPPRSustotsvisfi)nt=mtAANWs"ino2pn+p{i//aheaLLAOe:osk0odjoclnoce}t__MRrnee0n.snseocha"uBBED/s/.n:saosr_dtmd)sAA""lejc"epnefpeeee_SS))olso,.i"._a/tnrcEEgfoot+,ttt{-tso__i.nkejeohts;,dUUnP"ixsxk,yteRR?A}etoteprfc}LL_Ssn,nveeio"}fS"_e}alo{)/oW,rr/mekrjrOeb{'niesmRsouaesoaDpsumspnt}oeie=oa=,n=d=snpjsF}"esisea/{le/o.l{ff.nnssfi.to"teilseda)eeexet:lnst/udas}as}mi"r_"eo)tc}nio"_cd'cleoe}o"k{icessr,f_dtaotkae=nf_irlees_pdoantsae).text}")

すでに対象コンテンツが作成済みで、例えばfield_fileといったフィールドにファイルをアップロードする目的で使用することができます。

より適切な方法があるかと思いますが、以下のように使用できます。

cccufcfcllluioiliiiilneieeedetlennnednttt==nt..t=.=lg""_uoec<t"pAgteyflpi_fpioincaeeaC(s8ldl)r0=d_if7_fe_6"fint-><ilto4"le(kde()ed"cnfo(-n)4tce0n5>t-"_at0y3pde-,fcudueibdb,f0fci2e0l9d",file)

なお、以下のような環境変数が必要です。

DDDRRRUUUPPPAAALLL___BUPASASESERS_NWUAORMRLED===

Next.jsからの利用

オブジェクトストレージにアップロードされたTEI/XMLファイルを、Next.jsなどのアプリケーションから読み込みます。

以下のライブラリを使用することができました。

https://www.npmjs.com/package/@aws-sdk/client-s3

具体的には、以下のような形で利用できました。

iie}e}mmx;x;pppccrpc}c}cci}roooooeoo)o)ooferrrnntrnrec};nBK;nnrttttssutsenr,suess(euttrtgdeastcytt!tr{{cncipdcek:cunopxocooecccercorSDnamxnlninerot`eonnc3Osrlmsi:ntsem:xsntoCMtsltetistmmptennlPe=;n':aKAaploenuviacrgtulecnrnntleeropespsycd$st)lrnsn=at=-r:Iec{e;ttevrXeods=ei={T,rensmnac{:ssd=o,reeleseKns}aXGtwrwtspee..awmeDT.=-srywexwaltooDpS1.o:nmai(OcXOaa3'ecGvlitcbumMrsC,nepe.`tojmlPsylsrtS,rneeaeni.soO3cetcn=rFceS.cb_lsettsrn3eejBipnC(eo(t_nseUeotoaxrmi(EvscCnn)msm(Sd{N..tKts;ml)t:DSeCE.eaXT;rP3noTs.nMeisO_vmeBdLxntIA.mnoDtgrNCSadd}o:(iTC3n(ycxnE_dc?fusmgSS('o.rmtl)SE{,mtoerT:_CmrmnieKRaatnxP'EEnn'gtr,YTds@}),o__)fa:mIA;owf'iDCrsrXtsCm-oMeeETsmLx<SodDtXSSk'o/M_t@cxL'KrcxumD,EilmmloYnile'cgedn)u(not;m)tme;-/=nsx>t'3m,'l{|;donmu'l;l>=>{

以下のような環境変数とともに使用します。

SSSS3333____ASEBCENUCCDCERPKSEOESTIT__N=KATEC=YCh_EtIStDSp=_sK:E/Y/=s3ds.mdx.jp

結果、以下のような構成を実現することができます。

今後の展望: LEAF-Writerとの接続

今回はDrupal(実際には、mdx Iのオブジェクトストレージ)にアップロードされたTEI/XMLファイルの編集環境は用意していませんが、例えば以下のLEAF-WriterのDrupalモジュールを使用することで、TEI/XMLファイルの編集と管理をCMS上で完結させられる可能性があります。

https://gitlab.com/calincs/cwrc/leaf-writer/leaf_writer

また、GakuNin RDMとLEAF-Writerを接続したプロトタイプとして、以下も参考になりましたら幸いです。

まとめ

今回、TEI/XMLファイルをS3互換のオブジェクトストレージでホストする一例について紹介しました。このような方法を採用する利点や欠点が考えられるため、用途に応じた構成を考える上で、本記事が参考になりましたら幸いです。