-
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 를 출력하는 모습입니다
'Project > NYAM' 카테고리의 다른 글
거기는 업무 관리를 어떻게 하나요? (0) 2023.06.19 매장 조회수 적용 api 성능 개선기(promise.all) 성능 4배 올리기 (0) 2023.03.03 매장 리뷰수 계산 api 성능 문제 (0) 2023.02.28 "아니 디도스 공격을 받았다고요 ???" (0) 2023.02.25 몽고디비 필드값 다중 검색 $or 사용 및 향상 (1) 2023.02.24