🖨️ AWS-S 3ファイルのコピー中に発生した問題(copyObject)

18693 ワード

現在の項目の静止画ファイルは、AWS S3を用いて処理される.

発生した問題

S3.copyObject()の使用を開始した当初は、Access Deniedが発生したため、パケットポリシーやアクセス権限が正しく付与されていないと勘違いしていたため、Google検索を行う際に、これらを入力しながらテストを継続していた.
何を入力しても、Access Deniedがずっと出てくるので、ずっと問題の所在を探していましたが、最後にここです。でヒントを得て、問題を解決しました.Access Deniedは権限の問題かもしれませんが、誤ったパスを入力してもこのような状況が発生することを理解しています.
正確な原因は分かりませんが、copyObject()を行う場合、Key버킷명/度を貼り付けてから経路を正常に認識する必要があります.
この部分を知らないで别の问题が长い间の问题の原因を探したのだと思っています...
bucketポリシーでは、"s3:GetObject"および"s3:PutObject"のみが許可され、アクセス権がすべて開かれていることに注意してください.
  • エラーコード
  • export const copyPhoto = (originalSource: string) =>
      S3.copyObject(
        {
          Bucket: "blemarket",
          CopySource: originalSource,
          Key:
            originalSource.slice(0, originalSource.lastIndexOf("/")) +
            "/remove" +
            originalSource.slice(originalSource.lastIndexOf("/")),
        },
        (error, data) => {
          if (error) {
            console.error("error >> ", error);
          }
        }
      );
  • 通常コード
  • export const copyPhoto = (originalSource: string) =>
      S3.copyObject(
        {
          Bucket: "blemarket",
          CopySource: "blemarket/" + originalSource,
          Key:
            originalSource.slice(0, originalSource.lastIndexOf("/")) +
            "/remove" +
            originalSource.slice(originalSource.lastIndexOf("/")),
        },
        (error, data) => {
          if (error) {
            console.error("error >> ", error);
          }
        }
      );

    完全的桑普尔科德

    import AWS from "aws-sdk";
    import multer from "multer";
    import multerS3 from "multer-s3";
    
    // 헬퍼 함수
    export const getPhotoPath = (filename: string) =>
      `images/${process.env.NODE_ENV}/${filename}_${Date.now()}`;
    
    AWS.config.update({
      region: process.env.BLEMARKET_AWS_REGION,
      accessKeyId: process.env.BLEMARKET_AWS_ACCESS_KEY,
      secretAccessKey: process.env.BLEMARKET_AWS_SECRET_KEY,
    });
    
    const S3 = new AWS.S3();
    
    // multerS3를 이용해서 이미지 추가 처리
    const upload = multer({
      storage: multerS3({
        s3: S3,
        bucket: "blemarket",
        key(req, file, cb) {
          const filename = file.originalname.split(".")[0];
          cb(null, getPhotoPath(filename));
        },
      }),
      limits: { fileSize: 1024 * 1024 }, // 1mb
    });
    
    
    // 이미지 제거 함수
    export const deletePhoto = (photo: string) =>
      S3.deleteObject(
        {
          Bucket: "blemarket",
          Key: photo,
        },
        (error, data) => {
          if (error) {
            console.error("error >> ", error);
          }
        }
      );
    
    // 이미지 이동 함수
    export const copyPhoto = (originalSource: string) =>
      S3.copyObject(
        {
          Bucket: "blemarket",
          CopySource: "blemarket/" + originalSource,
          Key:
            originalSource.slice(0, originalSource.lastIndexOf("/")) +
            "/remove" +
            originalSource.slice(originalSource.lastIndexOf("/")),
        },
        (error, data) => {
          if (error) {
            console.error("error >> ", error);
          }
        }
      );