티스토리 뷰

책/nodejs 교과서

16. 서버리스 노드 개발

안양사람 2021. 3. 15. 00:47
728x90
SMALL

서버리스 이해하기

이 장에서는 서버리스 아키텍처와 노드를 함께 사용하는 방법을 소개한다. 이미지를 업로드한 후, 리사이징해서 클라우드 저장소에 업로드할 것이다.

서버리스는 서버가 없다는 뜻이지만, 사실 서버가 없는 것은 아니다. 서버를 클라우드 서비스가 대신 관리해주므로 개발자나 운영자가 서버를 관리하는 데 드는 부담이 줄어든다는 의미다. 즉, 개발자는 자신의 서비스 로직을 작성하는 데만 집중할 수 있게 되는 것이다.

AWS는 람다, API 게이트웨이, S3등의 서비스가 유명하고, GCP에서는 앱 엔진, 파이어베이스, 클라우드 펑션스, 클라우드 스토리지 등의 서비스가 유명하다.

이 장에서는 NodeBird에서 업로드하는 이미지를 리사이징하거나 저장한다. AWS에서는 람다와 S3를, GCP에서는 클라우드 펑션스와 클라우드 스토리지를 사용

람다와 클라우드 펑션스는 특정한 동작을 수행하는 로직을 저장하고, 요청이 들어올 때 로직을 실행하는 서비스이다. 함수처럼 호출할 때 실행되므로 FaaS(Function as a Service)라고 불린다. 노드가 하기 버거운 이미지 리사이징과 같은 작업을 함수로 만들어 클라우드에 올리고, 리사이징이 필요할 때마다 FaaS 서비스를 호출하면 된다. 

S3와 클라우드 스토리지는 클라우드 데이터 저장소라고 생각하면 된다. 이미지 같은 데이터를 저장하고, 다른 사람에게 보여줄 수 있다.

AWS S3 사용하기

S3 권한 설정 화면에서 모든 퍼블릭 액세스 차단 체크박스 해제. 실무는 해제 안하는게 좋아

만들고 권한 > 버킷 정책 메뉴 선택, 버킷 정책 편집기에 다음 코드 입력

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddPerm",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::nodebirds3/*"
    }
  ]
}

여기서 키 만들자. 키파일 중요하는 데만 집중할 수 있게 되는 것이다.

 

AWS는 람다, API 게이트웨이, S3등의 서비스가 유명하고, GCP에서는 앱 엔진, 파이어베이스, 클라우드 펑션스, 클라우드 스토리지 등의 서비스가 유명하다.

 

이 장에서는 NodeBird에서 업로드하는 이미지를 리사이징하거나 저장한다. AWS에서는 람다와 S3를, GCP에서는 클라우드 펑션스와 클라우드 스토리지를 사용

 

람다와 클라우드 펑션스는 특정한 동작을 수행하는 로직을 저장하고, 요청이 들어올 때 로직을 실행하는 서비스이다. 함수처럼 호출할 때 실행되므로 FaaS(Function as a Service)라고 불린다. 노드가 하기 버거운 이미지 리사이징과 같은 작업을 함수로 만들어 클라우드에 올리고, 리사이징이 필요할 때마다 FaaS 서비스를 호출하면 된다. 

 

S3와 클라우드 스토리지는 클라우드 데이터 저장소라고 생각하면 된다. 이미지 같은 데이터를 저장하고, 다른 사람에게 보여줄 수 있다.

 

AWS S3 사용하기

S3 권한 설정 화면에서 모든 퍼블릭 액세스 차단 체크박스 해제. 실무는 해제 안하는게 좋아

 

만들고 권한 > 버킷 정책 메뉴 선택, 버킷 정책 편집기에 다음 코드 입력

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AddPerm",
      "Effect": "Allow",
      "Principal": "*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::nodebirds3/*"
    }
  ]
}

 

여기서 키 만들자. 키파일 중요

 

npm i multer-s3 aws-sdk

 

.env

S3_ACCESS_KEY_ID=AKIAID6RLNYHFCZEEODA
S3_SECRET_ACCESS_KEY=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

 

nodebird/routes/post.js

const AWS = require('aws-sdk');
const multerS3 = require('multer-s3');

AWS.config.update({
  accessKeyId: process.env.S3_ACCESS_KEY_ID,
  secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
  region: 'ap-northeast-2',
});
const upload = multer({
  // storage: multer.diskStorage({
  //   destination(req, file, cb) {
  //     cb(null, 'uploads/');
  //   },
  //   filename(req, file, cb) {
  //     const ext = path.extname(file.originalname);
  //     cb(null, path.basename(file.originalname, ext) + Date.now() + ext);
  //   },
  // }),
  storage: multerS3({
    s3: new AWS.S3(),
    bucket: 'nodebirds3',
    key(req, file, cb) {
      cb(null, `original/${Date.now()}${path.basename(file.originalname)}`);
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
});

router.post('/img', isLoggedIn, upload.single('img'), (req, res) => {
  console.log(req.file);
  // res.json({ url: `/img/${req.file.filename}` });
  res.json({ url: req.file.location });
});

AWS 람다 사용하기

이미 리사이징은 CPU를 많이 사용하는 작업이므로 람다로 분리

nodebird 폴더 외부에 aws-uplod 폴더를 만든 후 package.json 작성

 

 

 

 

 

 

 

 

 

728x90
LIST
댓글
공지사항