Skip to content

nCloud Object Storage 사용기

Najeong-Kim edited this page Nov 17, 2021 · 3 revisions

개요

1. 이 글의 목적

2021년 11월 16일 오후 2시 30분

김서진과 김나정은 네이버 클라우드 플랫폼(NCP)의 Object Storage를 이용하여 파일 업로드를 구현하려고 했다.

왜안되지와 얜왜되지를 반복하다가 끝내 성공!! 개발 과정을 기록으로 남기기로 했다.

이 글의 목적은? 네이버 클라우드 플랫폼 많이 사용해주세요~~하하하

2. 우리의 목표

우리의 첫번째 목표는 그룹을 생성할 때 그룹 썸네일 업로드하기!

image

프론트에서 inputonChange 이벤트를 걸어서 사진을 업로드하려고 했다.

과정

1. Object Storage 이용 신청하기

우리가 이용한 서비스는 NCP의 Object Storage이다.

Amazon S3와 호환성을 제공한다니 쉽게 사용할거라 믿었다! 이때는..

2. 버킷 생성하기

nCloud의 친절한 Object Storage 사용 가이드를 발견! 가이드를 따라서 버킷을 생성했다

KakaoTalk_Photo_2021-11-16-22-54-02

하라는 대로 버킷을 생성했다!

3. 오브젝트 업로드 코드 작성하기

우리는 자바스크립트에서 사용할 예정이므로 Javascript SDK를 참고하여 코드를 작성했다.

버킷 생성은 이미 진행했으므로 오브젝트 업로드 부분만 코드로 작성했다.

4. API 키 발급받기

그리고 네이버 클라우드에서 API Key를 발급받았다.

마이페이지 - 계정 관리 - 인증키 관리에서 발급받을 수 있다.

Key ID는 열심히 가렸다!ㅎㅎ

KakaoTalk_Photo_2021-11-16-21-21-00

그리고 .envACCESS_KEYSECRET_KEY를 추가해줬다. 이제 되겠지?

5. 파일 업로드 도전하기

파일 업로드를 시도해봤다! 어? 안된다.. 오류는 아래와 같았다.

Access to XMLHttpRequest at 'https://duxcord.kr.object.ncloudstorage.com/1_1.png' from origin 'http://localhost:3000' 
has been blocked by CORS policy: Response to preflight request doesn't pass access control check: 
No 'Access-Control-Allow-Origin' header is present on the requested resource.

CORS 오류가 뜨는 것이었다ㅠ

6. 오류 분석하기

열심히 검색을 한 결과! 버킷에 origin을 허용해줘야 한다고 한다.

AWS에는 권한을 직접 입력하여 문제를 해결할 수 있었다.

하지만 NCP는 postman으로 origin 허용 요청을 보내야 하는 것이었다.ㅜㅠ

7. PutBucketCORS 요청 시도하기

NCP는 해당 오류를 해결하는 문서도 제공하고 있었다! 감사합니다~~

PutBucketCORS 문서를 따라서 작업하면 CORS 설정을 할 수 있다고 한다.

예시에 따라 HTTP 헤더BODY를 적어서 https://{endpoint}/{bucket-name}?cors= 으로 PUT 요청을 보냈다.

endpoint에는 kr.object.ncloudstorage.com, bucket-name에는 버킷 이름을 입력했다.

계속 요청이 거절됐다. 검색을 열심히 해봤다.

그러다 부스트캠프 1년 선배님들의 Object Storage를 활용한 글을 발견!

헤더의 AuthorizationSignature Key를 넣어줘야 한다고 한다.

8. 서명 키 생성하고 적용하기

AWS signature v4 생성 방법 게시글을 참고하여 서명 키를 생성해보았다.

아래 코드는 JavaScript(Node.js)에서 crypto-js 라이브러리를 사용하여 서명 키를 생성하는 방법이다.

var crypto = require("crypto-js");

function getSignatureKey(key, dateStamp, regionName, serviceName) {
    var kDate = crypto.HmacSHA256(dateStamp, "AWS4" + key);
    var kRegion = crypto.HmacSHA256(regionName, kDate);
    var kService = crypto.HmacSHA256(serviceName, kRegion);
    var kSigning = crypto.HmacSHA256("aws4_request", kService);
    return kSigning;
}

getSignatureKey 함수로 서명 키를 만들어서 헤더의 Auth에 넣어보았다.

여전히 안된다!! 하.. 여기서 작업을 포기하고 아래의 선택지 중 하나로 가려고 했다.

(여기서 안 된 이유는 서명 키를 이상하게 만들어서였다!!)

  1. AWS S3로 갈아타기 (S3 스토리지에 업로드는 성공했다)

  2. 백에서 파일 업로드하기 (다른 팀들은 백에서 업로드를 해서 참고할 수 있을거라 생각했다)

네이버 교육이니 NCP를 써보기로 해서 1번은 탈락

2번으로 가려던 와중 <갓찬희님>의 등장!!!

postman으로 AWS Signature를 생성하는 방법을 알게 되었다.

9. Postman으로 AWS Signature 생성하기

Postman으로 AWS Signature 생성하는 방법 글을 참고하여 AWS Signature를 생성했다.

image

여기에 NCP의 AccessKey, SecretKey를 넣고 AWS Region에는 kr-standard, Service Name에는 s3를 넣었다.

KakaoTalk_Photo_2021-11-16-22-59-37

그러니 이렇게 헤더에 필요한 정보들이 포함된다! 오호~ 이제 되나 했는데!!

image

따흑... 안된다 ㅠㅠㅠ 마지막 관문이다...

Content-MD5에 대체 어떤 값을 넣어줘야 하는지 모르겠었다...

다시 한 번 <빛찬희님>의 도움!!! Postman에서 AWS S3를 검색해서 레퍼런스를 찾을 수 있었다

10. Postman에서 AWS S3 레퍼런스 활용하기

image

Postman에 AWS S3를 검색하면 많은 글이 나오는데 CollectionsAPI Evangelist가 적혀있는 글로 들어간다.

image

여기서 AWS S3/Buckets/CORS/PUT CORS에 들어가서 해당 자료를 fork한다.

그리고 우리가 처음에 넣었던 값들을 넣어준다.

image

Content-MD5는 알아서 넣어준다 허허 신기하구려~

BODY에는 XML로 아래와 같이 적어준다.

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://localhost:3000</AllowedOrigin>
   <AllowedMethod>PUT</AllowedMethod>
   <AllowedMethod>POST</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
 <CORSRule>
   <AllowedOrigin>*</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

해당하는 originPUTPOST 요청을 허용해주고 모든 originGET 요청을 허용해준다.

DELETE 요청은 필요하지 않으므로 허용하지 않았다.

추가로 허용하고 싶은 origin이 있으면 CORSRule을 추가해서 요청을 보내면 된다.

여러번 보내는게 아니라 CORSRule을 필요한만큼 넣어서 보내야한다!

11. 작업 완료하기

CORS 설정이 완료되니 업로드가 가능하다 ㅎㅎ

나머지 로직을 짜고 사진을 업로드해봤다.

image

짜란! 올라온다!!! 히히히

image

그룹 목록에서도 그룹 썸네일이 잘 보인다.

마무리

7시에 이미지 업로드 성공!!! 빠샤!!!

이미지 업로드가 쉬울줄 알았는데 생각보다 오래걸렸다...

참고할 자료가 많지 않아서 많은 구간에서 막혔다.

그래서 우리와 같은 문제를 겪는 사람들이 검색을 통해 이 글을 발견해서 잘 해결하면 좋겠다 ㅎㅎㅎ

작성자의 멘탈을 잡아준 김서진 캠퍼님

이번 문제에 해답을 선사해준 김찬희 캠퍼님

응원의 메시지를 보내준 신효근 캠퍼님

그리고 참고자료를 만들어주신 개발자 선생님들

모두 감사합니다!!!!!

참고한 사이트

네이버 클라우드 플랫폼 - Object Storage 개요 : https://guide.ncloud-docs.com/docs/storage-storage-6-1

네이버 클라우드 플랫폼 - Javascript SDK : https://guide.ncloud-docs.com/docs/storage-storage-8-4

boostcamp-2020/Project13-Web-Video-Editor의 Object Storage 글 : https://github.com/boostcamp-2020/Project13-Web-Video-Editor/wiki/Object-Storage

네이버 클라우드 플랫폼 - PutBucketCORS : https://api.ncloud-docs.com/docs/storage-objectstorage-putbucketcors

AWS 참조 안내서 - 서명 키 생성 방법 : https://docs.aws.amazon.com/ko_kr/general/latest/gr/signature-v4-examples.html#signature-v4-examples-javascript

Postman으로 AWS Signature 생성하기 : https://blog.knoldus.com/how-to-generate-aws-signature-with-postman/

Clone this wiki locally