-
nestjs에서 alibaba cloud OSS sdk 사용하기 (ali-oss)Backend 2023. 6. 28. 17:43
AWS S3를 이용하다가, 중국 진출과 함께 Alibaba Cloud의 클라우드 데이터 스토리지 서비스인 OSS로 이전하게 되었다.
그래서 기존 S3와 연동된 소스코드도 수정을 해야 했다.
다행히 알리바바에서 SDK를 지원해주고, 기존 코드를 크게 고치지 않아도 연동이 된다.
목표는, OSS에 이미지 파일을 업로드 하는 것이다.
1. 모듈 설치 (https://www.npmjs.com/package//ali-oss?activeTab=readme)
npm install ali-oss --save
2. 사전 인터페이스 및 OSS 서비스 작성
// IFile.ts export interface IFile { encoding: string; buffer: Buffer; fieldname: string; mimetype: string; originalname: string; size: number; }
// ali-oss.service.ts ... import OSS = require('ali-oss'); @Injectable() export class AliOSSService { private readonly oss: OSS; private readonly uploadImagePath: String; constructor( public configService: ApiConfigService, ) { const aliOssConfig = configService.aliOssConfig; this.oss = new OSS({ region: aliOssConfig.bucketRegion, accessKeyId: aliOssConfig.accessKey, accessKeySecret: aliOssConfig.secretKey, bucket: aliOssConfig.bucketName, endpoint: aliOssConfig.endpoint, }); this.uploadImagePath = aliOssConfig.uploadImagePath; } async uploadImage(file: IFile) { try { const result = await this.oss.put( this.uploadImagePath+hash(file.originalname), file.buffer ); return result; } catch (e) { console.log(e); } } }
3. controller 작성
//controller.ts @Post('oss') @UseInterceptors(FileInterceptor('image')) uploadImageOSS(@UploadedFile() image: IFile) { return this.imageUploadService.uploadImageOSS(image); }
4. service 작성
// service.ts ... import { AliOSSService } from '**/ali-oss.service'; @Injectable() export class ImageUploadService { constructor( ... private readonly aliOSSService: AliOSSService, ) {} async uploadImageOSS(image: IFile) { if(image === undefined || image === null) { throw new NotFoundException("Not Found!"); } const uploadedInfo = await this.aliOSSService.uploadImage(image); // 아래 양식은 자유입니다. return { image_url: uploadedInfo?.url, message: "성공관련 메시지!", field: "image", name: uploadedInfo?.name ? path.basename(uploadedInfo?.name) : "", }; }
postman으로 테스트 해보면 아래와 같은 결과가 나온다.
알리바바 클라우드 콘솔에서 확인해보면 된다.
아 그리고 팁을 하나 남기자면,
ACL(Access Control List)를 private 또는 inherited from Bucket을 한 경우 해당 파일마다 생성되는 access-key가 있지 않는 한, 알리바바 클라우드 외부에서의 접근이 제한된다.
이런 경우 ECS(AWS의 EC2)에서는 접근이 가능하도록 할 수 있다.
1. 먼저 RAM(AWS의 IAM)에서 사용자 권한을 설정한다.
각자의 상황과 환경에 맞춰서 지정하면 된다.
2. 그리고 다시 OSS의 Bucket Policy 설정 탭으로 이동한다.
3. 그리고 Authorize 버튼을 클릭한다.
4. 다음과 같이 RAM User 설정과 VPC를 지정해준다.
이렇게 해주면 내부 환경인 ECS, 정확히 말하면 설정된 VPC 환경 내에서 접근이 가능하다.
5. 테스트
ECS에 접속해 curl으로 다운로드를 해보자.
다운로드 된 것을 확인 할 수 있다.
참고 사이트 공유
https://www.npmjs.com/package//ali-oss
https://www.alibabacloud.com/help/en/object-storage-service/latest/node-js-quick-start
https://www.alibabacloud.com/help/en/object-storage-service/latest/migrate-from-s3-to-oss
https://www.alibabacloud.com/help/en/object-storage-service/latest/initiate-a-request
'Backend' 카테고리의 다른 글
[prisma] 데이터 손실 없이 migrate 하기 (0) 2023.05.24 letsencrypt로 무료 ssl key 발급 후 적용시키기(nginx, certbot) (0) 2023.04.12 (letsencrypt) error no valid A records found for ; no valid AAAA records found for (0) 2023.04.11 helm 설치 후 자동완성 기능 추가 (0) 2023.04.10 [node] How to limit the HTTP request size and upload file size? (0) 2022.06.30