티스토리 뷰
서버리스 이해하기
이 장에서는 서버리스 아키텍처와 노드를 함께 사용하는 방법을 소개한다. 이미지를 업로드한 후, 리사이징해서 클라우드 저장소에 업로드할 것이다.
서버리스는 서버가 없다는 뜻이지만, 사실 서버가 없는 것은 아니다. 서버를 클라우드 서비스가 대신 관리해주므로 개발자나 운영자가 서버를 관리하는 데 드는 부담이 줄어든다는 의미다. 즉, 개발자는 자신의 서비스 로직을 작성하는 데만 집중할 수 있게 되는 것이다.
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 작성
'책 > nodejs 교과서' 카테고리의 다른 글
15. AWS와 GCP로 배포하기 (0) | 2021.03.14 |
---|---|
14. CLI 프로그램 만들기 (0) | 2021.03.08 |
13. 실시간 경매 시스템 만들기 (0) | 2021.03.07 |
12. 웹 소켓으로 실시간 데이터 전송하기 (0) | 2021.03.04 |
11. 노드 서비스 테스트하기 (0) | 2021.03.02 |