[Flutter] S3 버킷에 업로드한 파일 삭제하기
단일 객체 삭제 방법은 상단의 글을 참고하고, 이번에는 여러 객체를 한 번에 삭제하는 방법을 알아보자.
Lambda 함수 생성
import { S3Client, DeleteObjectsCommand } from "@aws-sdk/client-s3";
const s3Client = new S3Client({ region: 'ap-northeast-2' });
export const handler = async (event) => {
// body에 JSON.parse 하면 에러 발생함
const { objectKeys } = event.body;
if (!objectKeys) {
return {
statusCode: 400,
body: JSON.stringify({ error: 'Missing or invalid object keys' }),
};
}
const command = new DeleteObjectsCommand({
Bucket: process.env.BUCKET_NAME,
Delete: {
Objects: objectKeys.map(key => ({ Key: decodeURIComponent(key) })),
},
});
try {
await s3Client.send(command);
return {
statusCode: 200,
body: JSON.stringify({
message: 'Objects deleted successfully',
objectKeys: objectKeys,
}),
};
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message }),
};
}
};
람다에 `deleteMultipleObjects`라는 이름의 함수를 생성한다. 바디에서 객체들의 오브젝트 키 값을 담은 리스트 `objectKeys`를 전달받는다. 오브젝트 키에 `/`가 들어갈 경우 URI 디코딩 과정이 추가된다.
JavaScript sdk `DeleteObjectsCommand`를 사용한다.
API Gateway 리소스 생성
API Gateway에 `POST` 유형의 `/deleteMultipleObjects` 리소스를 생성한다.
HTTP 헤더에 `method.request.header.objectKeys`를 추가한다.
{
"body": $input.json('$')
}
매핑 템플릿도 추가하고 API를 배포한다.
플러터 애플리케이션에 적용
Future<void> deleteMultipleObjects({
required List<String> photoUrls,
}) async {
try {
final List<String> objectKeys = photoUrls.map((photoUrl) {
final Uri uri = Uri.parse(photoUrl);
return uri.path.substring(1); // 이미지 URL의 오브젝트 키
}).toList();
final url = Uri.parse('$awsApiBaseUrl/deleteMultipleObjects');
final response = await http.post(
url,
headers: {
'Content-Type': 'application/json',
},
body: json.encode({
'objectKeys': objectKeys,
}),
);
final Map<String, dynamic> responseData = json.decode(response.body);
if (responseData['statusCode'] == 200) {
print('Objects deleted successfully. ${response.body}');
} else {
print('Failed to delete objects: ${response.body}');
}
} catch (e) {
print('An error occurred during deleteMultipleObjects: $e');
}
}
S3에 업로드된 객체의 URL에서 오브젝트 키만 추출한 리스트를 바디에 담아서 `post` 요청을 한다.