Amplify StorageでS3トリガを設定するときにちょっと気を付けたいなってこと
やりたいことと発生していた問題
AWS Amplify Gen2では、Amplify Storageを使用することでS3上でのファイルの扱いを簡単に行うことができます。この機能を利用してS3にファイルをアップロードした際にそのイベントをトリガとしてAmplify Function(Lambda)を実行するということをやりたかったのですが、その際にちょっとハマったのでその解決方法を共有します。
S3バケット、Lambda関数の作成とトリガの設定
基本的にはドキュメント通りに進めれば問題ありません。
まずはS3バケットを作成してLambda関数にアクセス権限を付与します。
import { defineStorage, defineFunction } from '@aws-amplify/backend';
const demoFunction = defineFunction({});
export const storage = defineStorage({
name: 'myProjectFiles',
access: (allow) => ({
'media/*': [allow.resource(demoFunction).to(['read', 'write', 'delete'])]
})
});
このときdefineStorage
内にtrigger
を設定することでS3アップロード時や削除時のLambda関数のトリガを設定することができます。
しかし、S3キーのプレフィックスやサフィックスを指定してトリガを設定することはできないため、これを行う場合は別途addEventNotification
を使用してトリガを設定する必要があります。
backend.storage.resources.bucket.addEventNotification(
EventType.OBJECT_CREATED_PUT,
new LambdaDestination(backend.yourLambda.resources.lambda),
{
prefix: 'protected/uploads/',
suffix: '-uploadManifest.json',
}
);
トリガの設定における注意点
上記のドキュメントに記載のとおりトリガ設定を行いましたが、まれに発火しないことがありました。なんとなく大きめのファイルをアップロードしたときに発火しないことが多いような。。調べてみると以下のような記載があります。
Amplify will automatically perform an Amazon S3 multipart upload for objects that are larger than 5MB. For more information about S3's multipart upload, see Uploading and copying objects using multipart upload
つまり、5MB以上のファイルをアップロードした場合は上記ドキュメント記載のトリガ設定では発火しないということです。
解決方法
EventType.OBJECT_CREATED
を使用することで5MB以上のファイルでもトリガを発火させることができます!
おわり。
Discussion