Cantaloupe IIIFサーバから serverless-iiif への移行記録
EC2上でDocker稼働させていたCantaloupeを、AWS Lambda + CloudFrontベースの serverless-iiif(Samvera)に移行した際の調査と作業の記録です。
iiifawslambdacloudfrontcantaloupeserverless
台本(フルテキスト)
動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。
オープニング
- Cantaloupe (EC2) から serverless-iiif (Lambda) への移行
- セキュリティ負荷軽減とコスト削減が動機
- うさぎ
- こんにちは。今日はどんなトピックを紹介するの?
- WhiteCUL
- EC2 上の Docker で動かしていた Cantaloupe という IIIF 画像サーバを、Lambda ベースの serverless-iiif に移行した記録です。
- うさぎ
- どうして移行しようと思ったの?
- WhiteCUL
- 主にセキュリティとコスト面です。EC2 を公開していると OS パッチ、Docker イメージの脆弱性、Java の CVE 追従など、継続的な作業が多くありました。サーバレス化すれば OS 管理が AWS の範囲になります。
- うさぎ
- コスト面ではどれくらい違うの?
- WhiteCUL
- t3.large 24 時間稼働で月 60 ドル以上かかっていましたが、過去 30 日のトラフィックから試算すると月 4 ドル程度になる見込みでした。
serverless-iiif の選定と特徴比較
- Samvera の serverless-iiif は SAR から 1 コマンドでデプロイ可能
- Cantaloupe は柔軟・高機能、serverless-iiif は軽量・マネージド
- うさぎ
- serverless-iiif ってどういうものなの?
- WhiteCUL
- Samvera プロジェクトが提供する Node.js + sharp で動く IIIF Image API サーバを Lambda にパッケージしたものです。AWS Serverless Application Repository から 1 コマンドでデプロイできます。
- うさぎ
- Cantaloupe と比べてどう違うの?
- WhiteCUL
- Cantaloupe は 100 以上のパラメータで詳細設定でき、プロセッサも TurboJpeg や Kakadu など選べます。serverless-iiif はパラメータが 10 個程度と少なく、エンジンは sharp 固定です。
- うさぎ
- キャッシュはどうなるの?
- WhiteCUL
- Cantaloupe はアプリ内に 3 層のキャッシュを持てますが、serverless-iiif は Lambda がステートレスなので CloudFront による外付けキャッシュが前提です。
性能比較とリージョン選定
- us-east-1 より Tokyo Lambda の方が応答が速い
- CloudFront の CDN ヒットは両者とも 50ms 前後
- うさぎ
- 速度はどれくらい出るの?
- WhiteCUL
- 東京からの計測で、Cantaloupe の origin は info.json が 550〜580 ミリ秒でしたが、実はこれは CloudFront のキャッシュヒットでした。サーバレス Tokyo の cold は 790〜900 ミリ秒で、実用上ほぼ同等でした。
- うさぎ
- CloudFront のヒット率が高ければ問題ないのね。
- WhiteCUL
- そうです。キャッシュヒット時は両方とも 50 ミリ秒前後で返ります。タイル画像は内容が変わらないので TTL を 1 年に設定できます。
- うさぎ
- us-east-1 と Tokyo でどう違ったの?
- WhiteCUL
- S3 のバケットと Lambda が同じリージョンだと、クロスリージョンのラウンドトリップが省けます。Tokyo Lambda は us-east-1 版より明確に速い結果でした。
セキュリティ強化
- OAC for Lambda Function URL で直接アクセスを遮断
- Reserved concurrency でコスト爆発を物理的に防止
- うさぎ
- セキュリティはどう強化したの?
- WhiteCUL
- CloudFront の Origin Access Control for Lambda を設定して、Lambda Function URL に SigV4 署名付きでリクエストするようにしました。直接 URL を叩くと 403 が返ります。
- うさぎ
- コスト爆発対策はどうしたの?
- WhiteCUL
- Reserved concurrency を 50 に設定しました。同時実行が 50 を超えると 503 で fail-fast になるので、攻撃時でも費用が青天井にはなりません。
- うさぎ
- WAF も使ったの?
- WhiteCUL
- はい。組織内の共有 WAF に rate-based ルールが既にあったため、CloudFront に attach するだけで自動的に適用されました。
カットオーバーの落とし穴
- associate-alias は DNS 検証エラーで通らなかった
- DNS 切替 → alias 追加の順序が正解
- うさぎ
- 本番への切り替えで詰まったことはあった?
- WhiteCUL
- CloudFront の associate-alias API を使おうとしたら DNS 検証エラーで通りませんでした。ドキュメントと挙動が一致しない状況で、最終的に手動の update-distribution に切り替えました。
- うさぎ
- どういう順序で進めたの?
- WhiteCUL
- 旧 CloudFront から alias を削除、DNS を新 CloudFront に切り替え、その後で新 CloudFront に alias を追加という順序です。DNS が新 CF を指した状態でないと alias 追加が CNAMEAlreadyExists で弾かれます。
- うさぎ
- サービス断はどれくらいだったの?
- WhiteCUL
- 概ね 2〜3 分でした。事前に DNS の TTL を 300 秒から 60 秒に下げておいたことで、クライアント側のキャッシュが早く失効して短く済みました。
まとめ
- S3 + Lambda + CloudFront の構成で月 4 ドル程度に削減
- 移行は「DNS 切替 → alias 追加」の順序が重要
- うさぎ
- 今日のポイントをまとめてほしいわ。
- WhiteCUL
- S3 に置いた画像を IIIF で公開するのが主目的で、アクセスが多くない場合は serverless-iiif が運用負荷とコストの両面で有利です。
- WhiteCUL
- OAC for Lambda URL で直接アクセスを遮断、Reserved concurrency でコスト上限を設定するセキュリティ対策が有効でした。
- うさぎ
- カットオーバーには注意が必要ね。
- WhiteCUL
- そうですね。DNS 切替と CloudFront alias 追加の順序、事前の TTL 短縮が大事でした。
- うさぎ
- よく分かったわ。ありがとう!