Project/NYAM

S3 버킷 정책과 api 를 이용한 이미지 다운로드

sung.hyun.1204 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 를 출력하는 모습입니다