AWS Lambda + Docker + pyvipsを用いたPyramid Tiled Tiffファイルの作成
概要
AWS LambdaとDockerとpyvipsを用いて、S3に格納された画像から、Pyramid Tiled Tiffファイルを作成するイメージを作成しました。
Amazon ECR Public Galleryは以下です。
ソースコードは以下です。
以下、使用方法について説明します。
Amazon ECRリポジトリの作成
まず、ECRリポジトリを作成します。

次に、「プッシュコマンドの表示」から、コマンドを確認して、イメージをpushします。

以下、コマンドの例です。
git clone https://github.com/ldasjp8/lambda-docker-vips-python.git
cd lambda-docker-vips-python
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin XXXX.dkr.ecr.us-east-1.amazonaws.com
docker build -t lambda-docker-vips-python .
docker tag lambda-docker-vips-python:latest XXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-vips-python:latest
docker push XXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-vips-python:latest
結果、以下のようにイメージがECRリポジトリに表示されます。

そして、以下の「イメージのURI」をコピーしておきます。

Lambda関数の作成
次にLambda関数を作成します。今回は、my-lambda-docker-vips-pythonという関数名にしました。「コンテナイメージURI」に、先ほどコピーしたURIを入力します。

そして、「関数を作成」ボタンを押して、関数を作成します。
S3
バケットの作成
今回、画像を登録するためのバケットと、上記の関数により変換した画像を格納するバケットの2つを用意します。
今回は、my-lambda-docker-vips-python-inputとmy-lambda-docker-vips-python-outputの2つを作成しました。
イベント通知設定
my-lambda-docker-vips-python-inputバケットの「プロパティ」 > 「イベント通知」から、イベント通知を作成します。これにより、S3に画像が登録された際に、上記の関数が実行されるようにします。

「イベント名」をmy-lambda-docker-vips-python-input-event、「イベントタイプ」をすべてのオブジェクト作成イベント、「送信先」の「Lambda関数」をmy-lambda-docker-vips-pythonに設定しました。

Lambda関数の設定
環境変数の設定
Lambda関数に戻り、以下のように、環境変数を設定します。

具体的には、キー名にiiif_bucket_name、値には先ほど作成したS3バケット名my-lambda-docker-vips-python-outputを与えます。

アクセス権限
さらに、アクセス権限を付与します。以下のリンクからIAMに移動して、アクセス許可を追加します。

今回はテストなので、AmazonS3FullAccessを与えました。

基本設定
最後に、「基本設定」を編集します。例として、メモリを1024MB、タイムアウトを1分0秒に設定しました。

試す
これで準備は完了です。
以下の動画のように、バケットmy-lambda-docker-vips-python-inputに画像をアップロードしてみます。その結果、my-lambda-docker-vips-python-outputにtifファイルが作成されることを確認できます。
まとめ
Lambda関数を用いて、Pyramid Tiled Tiffファイルを作成することができました。
発展として、以下の記事「AWSサーバーレスアプリケーションによるIIIF Image Serverの構築」と組み合わせることで、S3へ画像を登録するだけで、自動的にIIIF Image APIによる画像配信を行うことができます。
具体的には、今回作成した出力用のバケットmy-lambda-docker-vips-python-outputを、上記の記事で紹介しているSourceBucketに指定することで実現できます。
備忘録としての記事ですが、他の方の参考にもなりましたら幸いです。
Discussion