はじめに#
IIIFサーバーのCantaloupeでAzure Storageを使用している際、IIIF URLのidentifierと実際のAzure Storage上のファイルパスが異なる場合があります。本記事では、この問題をdelegate scriptを使って解決する方法を詳しく解説します。
以下のようなファイル構造で画像を管理しているとします:
しかし、IIIF URLでは以下のようにアクセスしたい:
この場合、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設定#
2. Delegate Script (delegates.rb)#
開発・デバッグ版#
最初はデバッグ出力を含む版で動作確認を行います:
本番用クリーン版#
動作確認後、本番環境用にデバッグ出力を削除:
トラブルシューティング#
よくあるエラーと対処法#
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を返すことが重要
デバッグ方法#
- ログ監視 :
- 構文チェック :
- 段階的テスト :
最初はシンプルなdelegate scriptから始めて、徐々に機能を追加
動作確認#
1. サービス起動#
2. テストアクセス#
3. ログ確認(デバッグ版使用時)#
期待されるログ出力:
0
まとめ#
Cantaloupeのdelegate scriptを使用することで、IIIF URLと実際のストレージパスの差分を吸収できます。重要なポイント:
ScriptLookupStrategyの設定: AzureStorageSourceでdelegate scriptを使用するために必須attr_accessor :context : Cantaloupeがコンテキスト情報を設定するために必要azurestoragesource_blob_keyメソッド: パス変換のメインロジック- その他のdelegate methods : エラーを避けるために最低限必要
本記事で紹介した方法により、柔軟なファイル管理とIIIF URLの設計が可能になります。特に、既存のファイル構造を変更せずにIIIF対応を行いたい場合に有効です。
参考リンク#