🐡
Gen2がGAされた。Storage(S3)の機能がとてもありがたい
これらの続きです。
preview版と比べて、Storage(S3)の機能連携のアップデートがとてもありがたい。
bucketのevent駆動で書く、lambdaのtriggerが簡単に設定できる
amplify/storage/resource.ts
export const storage = defineStorage({
name: 'myProjectFiles',
//ここで、triggerを設定できる。
triggers: {
//uploadしたときのlambda trigger
onUpload: defineFunction({
entry: './on-upload-handler.ts'
}),
//deleteしたときのlambda trigger
onDelete: defineFunction({
entry: './on-delete-handler.ts'
})
}
});
lambda関数に関しては、実際にamplify/storage
配下に配置できてs3 lambda triggerが何が設定されてるかが特定しやすくなりましたね。gen1の頃は、使用する、lambdaは、全てamplify/backend/function/
に入ってて、何かのトリガーで動くものなのか?そうでないものなのか分かりづらかったのですが、gen2になって、s3のtriggerで動くものは、amplify/storage/
に入れられるようになったので、認識コストが大幅に押さえられますね
amplify/storage/on-upload-handler.ts
import type { S3Handler } from 'aws-lambda';
export const handler: S3Handler = async (event) => {
const objectKeys = event.Records.map((record) => record.s3.object.key);
console.log(`Upload handler invoked for objects [${objectKeys.join(', ')}]`);
};
bucketに追加されたObjectをcopy/removeをしてくれるAPIの追加
copy
ただし、1処理につき、コピーできるファイルの容量は5GB
みたいです。
import { copy } from 'aws-amplify/storage';
const copyFile = async () => {
try {
const response = await copy({
source: {
path: 'album/2024/1.jpg',
// Alternatively, path: ({identityId}) => `album/{identityId}/1.jpg`
},
destination: {
path: 'shared/2024/1.jpg',
// Alternatively, path: ({identityId}) => `shared/{identityId}/1.jpg`
},
});
} catch (error) {
console.error('Error', err);
}
};
remove
frontend側で、onClick={}
とかで簡単にファイルが削除できるようになりますね。
import { remove } from 'aws-amplify/storage';
try {
await remove({
path: 'album/2024/1.jpg',
// Alternatively, path: ({identityId}) => `album/{identityId}/1.jpg`
});
} catch (error) {
console.log('Error ', error);
}
Discussion