AWS Lambda + Docker + pyvipsを用いたPyramid Tiled Tiffファイルの作成


概要

AWS LambdaとDockerとpyvipsを用いて、S3に格納された画像から、Pyramid Tiled Tiffファイルを作成するイメージを作成しました。

Amazon ECR Public Galleryは以下です。

https://gallery.ecr.aws/nakamura196/lambda-docker-vips-python

ソースコードは以下です。

https://github.com/ldasjp8/lambda-docker-vips-python

以下、使用方法について説明します。

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-inputmy-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、タイムアウトを10秒に設定しました。

試す

これで準備は完了です。

以下の動画のように、バケットmy-lambda-docker-vips-python-inputに画像をアップロードしてみます。その結果、my-lambda-docker-vips-python-outputにtifファイルが作成されることを確認できます。

https://youtu.be/qVM0yjX2BnY

まとめ

Lambda関数を用いて、Pyramid Tiled Tiffファイルを作成することができました。

発展として、以下の記事「AWSサーバーレスアプリケーションによるIIIF Image Serverの構築」と組み合わせることで、S3へ画像を登録するだけで、自動的にIIIF Image APIによる画像配信を行うことができます。

https://zenn.dev/nakamura196/articles/72e49979edf582

具体的には、今回作成した出力用のバケットmy-lambda-docker-vips-python-outputを、上記の記事で紹介しているSourceBucketに指定することで実現できます。

備忘録としての記事ですが、他の方の参考にもなりましたら幸いです。