- 이번 수업은 aws로 배포관련 설정을 해보는 시간이었다
- 항상 느끼는데 수업 중에 설치 수업이 제일 어려움... 뭔가 흐어억하고 따라하다가 놓치고 실수하는 경우가 많다고나 할까..
- aws는 amazon web service의 약자로 세계 1위의 점유율을 차지하고 있는 서비스이다
- cloud computing platform으로 손쉽게 클라우드 구축이 가능하고 개발자가 신경써야할 부분이 적다는 장점이있다
- 대표적으로 이전에 진행한 프로젝트에서는 이미지파일을 로컬스토리지에 따로 저장했지만 aws는 파일 서버에 따로 저장(돈내야함)해준다
- Elastic Compute Cloud, 독립된 컴퓨터를 임대해주는 클라우드 서비스이다
- 특징은 컴퓨팅 요구사항의 변화에 따라 컴퓨팅 자원을 조절할 수 있고, 사용한만큼만 지불할 수 있다는 점이 있다
- 수업에서는 가장 저렴한 범용 t2타입을 사용했다
- aws사이트에서 인스턴스 시작을 눌러 생성할 수 있다. 우리는 ubuntu서버로 생성하고 putty로 (login as ubuntu) 접속했다
- Relational Database Service
- aws의 관계형 데이터 베이스로 aws에서 db를 관리하고, 개발자는 개발만 할 수 있도록 도와주는 서비스이다
- aws에서 db를 사용하는 방법은 EC2에 mysql설치하여 사용자가 db관리하는 방법과, rds를 사용해서 aws에서 관리하도록 하는 방법 2가지가 있는데 뒤의 방법이 편하지만 (비용이 있다)
- rds db생성 후 파라미터 편집으로 time_zone을 한국시간으로 변경 후 인바운드 규칙을 추가하고 workbench에 연결해서 사용했다
- app.js코드는 기존과 큰 차이가 없다. 실습에서는 sequelize를 model폴더에 따로 만들지 않고 그냥 app.js에서 진행했다
- sequelize 생성 시 rds의 정보를 가지고 연결해준다
- 아래의 DBHOST는 rds의 end point(미리 저장해둠)이다
- DB정보들은 rds 설정 시 설정된 정보들이라고 보면됨
- workbench연결은 위에서 설명한 것과 같이 했고, vscode는 기존에 깔아둔 확장 프로그램을 이용해서
- 요걸루 connect해주었다. 밑의 rds-connection이 그것임
// config 설정
const sequelize = new Sequelize(
process.env.DB_NAME,
process.env.DB_USER,
process.env.DB_PASSWORD,
{
host: process.env.DB_HOST,
dialect: "mysql",
}
);
const User = userModel(sequelize);
- 이후 sequelize를 이용하여 테이블 생성하고, 데이터 추가, 조회 등의 작업을 해보면 문제없이 잘 작동하는 것을 알 수 있다(postman으로 해봄)
- Simple Storage Service(S3)
- 내구성, 확장성이 뛰어난 스토리지 서비스
- 무제한 객체 저장공간을 제공하며 편리한 ui로 어디서나 쉽게 데이터를 가져올 수 있다
- 용어정리: bucket(객체를 저장하는 컨테이너), object(저장되는 데이터), key(객체 찾기위해 사용하는 고유식별자), region(지역)
- 무지무지 중요한 보안 서비스
- aws에서제공하는 서비스를 안전하게 제어할 수 있는 서비스로 IAM으로 aws 서비스에 대한 권한을 설정하고, 키를 발급받아서 해당 키를 가진 사람만 서비스를 이용할 수 있도록 하는 것이다
- 사용자 생성 후 access key만들기를 눌러 키를 발급받을 수 있다. 해당키는 발급할 때 액세스키, 비밀액세스키 두 가지를 발급해주는데 화면을 벗어나면 절대 다시는 볼 수 없기 때문에 .csv파일을 다운로드 하든지 복사해서 따로 저장해두어야한다!! 필수!!
- 이후 vscode에서 app.js 이거저거 설정할 때 해당 키를 사용해야 설정이 가능하다
- 수업에서는 env파일에 저장해서 가져다가 사용하고 gitignore로 못올라가게 했다
- 일단 위에서 받은 키를 사용해서 aws.config설정을 해야 사용할 수 있다
- 그 전에 다운받아 사용한 모듈은 아래와 같다
const express = require("express");
const app = express();
const multer = require("multer");
const aws = require("aws-sdk");
const dotenv = require("dotenv");
const multerS3 = require("multer-s3");
dotenv.config();
const PORT = process.env.PORT;
- 그리고 env파일에 숨겨놓은 키와 region을 이용해서 config설정을 해준다
//aws 설정
aws.config.update({
accessKeyId: process.env.AWS_S3_ACCESS_KEY,
secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
region: process.env.AWS_S3_REGION,
});
- 여기까지가 aws설정이고 s3설정은 일단 aws.S3();을 가져와서 s3를 생성한다
- 그 후 multer를 사용하여 파일저장관련 설정을 진행해주는데 여기서 위의 s3와 multerS3모듈을 사용해서 설정이 필요하고, bucket 이름으로 저장할 곳을 지정해준다(원래는 destination을 로컬 스토리지로 저장했었음)
const s3 = new aws.S3();
//s3 관련 multer설정
const upload = multer({
storage: multerS3({
s3: s3,
bucket: process.env.AWS_S3_BUCKET,
acl: "public-read", //파일 접근 권한
//key가 중복되지 않게 원래이름에 현재시간 더해서 설정한거에용
key: (req, file, cb) => {
cb(null, Date.now().toString() + "-" + file.originalname);
},
}),
});
- 놀랍게도 설정은 끝났습니다
- 그 후 form의 input태그로 file을 전송하고 routing 처리를 해주면 놀랍게도 내 버켓에 해당 이미지가 들어와 저장되어 있다
- 이미지는 https://로 시작하는 주소에 저장되어 해당 url을 src에 입력하면 정상적으로 보이는데 file업로드시 가져오는 req.file데이터는 아래 주석과 같이 구성되어 있다
// POST /upload
app.post("/upload", upload.single("image"), (req, res) => {
console.log(req.file);
// {
// fieldname: 'image',
// originalname: '구ë¦\x84.jpg',
// encoding: '7bit',
// mimetype: 'image/jpeg',
// size: 5423,
// bucket: 'bucket-juhee',
// key: '1712555843311-구ë¦\x84.jpg',
// acl: 'public-read',
// contentType: 'application/octet-stream',
// contentDisposition: null,
// contentEncoding: null,
// storageClass: 'STANDARD',
// serverSideEncryption: null,
// metadata: null,
// location: 'https://bucket-juhee.s3.ap-northeast-2.amazonaws.com/1712555843311-%C3%AA%C2%B5%C2%AC%C3%AB%C2%A6%C2%84.jpg',
// etag: '"d210b34c80ec53e1746a7f07d7d7179d"',
// versionId: undefined
// }
// res.send("이미지 업로드 중...");
res.render("index", { imageUrl: req.file.location });
});
- 여기서 req.file.locaion을 사용하여 해당 url에 접근할 수 있다