[Flutter] S3 버킷에 업로드한 파일 삭제하기

플러터에서 S3에 올린 오브젝트를 삭제하는 방법을 소개한다.

 

[Flutter] S3 Presigned URL 발급받기 | AWS Lambda & API Gateway

AWS Lambda랑 API Gateway를 설정하는 자세한 절차에 대해서는 이미 게시물을 올렸기 때문에 이번 글에서는 코드 위주로 간단하게 설명한다.

 

Lambda 함수 생성

import { DeleteObjectCommand, S3Client } from "@aws-sdk/client-s3";

const s3Client = new S3Client({ region: 'ap-northeast-2' });

export const handler = async (event) => {
    const bucketName = "YOUR_BUCKET_NAME";
    const objectKey = event.queryStringParameters.objectKey;

    if (!bucketName || !objectKey) {
        return {
            statusCode: 400,
            body: JSON.stringify({ error: 'Missing bucket name or object key' }),
        };
    }

    const command = new DeleteObjectCommand({
      Bucket: bucketName,
      Key: objectKey
    });

    try {
        const result = await s3Client.send(command);
        return {
            statusCode: 200,
            body: JSON.stringify({ 
                message: 'Object deleted successfully', 
                objectKey: objectKey,
                result: result
            }),
        };
    } catch (error) {
        return {
            statusCode: 500,
            body: JSON.stringify({ error: error.message }),
        };
    }
};

람다에 `deleteObject`라는 이름의 함수를 생성한다. 오브젝트를 삭제하기 위해 `objectKey`를 파라미터로 받는다.

 

 

API Gateway 리소스 생성

API Gateway에 `DELETE` 유형의 `/deletebject` 리소스를 생성한다.

 

URL 쿼리 문자열 파라미터에 `method.request.querystring.objectKey`를 추가한다.

 

{
  "queryStringParameters": {
    "objectKey": "$input.params('objectKey')"
  }
}

[통합 요청] 탭에 매핑 템플릿까지 추가하고 API를 배포한다.

 

 

플러터 애플리케이션에 적용

  Future<void> deleteObject({
    required String photoUrl,
  }) async {
    final Uri uri = Uri.parse(photoUrl);
    // 기존 이미지 URL의 오브젝트 키
    final String objectKeyToDelete = uri.path.substring(1);

    // AWS 베이스 URL은 env로 관리
    final url = Uri.parse('$awsApiBaseUrl/deleteObject?objectKey=$objectKeyToDelete');

    try {
      final response = await http.delete(url); // AWS API에 특정 오브젝트 삭제 요청

      final Map<String, dynamic> responseData = json.decode(response.body);
      if (responseData['statusCode'] == 200) {
        print('Object deleted successfully. ${response.body}');
      } else {
        print('Failed to delete object: ${response.body}');
      }
    } catch (e) {
      print('Exception occurred while deleting object: $e');
    }
  }

이미지 URL에서 `objectKey`를 추출해서 API를 실행할 URL을 생성한 후 http 요청을 보낸다.

 

 

참고 문서