はじめに

IIIFサーバーのCantaloupeでAzure Storageを使用している際、IIIF URLのidentifierと実際のAzure Storage上のファイルパスが異なる場合があります。本記事では、この問題をdelegate scriptを使って解決する方法を詳しく解説します。

課題

以下のようなファイル構造で画像を管理しているとします:

AzureimSatgoeccrsoallglleeiiecttcCteetoimmino0i0iotn0t0tna11e2e2i//m/m/n00e00r12:__00m00y11c..ojjnpptggainer

しかし、IIIF URLでは以下のようにアクセスしたい:

https://example.com/iiif/3/collection1/item001/item001_001.jpg/info.json

この場合、IIIF URLのidentifier (collection1/item001/item001_001.jpg) と実際のAzure Storageのパス (images/collection1/item001/item001_001.jpg) が異なります。

AzureStorageSourceには、S3SourceのようなPATH_PREFIX設定が存在しないため、この問題を解決するためにはdelegate scriptを使用する必要があります。

解決方法

1. Docker Compose設定

sercvainielrctmnoaeeaavCCCCCCCl-b-----sslgiAAAAAAAuet:oerNNNNNNNm"l"""""au:oTTTTTTTe.stttttrpnAAAAAAAs/:rrrrrteimLLLLLLL:daaaaa::seOOOOOOOeeeeeelnUUUUUUUlfffffaatPPPPPPPeiiiiiln:EEEEEEEgkkkkkwd_______a.....aoSAAAADDtehhhhyrOZZZZEEenttttsaUUUUULLsatttt/RRRRREE.bppppcCEEEEGGrl....aESSSSAAberrrsn_TTTTTT:=oooetSOOOOEE/tuuuraTRRRR__ortttvlAAAAASSpueeeioTGGGGCCterrrcuIEEEERR/"sssepCSSSSIIc...se:OOOOPPaccc.:UUUUTTnaaacmARRRR__tnnnaazCCCCEPatttniuEEEENAlaaatnr____ATolllaeAACLBHuooolSCCOOLNpuuuotCCNOEAepppuoOOTKDM/eeeprUUAU:Ed...eaNNIP:eret.gTTN_"lunlle__ESt"eltsoSNKRTr/ger=aoAE_Ruoa=ytduMYNAeptHprbrE:AT"teoouac:ME/ssiele$EGc.tn"a${:Yar(tn{A:nb`scAZ$t:e=eZU{SarxwrURAcloae.REZro"mbsE_Uiupse_SRpplerSTEteecvTO_L/.ueORSodcrrRAToeoe.AGOklm"pGERue`oE_Apg)r_AGSa"tACEtt=CC_re8COCas1OUOt.8UNNer2NTTgb"T_Ay"_KINENAYE#M}RE_}NAME}

2. Delegate Script (delegates.rb)

開発・デバッグ版

最初はデバッグ出力を含む版で動作確認を行います:

###ce#lnDa#a###de###dede###dededededest#en#enen#enenenenlstIfiierdfptdfptdf{df{df[dfnderIdfneurur}}]igC_IaebpprdtptuatueermlauaFzniluueurseusexxeetscutdotttretttdtetcUriebssun_"h"rraaoeRefn_raDoDaacdsmsLsitk""nnuErE__tacDsteieDDitBiBiiitreoiorfyEEblhUzUiioailrdriBBloGeGiin(peea=e=UUor:(:ffsotg:ngrGGbio23(pactec"::_zppa__otftoisoikertuiipioenfonmIOe(eitnntortiutanuyo_ohffineeregptpanoooosAxrcxeuptusrrrnztetstuitimms=uA_[/toh=zaarzb'#inoett={euli{dbsr{ii}Srodieli}coo{)tebedno=z)ann}o_netbel__)rSktni{lrrateitfk}ceeegoyfiie)adsserifeyl"ppSaeir:looogre:ennue'r#dssr]}#{"eecb"{b__eliilkkofdoeewbebyyicn_sstkotk((henieooytfyppSei}ttcxe"iirtrooi}nnp"sstL==oo{{k}}u))pStrategy

本番用クリーン版

動作確認後、本番環境用にデバッグ出力を削除:

###ce#lnCa#a####de###dede###dede###de###dedost#en#enen#enen#en#enmstCIfirdftdftdf{df{df[dfndpraIderr}}]ilC_nIaetpuaueermleuatFznureueIxxeetscautretIttdtetclUrin_hIrraaoeoRefaoFaa使cddmsuLsii-ur__taeDsptedtiiii使tleoeiorehziioaelrdrnoeiin(geea=tr(ffsoag:ngiio23(ptactecfzp__otetoisoietiipienfone(inntostiutrooffinnceerepn使oooisrxrcx?tsrrnlitetimms=pA_["o=aatzb'intt={ulims{ii}froda}oo{)oebeg=)nn}r_ne__)Skts{rrAtei/}eezoyf#)ssuri{ppraeiooegrdnnSe'esst]neeobt__rliikkaoffeegbiyyecessSkor((oen}oouyt"pprettcx:iietoonnnwissilt==h{{S}}c))riptLookupStrategy

トラブルシューティング

よくあるエラーと対処法

1. Cannot invoke "edu.illinois.library.cantaloupe.delegate.DelegateProxy.getAzureStorageSourceBlobKey()" because the return value is null

原因 : Delegate scriptが正しく読み込まれていない、または構文エラーがある

対処法 :

  • Delegate scriptの構文を確認: ruby -c delegates.rb
  • attr_accessor :context が定義されているか確認
  • コンテナログでdelegate scriptの読み込み状況を確認

2. undefined method 'context=' for CustomDelegate

原因 : attr_accessor :context が定義されていない

対処法 : クラスの先頭に attr_accessor :context を追加

3. undefined method 'pre_authorize' など

原因 : 必要なdelegate methodsが定義されていない

対処法 : 上記の完全なdelegate scriptを参考に、必要なメソッドを追加

4. class org.jruby.RubyHash cannot be cast to class java.lang.String

原因 : metadata()メソッドが不正な型を返している

対処法 :

  • メタデータを使用しない場合はnilを返す
  • 空のハッシュ{}ではなくnilを返すことが重要
deenfndimleta#data(opt{i}ons=ni{l})

デバッグ方法

  1. ログ監視 :
dockerlogscontainer-name-f
  1. 構文チェック :
ruby-cdelegates.rb
  1. 段階的テスト :
    最初はシンプルなdelegate scriptから始めて、徐々に機能を追加

動作確認

1. サービス起動

dockercomposeup-d

2. テストアクセス

#c#cuuIrrnllfohh.ttjttsppossn::////eexxaammppllee..ccoomm//iiiiiiff//33//ccoolllleeccttiioonn11//iitteemm000011//iitteemm000011__000011..jjppgg//ifnuflol./j3s0o0n,/0/default.jpg

3. ログ確認(デバッグ版使用時)

期待されるログ出力:

https://example.com/iiif/3/collection1/item001/item001_001.jpg/info.json

0

まとめ

Cantaloupeのdelegate scriptを使用することで、IIIF URLと実際のストレージパスの差分を吸収できます。重要なポイント:

  1. ScriptLookupStrategyの設定: AzureStorageSourceでdelegate scriptを使用するために必須
  2. attr_accessor :context : Cantaloupeがコンテキスト情報を設定するために必要
  3. azurestoragesource_blob_keyメソッド: パス変換のメインロジック
  4. その他のdelegate methods : エラーを避けるために最低限必要

本記事で紹介した方法により、柔軟なファイル管理とIIIF URLの設計が可能になります。特に、既存のファイル構造を変更せずにIIIF対応を行いたい場合に有効です。

参考リンク