[Flutter] S3 버킷 여러 객체 한 번에 삭제하기

[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` 요청을 한다.

 

 

참고 문서