Amplify StorageでS3トリガを設定するときにちょっと気を付けたいなってこと

2024/11/29に公開

やりたいことと発生していた問題

AWS Amplify Gen2では、Amplify Storageを使用することでS3上でのファイルの扱いを簡単に行うことができます。この機能を利用してS3にファイルをアップロードした際にそのイベントをトリガとしてAmplify Function(Lambda)を実行するということをやりたかったのですが、その際にちょっとハマったのでその解決方法を共有します。

S3バケット、Lambda関数の作成とトリガの設定

基本的にはドキュメント通りに進めれば問題ありません。
まずはS3バケットを作成してLambda関数にアクセス権限を付与します。

https://docs.amplify.aws/react/build-a-backend/storage/authorization/

amplify/storage/resource.ts
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を使用してトリガを設定する必要があります。

https://docs.amplify.aws/react/build-a-backend/storage/lambda-triggers/#more-advanced-triggers

amplify/backend.ts
backend.storage.resources.bucket.addEventNotification(
	EventType.OBJECT_CREATED_PUT,
	new LambdaDestination(backend.yourLambda.resources.lambda),
	{
		prefix: 'protected/uploads/',
		suffix: '-uploadManifest.json',
	}
);

トリガの設定における注意点

上記のドキュメントに記載のとおりトリガ設定を行いましたが、まれに発火しないことがありました。なんとなく大きめのファイルをアップロードしたときに発火しないことが多いような。。調べてみると以下のような記載があります。

https://docs.amplify.aws/react/build-a-backend/storage/upload-files/#multipart-upload

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以上のファイルをアップロードした場合は上記ドキュメント記載のトリガ設定では発火しないということです。

解決方法

https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html#supported-notification-event-types

EventType.OBJECT_CREATEDを使用することで5MB以上のファイルでもトリガを発火させることができます!

おわり。

Discussion