IDrive 사용을 위한 공식 문서에는 AWS SDK v2를 사용 중이지만 이를 v3로 업그레이드 할 필요성이 있음 (2023년부터 maintenance 단계로 진입)

⇒ 추후에 개발 진행하면서 변경해야 할 것 같습니다.

JavaScript (v3) 용 SDK를 사용하는 Amazon S3 예제 - AWS SDK for JavaScript

현재 AWS SDK v2를 사용한 예시

import { Injectable } from '@nestjs/common';
import * as AWS from 'aws-sdk';
import * as fs from 'fs';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }

  async createBucket() {
    const endpoint = new AWS.Endpoint(process.env.IDRIVE_ENDPOINT);
    const s3 = new AWS.S3({
      endpoint,
      region: 'e2',
      credentials: {
        accessKeyId: process.env.IDRIVE_ACCESS_KEY_ID,
        secretAccessKey: process.env.IDRIVE_SECRET_ACCESS_KEY,
      },
      signatureVersion: 's3v4', // 이게 문제였어
    });

    // // file read call
    // const bucketName = 'test-bucket';
    // const objectName = 'test-folder/test.txt';
    // s3.getObject(
    //   {
    //     Bucket: bucketName,
    //     Key: objectName,
    //   },
    //   (err, data) => {
    //     if (err) console.error('Error:', err);
    //     else console.log(data.Body.toString('utf-8'));
    //   },
    // );

    // // head 'my-object' in bucket 'my-bucket' params
    // const params = {
    //   Bucket: 'test-bucket',
    //   Key: 'test-folder/test.txt',
    // };

    // // head object call
    // s3.headObject(params, function (err, data) {
    //   if (err) {
    //     console.log('Error:', err);
    //   } else {
    //     console.log('Success:', data);
    //   }
    // });

    //   // put object call
    //   try {
    //     const bucketName = 'test-bucket';
    //     const filePath = './test.jpg';
    //     const folderName = 'test-folder/';
    //     const objectName = `${folderName}test.jpg`;

    //     // Create folder
    //     const createFolderResponse = await s3
    //       .putObject({
    //         Bucket: bucketName,
    //         Key: folderName,
    //         ACL: 'public-read',
    //       })
    //       .promise();

    //     console.log('Create Folder Response:', createFolderResponse);

    //     // Upload file
    //     const params = {
    //       Bucket: bucketName,
    //       Key: objectName,
    //       ACL: 'public-read',
    //       Body: fs.createReadStream(filePath),
    //     };

    //     const uploadFileResponse = await s3.upload(params).promise();
    //     const objectUrl = process.env.IDRIVE_STORAGE_URL + '/' + objectName;

    //     console.log('Upload File Response:', uploadFileResponse);
    //     console.log('Object URL:', objectUrl);

    //     return objectUrl;
    //   } catch (error) {
    //     console.error('Error:', error);
    //     throw error;
    //   }
    // }

    // get Object put Pre Signed Url
    const bucketName = 'test-bucket';

    const objectParamsForPreSign = {
      Bucket: bucketName,
      Key: `test123.txt`,
      Expires: 6000, // 60초 동안만 url 유지
    };
    await s3
      .getSignedUrlPromise('putObject', objectParamsForPreSign)
      .then((data) => {
        console.log('Presigned URL : ', data);
      })
      .catch((error) => {
        console.error(error);
      });

    // // list buckets call
    // s3.listBuckets(function (err, data) {
    //   if (err) {
    //     console.log('Error:', err);
    //   } else {
    //     console.log('Success:', data);
    //   }
    // });

    // // create/delete bucket call
    //   const params = {
    //     Bucket: 'test-bucket',
    //   };

    //   s3.deleteBucket(params, function (err, data) {
    //     if (err) {
    //       console.log('Error:', err);
    //     } else {
    //       console.log('Success:', data);
    //     }
    //   });
  }
}

참고

Javascript용 AWS SDK