[AWS] Sprint AWS 3tier-architecture 설계

BoongDev·2023년 4월 19일
0

AWS

목록 보기
2/2
post-thumbnail

Diagram

  • 위 Diagram 중 S3 Bucket 정적 웹 사이트 호스팅과 EC2-RDS 연결까지 진행

S3 static web hosting

React 기반으로 작성된 Front 를 Build 하여 S3 bucket 에 업로드 한다.

  • 단, build 폴더로 업로드시 경로가 꼬일 수 있으니 조심

Bucket 의 속성에서 정적 웹 사이트 호스팅 편집


정적 웹 사이트 호스팅 설정, 리액트의 인덱스 문서 index.html 지정 등


Bucket 의 접속 정책 생성

S3 정적 웹 사이트 접속

Trouble Shooting

npm run build 시 에러

ERR_OSSL_EVP_UNSUPPORTED


ERR_OSSL_EVP_UNSUPPORTED

해당 에러는 모듈 중 하나 혹은 일부가 Node 17.x 부터 적용된 OpenSSL 3 버전의 규격에 맞지 않을 경우 발행 할 수 있다.

최하단을 보면 Node.js v18.15.0 으로 자신의 Node 버전을 확인 할 수 있다.

해결 방안

필자가 사용한 방법으로 다음 명령어를 사용하였다

npm audit fix --force

모듈의 버전업으로 문제를 해결하는데 어떤 모듈의 버전인지 확인하기 어렵고 번거롭기 때문이다. 문제된 모듈은 react-scripts 2.0.1 이었으며 업그레이드 후 문제가 해결되었다

  • 업그레이드 불가의 경우
    • 노드 버전의 다운그레이드다. 이전 버전의 노드 버전을 설치후 사용하면 된다.
    • 다음 명령어로 openssl legacy 옵션을 설정하여 사용할 수 있다.
      • react-scripts --openssl-legacy-provider start

출처: https://ongamedev.tistory.com/484

Module not found: Error: Can’t resolve ‘fs’ in ../../../dotenv/lib

dotenv 모듈에서 사용하는 fs 를 못찾는다는데
react 는 기본 dotenv 를 내장하고 있는데 내장 dotenv 를 찾는게 아니라 직접 dotenv 를 끌고오는 코드가 있어서 상단

import dotenv from "dotenv"
dotenv.config()

또는

require('dotenv').config();

삭제해준다

Server Setting


필요 프로그램 설치

git

sudo apt-get install git

node

sudo apt-get install nodejs

npm

sudo apt-get install npm

백그라운드 실행

nohup 사용

pm2 사용

Installing

sudo npm install pm2 -g

Running

pm2 --name HelloWorld start npm --start

Listing running processes

pm2 ps

Stopping

pm2 delete 0

Checking logs

pm2 logs

세팅 결과


서버 세팅 완료


클라이언트와 서버가 연결된 모습

Trouble Shooting

Git clone 시 에러

ec2 는 기존에 사용하던 머신이 아닌 새로운 가상 컴퓨터 이므로 등록을 다시 해줘야한다.

ssh-keygen -b 4096 -C "[github 이름] [github 이메일]"

~/.ssh/id_rsa.pub 의 내용을 붙여 쓴다


다른 방법으로 http 로 clone

git clone https://github.com/cs-devops-bootcamp/sprint-aws.git

입력 시 username 과 password 입력을 요구한다 여기서 password 에 Repository Read Token 을 입력해준다

  • 발급은 깃허브 깃허브 프로필의 셋팅 → developer setting → personal access → 레포 읽기 토큰 발행 → 복사 후 입력
  • username : 깃허브 유저네임

Error: listen EACCES: permission denied 0.0.0.0:80

server code 확인시


포트 번호를 80번으로 사용하는데 실행시키면


Error: listen EACCES: permission denied 0.0.0.0:80 에러가 발생 해당 에러는

1024 이하 포트 번호 즉, well knows port 를 사용하려면 root 권한이 필요하고 node 는 해당 80번 포트에 대한 접근권한이 없다는 의미이다

해결 방안

  • sudo 사용 : 안됨
    • node를 root권한(sudo ...) 으로 실행시키면 당연히 안된다. 프로젝트 내에 노드모듈이 아니라 root의 노드모듈을 가져다 쓰기 때문임.
  • 폴더와 폴더의 하위 모든 파일을 root 로 권한 변경
    • 리눅스에서 기본적으로 1024번 미만의 TCP/IP 포트 번호는 일반 사용자가 사용할수 없다. 기본적으로 ubuntu의 계정으로 git pull을 받았기 때문에 서버 폴더와 해당 폴더의 모든 파일의 소유자가 ubuntu 였다.
  • apache나 nginx 등을 이용해서 80번 포트로 받고 해당 내용을 node.js 쪽으로 전달 해주시면 될 것 같습니다.
  • iptables 를 통한 포트 우회
    • 포트 80을 사용하지 말고 8080과 같은 다른 포트에서 실행하고, 아래 명령으로 80을 해당 포트로 리디렉션 해서 사용하시거나... sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
    • iptables 초기화
      • 모든 chain에 설정된 모든 rule을 제거합니다. iptables -F
      • 기본 chain을 제외한 나머지 모든 chain에 설정된 모든 rule을 제거합니다. iptables -X
    • 기본 조회입니다. 설정 상태를 볼 수 있다 iptables -L- 기본 조회 , iptables -L -v - 상세조회
    • 포트 포워딩 확인 할려면 해당 명령어 사용해서 조회
      • sudo iptables -t nat -L --line-numbers
    • 포트 포워딩 삭제하는 명령어
      • sudo iptalbes -t nat -D PREROUTING [number]
      • ex) sudo iptables -t nat -D PREROUTING 1

RDS






퍼블릭 액세스는 나중에라도 꼭 차단을 하길 바란다.

VPC Peering

VPC Peering이란 서로 다른 VPC간 통신이 가능하도록 연결하는 것을 말합니다. 서비스 구분이나 관리 목적에 따라 VPC 를 구분해 놓았을 때 VPC 간 통신이 필요할 때 사용합니다

목표

여기서는 EC2 - RDS 간의 VPC 를 따로 두고 RDS 의 퍼블릭 액세스를 차단하기 위함입니다

이렇게 하였을 때 RDS 는 연결된 VPC 안 EC2 인스턴스를 통해서만 액세스 가능해지고 다른 VPC 를 가진 서비스에서도 VPC Peering 을 통해 Database 에 접근이 가능할 수 있도록 구성이 가능해 집니다.

특징

  • 다른 계정간 생성 가능
  • 다른 리전간 생성 가능
  • 둘 다 가능

주의점

  • VPC 간의 CIDR 대역이 겹치면 안된다
    • 192.168.10.0/24 대역과 192.168.10.0/16 대역을 갖고 있는 VPC 간에는 Peering 자체가 불가능하다
  • VPC Peering 이후 각 VPC 간 실제 통신을 위해서는 VPC 의 Route Table 에서 별도의 설정 필요
    • Route Table : VPC 의 서브넷들이 어떻게 동신되는지 정의해 놓은 테이블이다

요약

VPC Peering 은 각각 다른 VPC 와 다른 CIDR 대역간의 연결을 위해 사용한다.


VPC A(요청자) - VPC B(수락자) 를 연결하여 통신이 가능하게끔 만듭니다

A 와 B 가 바뀌어도 상관없지만, 수락자의 계정 또는 리전에서 요청을 수락하여야 VPC Peering 이 완료됩니다.

Route Table 설정

VPC Peering 을 생성해 VPC 간 네트워크 연결할 준비는 끝마쳤다.

이제 VPC Peering 을 사용하여 두 VPC 간의 연결을 하기 위해 Route Table 을 설정해줘야 한다.


EC2 인스턴스의 라우팅 테이블의 정보이다

  • 0.0.0.0/0 - igw-0d28... : 인터넷 게이트웨이와 연결되어 인터넷을 사용가능하게 라우팅 된것
  • 172.31.0.0/16 - local : local 연결이다

이제 여기에 대상 VPC 의 CIDR 과 VPC ID 를 연결하고 서브넷 연결 또한 명시해주면 VPC 간의 통신이 이루어진다.

EC2 에서 RDS 로의 데이터 요청이므로 RDS 쪽에만 라우팅해주면 된다.

양방향 통신의 경우 양쪽다 설정해주면 된다.

RDS 는 당연히 보안그룹에서 인바운드 규칙으로 허용해주어야 한다.

결과


profile
욕심 많은 주니어 개발자입니다.

0개의 댓글