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関数の設定が完了しました。バケットの入力ディレクトリに画像をアップロードすると、自動的に変換されて出力ディレクトリに配置されるようになります。
