AWS - Flask / MySQL / react 배포

2023. 11. 24. 00:01·💻 개발 일지/AWS
목표
- 온프레미스 및 클라우드 환경에서 서비스 인프라를 (자동) 구성
- 어플리케이션 코드를 자동으로 배포, 실행하는 환경을 구성

참고
backend - flask : https://github.com/Kwak-Minju/FIRSTSTEP_BE_AWS.git
front - react : https://github.com/Kwak-Minju/FIRSTSTEP_FE_AWS.git

#1 VPC 생성

VPC 구성 - Public Subnet 2개와 Private Subnet 2개를 생성

 

 

#2 RDS 생성

myRds - MySQL

user : admin pw : Password

퍼블릭 액세스 - 아니요

vpc 내부에서만 접속할 수 있도록 하기 위해

 

#2-1 BastionHost 인스턴스 생성

- BastionHost

   Bastion 요새 라는 뜻으로 보안을 위해 고안된 호스트

  외부와 내부 네트워크 사이에서 게이트 역할

 

#2-2 BastionHost 인스턴스와 RDS 연결

 개발자가 workbench로 접속하여 db를 설정하고 관리하기 위해

 

#2-3 workbench를 통해 생성한 RDS 연결 후 스키마 생성

create database firststep;

use firststep;

CREATE TABLE `user` (
    `userId` int unsigned AUTO_INCREMENT NOT NULL ,
    `name` varchar(20)  NOT NULL ,
    `ID` varchar(16)  NOT NULL ,
    `password` varchar(300)  NOT NULL ,
    `phoneNumber` varchar(30)  NOT NULL ,
    `status` varchar(10) default 'active' NOT NULL ,
    `createAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    `updateAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    PRIMARY KEY (
        `userId`
    )
);

CREATE TABLE `board` (
    `boardId` int unsigned AUTO_INCREMENT NOT NULL ,
    `userId` int unsigned  NOT NULL ,
    `title` varchar(30)  NOT NULL ,
    `content` varchar(1000)  NOT NULL ,
    `location` varchar(20)  NOT NULL ,
    `status` varchar(10) default 'active' NOT NULL ,
    `createAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    `updateAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    PRIMARY KEY (
        `boardId`
    )
);

CREATE TABLE `comment` (
    `commentId` int unsigned AUTO_INCREMENT NOT NULL ,
    `userId` int unsigned  NOT NULL ,
    `boardId` int unsigned  NOT NULL ,
    `content` varchar(1000)  NOT NULL ,
    `status` varchar(10) default 'active' NOT NULL ,
    `createAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    `updateAt` timestamp default CURRENT_TIMESTAMP NOT NULL ,
    PRIMARY KEY (
        `commentId`
    )
);

CREATE TABLE `rent` (
		`rentId` int unsigned AUTO_INCREMENT NOT NULL,
		`boardId` int unsigned  NOT NULL ,
		`userId` int unsigned,
		`rent` varchar(10) default 'active' NOT NULL ,
		`rentAt` datetime,
		`returnAt` datetime, 
		PRIMARY KEY (
				`rentId`
		)
);

ALTER TABLE `board` ADD CONSTRAINT `fk_board_userId` FOREIGN KEY(`userId`)
REFERENCES `user` (`userId`);

ALTER TABLE `comment` ADD CONSTRAINT `fk_comment_userId` FOREIGN KEY(`userId`)
REFERENCES `user` (`userId`);

ALTER TABLE `comment` ADD CONSTRAINT `fk_comment_board_id` FOREIGN KEY(`boardId`)
REFERENCES `board` (`boardId`);

ALTER TABLE `rent` ADD CONSTRAINT `fk_rent_boardId` FOREIGN KEY(`boardId`)
REFERENCES `board` (`boardId`);

ALTER TABLE `rent` ADD CONSTRAINT `fk_rent_userId` FOREIGN KEY(`userId`)
REFERENCES `user` (`userId`);

 

#3 Flask 인스턴스 생성

포트범위 : EC2에서 5000 포트로 들어오는 요청을 받을 수 있게 설정

 

#3-1 RDS와 FlaskServer 인스턴스 연결

 

app.py 수정

def getCon():
  return pymysql.connect(host="<RDS 엔드포인트>", 
                     user="admin", password="Password", 
                     db="firststep",
                     charset="utf8",
                     port=3306,
                     cursorclass=pymysql.cursors.DictCursor)
...

if __name__ == "__main__" :
    app.run(host="0.0.0.0", debug=False)

user와 password 는 RDS 생성 시 설정한 정보로 입력

 

#3-2 Bitvise SSH Client 사용하여 flaskServer 인스턴스에 접속

sudo apt-get install python3

git clone <github url>

ubuntu@ip-10-0-10-203:~$ ls
FIRSTSTEP_BE_AWS

ubuntu@ip-10-0-10-203:~$ cd FIRSTSTEP_BE_AWS/

pip install flask

pip install -r requirements.txt

ubuntu@ip-10-0-10-203:~/FIRSTSTEP_BE_AWS$ flask run --host=0.0.0.0
 * Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on all addresses (0.0.0.0)
 * Running on http://127.0.0.1:5000
 * Running on http://10.0.10.203:5000
Press CTRL+C to quit

=> --host=0.0.0.0 : 옵션을 주지 않으면 인스턴스 로컬에 실행이되어 접근할 수 없어 외부로 실행되어야 함

 

**error

E: Unable to locate package python3-pip

 

- 해결 방법

sudo add-apt-repository universe 
sudo apt-get update 
sudo apt-get install python3-pip

 

#3-3 브라우저에서 접속

 

Not Found => 서버가 실행 중인 것

인스턴스 생성 시 인바운드 규칙에 5000 추가했기 때문에 연결 가능(인스턴스 생성 시 빼먹었다면 보안그룹에 가서 포트 열어주기!)

 

- postman을 통해 RDS와 연결 확인

 

 

#4 React

#4-1 S3 버킷 생성

firststep

 

#4-2 react 어플리케이션 코드 수정

flaskServer로 연결하는 axios url 을 flaskServer 퍼블릭주소:5000으로 변경

axios.get(`${process.env.REACT_APP_SERVER_URL}/board/detail/${boardId}/${sessionStorage.getItem('token')}`)
        .then(res => {
            console.log(res)
            
...

### .env ###
REACT_APP_SERVER_URL = http://52.78.120.29:5000 <= flask 퍼블릭주소

 

#4-3 react 어플리케이션을 빌드

User@DESKTOP-UDC737O MINGW64 /c/FirstStep_project/FIRSTSTEP_FE_AWS (main)
$ npm run build

> client@0.1.0 build
> react-scripts build

Creating an optimized production build...

...

 

#4-4 build 한 react app 파일을 S3버킷에 업로드

 

#4-4 브라우저에서 버킷 웹 사이트 엔드포인트로 접속

 

수정중

**error

728x90
'💻 개발 일지/AWS' 카테고리의 다른 글
  • AWS - GitHub Actions_ react
  • AWS - CodeDeploy / GitHub Actions _ Flask
  • AWS - EKS
  • Terraform - 선언 블록
_민주
_민주
🌍여행을 좋아하는 개발자🌍
  • _민주
    _민주
    🌍여행을 좋아하는 개발자🌍
    • 전체 글 (49)
      • 💻 개발 일지 (43)
        • JavaScript (6)
        • Python (1)
        • Git (1)
        • RDBMS (1)
        • Linux (0)
        • Next (2)
        • K8s (3)
        • React (13)
        • AWS (16)
      • 🧩 기억의 조각 (4)
        • 일상 그리고 운동 (4)
        • ✈️ 여행 (0)
  • 태그

    js
    googleprovider
    terraform
    next-auth
    운동
    app-router
    flask
    AWS
    next14
    axios
    EC2
    결혼식
    김나영콘서트
    s3
    github actions
    React
    mysql
    로그인
    approuter
    javascript
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
_민주
AWS - Flask / MySQL / react 배포
상단으로

티스토리툴바