JDeliを使用したAWS Lambda関数の例
JDeliは画像変換に最適です。このページでは、S3バケットにアップロードされた画像を自動的に指定された画像形式に変換するAWS Lambda関数のセットアップ方法を詳しく説明します。
始める前に、画像がアップロードされるS3バケットが必要です。Amazon S3 → Bucketsに移動し、「Create bucket」をクリックしてください。
「Bucket Name」を覚えやすい名前に設定します。このガイドではidr-jdeli-demoを使用します。
その他の設定はデフォルトのままにしておきます。

AWS Lambda → Functionsに移動し、「Create function」をクリックします。
Author from scratchが選択されていることを確認し、関数に適切な名前を付け(この例では関数名にもidr-jdeli-demoを使用します)、ランタイムをJava 17以降に設定します。その他はすべてデフォルトのままにしておきます。

Lambda関数を実行するためには、それを呼び出すトリガーを設定する必要があります。バケットへの画像アップロード時にトリガーさせたいので、S3バケット内にオブジェクトが作成されたときのトリガーを設定します。
左側のAdd Triggerをクリックし、ドロップダウンからS3を選択します。
バケットを選択し、イベントタイプを「All Object create events」に設定します。
この例では、処理済みと未処理の画像に同じバケットを使用します。そのため、未処理の画像は1つのルートディレクトリに、処理済みの画像は別のディレクトリに保存します。未処理の画像に対してのみトリガーさせたいので、プレフィックスをアップロード先のディレクトリに設定します。このガイドではinput/を使用します。

一部のファイル変換は、かなりのメモリを消費する可能性があるため、関数が使用できるメモリ量を増やす必要があります。
Configuration → General configurationに移動し、「Edit」をクリックします。
「Memory」を1024に設定します(非常に大きなファイルを変換する予定がある場合はさらに必要になるかもしれませんが、これは良い出発点です)。
また、「Timeout」を少なくとも1分に増やす必要があります。

Lambda関数が実行される前に、バケットへのアクセス権限を付与する必要があります。
これは、バケットに対する取得、配置、削除の権限を持つポリシーをアタッチすることで行います。
まず新しいポリシーを作成する必要があります。IAM → Policiesに移動し、「Create policy」をクリックします。
S3を選択し、Read→GetObject、Write→DeleteObject、Write→PutObjectを許可します。
 
リソースの下で、「Specific」にチェックが入っていることを確認し、「Add Arn」をクリックします。表示されるメニューで、「Resource bucket name」をバケットの名前(このガイドではidr-jdeli-demo)に設定し、「Any object name」にチェックを入れます。

下部の「next」をクリックし、ポリシーにわかりやすい名前と説明を付けます。

最後に、ポリシーを作成します。
次に、このポリシーをLambda関数にアタッチする必要があります。
IAM → Rolesに移動し、Lambda関数のロールを選択します(デフォルトでは、ロールの名前の後に-role-xxxxxxxxが続き、各xはランダムな数字または文字になります)。
「Permission policies」の下で、Add permissions → Attach policiesをクリックし、先ほど作成したポリシーを選択します。

すべてのセットアップが完了したので、最後にLambdaにコードをアップロードする必要があります。
このガイドでは、Lambda関数の実装として当社のGitHub にあるJDeli-Lambda を使用します。
この実装は、S3トリガーをキャッチし、アップロードされたファイルを設定された形式に変換し、変換されたファイルをバケット内の設定された出力ディレクトリにアップロードします。また、メタデータを使用した再帰実行の保護(アップロードされた変換済みファイルで関数が再度トリガーされることを防ぐ)や、変換後のソース画像の削除など、いくつかの追加機能もあります。
プロジェクトをLambdaにデプロイする詳細な手順はreadmeに記載されていますが、簡単なバージョンは次のとおりです:
以下のコマンドでプロジェクトをビルドします:
mvn clean package
次にAWS CLI でデプロイします:
aws lambda update-function-code --function-name idr-jdeli-demo --zip-file fileb://target/jdeli-lambda-1.0-SNAPSHOT.jar
idr-jdeli-demoをLambda関数に付けた名前に置き換えてください。
最後に、Lambda関数でCode → Runtime settingsに移動して「Edit」をクリックし、ハンドラーを以下のように設定します:
com.idrsolutions.Handler::handleRequest

これでLambda関数のセットアップが完了しました。バケットの入力ディレクトリに画像をアップロードすると、自動的に変換され、出力ディレクトリに配置されるようになります。
