[SeSACX코딩온] AWS

JUHEE·2024년 4월 9일
0

SeSACX코딩온

목록 보기
20/26

- 이번 수업은 aws로 배포관련 설정을 해보는 시간이었다
- 항상 느끼는데 수업 중에 설치 수업이 제일 어려움... 뭔가 흐어억하고 따라하다가 놓치고 실수하는 경우가 많다고나 할까..

AWS

- aws는 amazon web service의 약자로 세계 1위의 점유율을 차지하고 있는 서비스이다
- cloud computing platform으로 손쉽게 클라우드 구축이 가능하고 개발자가 신경써야할 부분이 적다는 장점이있다
- 대표적으로 이전에 진행한 프로젝트에서는 이미지파일을 로컬스토리지에 따로 저장했지만 aws는 파일 서버에 따로 저장(돈내야함)해준다

EC2

- Elastic Compute Cloud, 독립된 컴퓨터를 임대해주는 클라우드 서비스이다
- 특징은 컴퓨팅 요구사항의 변화에 따라 컴퓨팅 자원을 조절할 수 있고, 사용한만큼만 지불할 수 있다는 점이 있다
- 수업에서는 가장 저렴한 범용 t2타입을 사용했다
- aws사이트에서 인스턴스 시작을 눌러 생성할 수 있다. 우리는 ubuntu서버로 생성하고 putty로 (login as ubuntu) 접속했다

RDS

- Relational Database Service
- aws의 관계형 데이터 베이스로 aws에서 db를 관리하고, 개발자는 개발만 할 수 있도록 도와주는 서비스이다
- aws에서 db를 사용하는 방법은 EC2에 mysql설치하여 사용자가 db관리하는 방법과, rds를 사용해서 aws에서 관리하도록 하는 방법 2가지가 있는데 뒤의 방법이 편하지만 (비용이 있다)
- rds db생성 후 파라미터 편집으로 time_zone을 한국시간으로 변경 후 인바운드 규칙을 추가하고 workbench에 연결해서 사용했다

RDS 실습

- 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으로 해봄)

S3

- Simple Storage Service(S3)
- 내구성, 확장성이 뛰어난 스토리지 서비스
- 무제한 객체 저장공간을 제공하며 편리한 ui로 어디서나 쉽게 데이터를 가져올 수 있다
- 용어정리: bucket(객체를 저장하는 컨테이너), object(저장되는 데이터), key(객체 찾기위해 사용하는 고유식별자), region(지역)

IAM

- 무지무지 중요한 보안 서비스
- aws에서제공하는 서비스를 안전하게 제어할 수 있는 서비스로 IAM으로 aws 서비스에 대한 권한을 설정하고, 키를 발급받아서 해당 키를 가진 사람만 서비스를 이용할 수 있도록 하는 것이다
- 사용자 생성 후 access key만들기를 눌러 키를 발급받을 수 있다. 해당키는 발급할 때 액세스키, 비밀액세스키 두 가지를 발급해주는데 화면을 벗어나면 절대 다시는 볼 수 없기 때문에 .csv파일을 다운로드 하든지 복사해서 따로 저장해두어야한다!! 필수!!
- 이후 vscode에서 app.js 이거저거 설정할 때 해당 키를 사용해야 설정이 가능하다
- 수업에서는 env파일에 저장해서 가져다가 사용하고 gitignore로 못올라가게 했다

S3실습

- 일단 위에서 받은 키를 사용해서 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에 접근할 수 있다

profile
초보개발자

0개의 댓글