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
を与えました。
基本設定
最後に、「基本設定」を編集します。例として、メモリを1024
MB、タイムアウトを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