概要

mdx Iのオブジェクトストレージに対するproxyサーバの構築に関する備忘録です。

背景

mdx Iの利用手引きにおいて、以下のように説明されています。

https://docs.mdx.jp/ja/index.html#オブジェクトストレージ

mdxが提供するS3データサービス(DDN EXAScaler S3 Data Service)で取り扱うAPI仕様を記載したDataDirect Networks社のマニュアルです。
Tipsのオブジェクトストレージの利用方法例 と合わせてご確認ください。

https://docs.mdx.jp/ja/_downloads/b5d961f2c152387fa10ed951d5278f47/S3 Data Services 5.2.7 API Reference Guide.pdf

こちらをGoogle NotebookLMに読み込ませ、corsの実装状況について確認しました。以下が回答です。

回答

資料 でBucket CORS Featureが未実装 であることが明記されているため、EXAScaler Access S3 APIに対して、ウェブブラウザ上で動作するJavaScriptなどから直接、異なるオリジン (例えば、APIのエンドポイントとは異なるドメインで提供されているウェブサイトのJavaScript)を通してリクエストを行うと、CORS(Cross-Origin Resource Sharing)の問題が発生し、通常はリクエストがブロックされます

これは、ウェブブラウザのSame-Origin Policy というセキュリティ上の仕組みによるものです。異なるオリジンからのリソースへのアクセスは、サーバー側が明示的に許可しない限り制限されます。CORSは、この許可の仕組みを提供するものですが、EXAScaler Access S3においては、この機能がまだ実装されていないため、サーバー側からのCORSヘッダーなどのレスポンスがなく、ブラウザはクロスオリジンリクエストを拒否する と考えられます。

したがって、プロキシサーバー などを利用して、クライアントサイドのリクエストを一旦プロキシサーバーに送り、そこからEXAScaler Access S3 APIにリクエストを行うことで、オリジンが一致するように見せかけるなどの回避策が必要になる場合があります。プロキシサーバーは、APIからのレスポンスに必要なヘッダーを付与する役割を担うこともできます。

ただし、これはCORSの問題を回避するための一つの一般的な方法であり、他にもサーバーサイドでAPIを公開する際にオリジンを一致させるなどの方法も考えられます。重要なのは、EXAScaler Access S3 API自体がCORSの仕組みをサポートしていない ため、クライアントサイドから直接クロスオリジンリクエストを行う際には、何らかの対策が必要になるということです。

対策

理解が間違っている点もあるかもしれませんが、上記の回答から、mdx Iのオブジェクトストレージに対するproxyサーバの構築を行うこととしました。

構築したproxyサーバのリポジトリは以下です。

https://github.com/nakamura196/s3-proxy

例えば、以下で指定したバケット上のファイルにアクセスできます。

https://s3-proxy.vercel.app/public/CETEIcean.css

一方、以下が直接アクセスした例です。

https://s3ds.mdx.jp/satoru196/public/CETEIcean.css

前者では、以下のようなレスポンスヘッダーが確認でき、CORSの設定がなされていることが確認できます。

aacccdessxxxcgaooatet---cecnntarrpvve:httegvioeeseee::ecwrrs0-nnrtecc-cttSW:-reeco--u/tellonetnVrd--ntny,3ea-citrcpdrnbadrooe25csyc:old:3cep:hl:i-loeh-ntMprE:napgeastxdlu:xrb-pM1lbt8srI:olb/2jeeS:wirc0scsSi-cs2gusao,s5RrdrMi1im03t:ga3Dy:ix:K:zn-1Yb:a1Lmdg:gage2Mxm=7V--0wa1,Gig7M7e4mTN=2us66s/39tA09-I74rh28eg06v05a09l;2i-di2anbtc2el8u6daeaScudb0D6o2mains;preload

実装

Expressを用いて、以下のように実装しました。aws-sdkについては、AWS SDK for JavaScript v3に移行する必要があるようなので、この点はご注意ください。

iiii}caccc}a}a}mmmfopooo)p)p)ppprnpnnnaser;pci}s};pc;ooo(es.ssscene.of3).orrrpqtutttccdggnr.BK..}.}lntttruserpies(eguept)c)isoiaePBsseoott!secyrhrrracr;soecAcrp(OU3stin(k.tk:oeeeetoetlxoWeepcRCKAn:"kesOemnssscnseeprS.s(oTK=ect/eytbtki(...hs.n.rses'=rEyc:p*Uy)aj:esdsss(ts(lefn.ds=TnIer"RteyeaeeeetPosfrveoe(_edspo,L={ucB,(tttnreaOgsrontx)pNw:srcstU)aHHdrrtR(,om使vep)rAKoear((Cee(oruT`m.nr;oMApecsse4{K=aadros,S{"NvecEWryesyq0E>ddar(e"a(O'seSo:s.n/.0Teet=M5rRcwD)ss=.csecfp)_{rra>e0veosE.(sSep.nia.N((.s0eqr-_c).p3srev(ltsA""B{s)=russEo;er(son.reheMACoa.>e"dNnno{.cvAe/.nEcodgjis;kVVfvcee.Wq'sd,cnyes{st"ei.ensAS:u(et)o,;r!gPsvsW_b"se;=nrc=(Os..SRRssn(uRe=)R.Ae_Eet-te{nel;TeWnEGqrC-rns'nSvNIuioTreippv_.DOennyornor.AAPNsgtprrgnoSCWO,t(reos)d43CSI,1o"iroeu0_E_N)l,n:nc0BSSTr;-s}t0USE,eAdtepi;C_Cs使laarofoKKR:ltnrrrnEEEoacoto'TYTRw.erm)___e-CoM$NIAs"Oofe{"{ADCp)rnsPeM,Co;itEsOxEEngeraRpSsinrgTrSentoe}e_)"Tr:sK,y}s'E=p?)$"dY>"e;{;e,*eBf{"rUarCu;oKl'rEta.T-pm_bpeNulsAcisMkcaEeag}tte`-i)no:;anm/'eo'c;tet-stream')';;

まとめ

間違った理解をしている点もあるかもしれませんが、参考になりましたら幸いです。