ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • S3 버킷 정책과 api 를 이용한 이미지 다운로드
    Project/NYAM 2023. 3. 3. 22:01

     

    s3 의 버킷 정책을 추가해보겠습니다.

     

    상황:

    이미지 파일을 다운로드가 필요한 요구사항이 들어왔습니다.

    본인의 로컬 컴퓨터로 다운로드 하기위해서는 s3 의 키값을 로컬로 저장하고 커맨드로 다운로드 가 가능하니 공식 문서를 참고하시길 바랍니다.

     

     

    추가로 api 를 이용하여 다운로드 환경을 구성할려다 브라우저에서 다운로드를 지원하는것을 개발중에 깨달아

    사진이 기획자분들에게 사진 객체의 url 을 전달하는 것으로 마무리 지었습니다.

     

    추가한 

    버킷의 정책은 다음과 같습니다.

     

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "CustomPublicRead",
                "Effect": "Allow",
                "Principal": "*",
                "Action": [
                    "s3:GetObject",
                    "s3:GetObjectVersion"
                ],
                "Resource": [
                    "arn:aws:s3:::nyam-storage/store/*",
                    "arn:aws:s3:::nyam-storage/test/*",
                    "arn:aws:s3:::nyam-storage/review/*",
                    "arn:aws:s3:::nyam-storage/report/*"
                ]
            }
        ]
    }

     

     

    특이한건 버전의 날짜가 달라지면 안된다는 것입니다.

     

    해당 JSON 정책은 "nyam-storage"이라는 S3 버킷에서 "store", "test", "review","report" 라는 4 개의 폴더에 대해 public read 권한을 부여하는 것입니다.

    즉, 이 정책을 적용하면 어떤 사용자든지 해당 폴더에 있는 객체를 읽을 수 있게 됩니다.

    자세한 설명은 다음과 같습니다.

    "Version": 정책 버전을 명시합니다. 여기서는 2012-10-17 버전을 사용하고 있습니다.


    "Statement": 정책이 가지는 권한의 목록입니다.

     

    "Sid": 권한 부여에 대한 설명을 기록하는 식별자입니다. 여기서는 "CustomPublicRead"라는 이름으로 지정되어 있습니다.

     

    "Effect": Allow 혹은 Deny 값을 설정하여 해당 권한을 부여할지 말지를 결정합니다. 여기서는 "Allow"로 설정되어 있습니다.


    "Principal": 이 권한을 받을 주체를 나타냅니다. "*"을 사용하면 모든 사용자에게 권한을 부여할 수 있습니다.


    "Action": 권한이 허용하는 작업의 목록입니다. 여기서는 "s3:GetObject"와 "s3:GetObjectVersion"이라는 두 가지 작업에 대해 권한을 허용하고 있습니다.


    "Resource": 이 권한이 적용되는 대상의 목록입니다. 여기서는 "nyam-storage" 버킷의 "store", "test", "review","report" 4 개의 폴더에 대해 권한을 설정하고 있습니다.


    따라서 이 정책을 적용하면 "nyam-storage" 버킷의 "store", ~ 폴더에 있는 객체들에 대해서는 모든 사용자가 읽을 수 있게 됩니다.

     

     

     

    다음은 api 를 이용하여 s3 오브젝트의 키를 받아 다운로드 하는 api 입니다.

    @Get('download')
      async fileExportDownload(@Body() body, @Res() res) {
        const { fileName } = body;
        console.log(`${fileName}`);
        try {
          const buffer = await this.fileService.downloadFileFromS3(`${fileName}`);
          res.send(buffer);
        } catch (error) {
          throw new BadRequestException(`File download failed: ${error}`);
        }
      }

     

    서비스 레이어에 들어가는 다운로드를 받는 코드 입니다.

    public async downloadFileFromS3(key: string): Promise<Buffer> {
        try {
          const s3Object = await this.awsS3
            .getObject({
              Bucket: this.S3_BUCKET_NAME,
              Key: key,
            })
            .promise();
    
          if (!s3Object.Body) {
            throw new BadRequestException(`File download failed: No s3Object body`);
          }
          return Buffer.from(s3Object.Body as string, 'binary');
        } catch (error) {
          throw new BadRequestException(`File download failed: ${error}`);
        }
      }

     

     

     

     

    추가공부로 필요한것 :

    buffer 로 받아온 데이터를 이미지 파일로 전환하고 원하는 폴더에 저장 방법이 필요합니다

     

    Buffer 를 출력하는 모습입니다 

Designed by Tistory.