S3 버킷 정책과 api 를 이용한 이미지 다운로드
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 를 출력하는 모습입니다