(3) EC2 / WEB-WAS-DB 세팅

(3) EC2 / WEB-WAS-DB 세팅

지난장에서 인터넷 통신이 되는 Public 인스턴스를 만들었다.

해당 인스턴스에 Nginx를 설치하여 WEB 서버로 사용하고,

WAS와 DB를 구성하여 연결해보자.

1) WEB EC2 구성

ㅁ nginx 설치 및 구동

sudo apt install nginx

sudo service nginx start

2) WAS용 인스턴스 추가

해당 인스턴스는 실제 로직과 데이터가 담겨있기때문에, Private Subnet에 생성해야한다.

ㅁ 인스턴스 생성

Public과 동일하지만 Subnet 부분과 보안설정은 변경한다

- Subnet : Private

- 보안그룹 : SSH 및 서비스 통신은 WEB서버를 통해서만 받도록 설정

ㅁ NAT 게이트웨이 생성

Private Subnet에 있는 WAS나 DB의 경우

외부에서 접근은 불가능하더라도, 인터넷 사용이 필요한 경우가 있다. ( apt-get , curl 등 )

해당 경우에는 NAT 게이트웨이를 두어, Public subnet 망을 통해서 나갈수 있게 설정해준다.

- 연결유형을 Public으로 두어, 인터넷에 연결 ( Inbound는 차단 )

- EIP (탄력적 IP)를 부여해, 해당 IP로 외부에 통신함.

ㅁ Private 전용 라우팅 테이블 생성 및 연결

Public Subnet의 라우팅 테이블은

10.0.0.0/24 (VPC 내 통신)은 local로 설정되어있어, VPC 내부에서 찾는다.

Private Subnet은 VPC 내부 통신외에, 나가는 요청만 NAT 게이트웨이를 통하므로

라우팅 테이블을 따로 만들어서 할당해야한다.

- local 통신은 동일하게 두고, 인터넷 통신은 public subnet에 있는 NAT 게이트웨이로 통신한다.

※ Private Subnet에 존재하는 EC2는 Public IP가 존재하지 않기때문에, AWS 콘솔 매니저에서 붙을 수 없다.

SSH 접속을 위한 2가지 방법이 있다.

- Key를 사용한 SSH 통신

- AWS Session Manager 설정

Session Manager는 편리하긴 하지만

결국 접속해서 SSM 에이전트 설치 등, 환경설정이 필요하고 IAM 정책도 설정해야한다.

지금은 AWS 서비스 흐름에 대한 이해과정이므로 추후 설정해보자.

ㅁ Key를 통한 EC2 인스턴스 접근

더보기 단계는 아래와 같다. 1. Public Subnet 에 있는 WEB 서버에 Key로 접속하기 2. WEB 서버를 Bastion Host (경유 호스트)로 두어, Public Subnet을 통한 Prviate Subnet 접근 ㅁ Public Subnet 에 있는 WEB 서버에 Key로 접속하기 - 먼저, WEB서버 연결을 위한 Key를 발급받는다 - 인스턴스 생성 시, 해당 Key를 매칭해준다. - PuttyGen을 통해, Public Key를 Private로 변환 - Putty 접속시 해당 Key를 SSH-Auth-authentication에 등록 => timeout 발생. 접속환경에 망이 따로 있다보니, 방화벽에 막힌 것 같다.

ㅁ SSM (Systems Manager)를 통한 Session Manager로 접근

더보기 인스턴스가 재시작될때마다 Public IP를 새로 받기에, 매번 방화벽을 뚫어주기는 힘들다. 그렇다고 EIP를 받아쓰기엔, 비용적인 부담이 있어 Session 매니저를 사용해보려한다. [ 장점 ] 1. 키 페어가 따로 필요없다. 2. Bastion Host (경유서버)가 따로 필요 없다. 3. IAM 롤을 통해, 일부 사용자에게만 접속권한 부여가능 4. 443으로 나가는 포트만 뚫려있으면, 특별한 설정이 필요없고 바로 붙을 수 있다. [ 단계 ] 1. SSM agent 설치 2. 해당 인스턴스의 443 Outbound 추가. ( SSM이 443 통신임 ) - 기본적으로 Outbound에 대해선 막혀있지 않을것임 3. IAM에 session manager 역할 생성 ( AmazonEC2RoleforSSM ) 4. 인스턴스에 해당 역할 매핑 - WEB ( Public Subnet ) - WAS ( Private Subnet ) 인바운드 정책없이 연결 및 Outbound 인터넷 통신 확인

ㅁ WAS 인스턴스 환경 구성

- 파이썬 및 Flask 설치

※ Flask : Rest api 구성을 위한 Micro web framework

sudo apt-get update

sudo apt install python3

sudo apt-get install python3-pip

sudo pip3 install Flask

-python 파일 작성 후 구동 테스트

rest.py

더보기 from flask import Flask

from flask_restx import Api, Resource

app = Flask(__name__)

api = Api(app)

@api.route('/api/users') # /api/user 에 클래스 매핑

class HelloWorld(Resource):

def get(self):

return {"id": 123,

"name": "kim"}

if __name__ == "__main__":

app.run(debug=True, host='0.0.0.0', port=82)

- 에러 발생

restx 모듈을 못찾았다.

해당 모듈 설치 후 재실행

sudo pip3 install flask_restx

- 구동완료

3) DB용 인스턴스 구성

ㅁ PostgreSQL 설치

sudo apt-get update

sudo apt install postgresql

ㅁ DB 접근제어 허용

PostgreSQL는 기본적으로 접근허용이 막혀있다.

Listen Address에 *를 넣어 접근가능하게 변경해주자 ( 재시작 필요 )

sudo vi /etc/postgresql/12/main/postgresql.conf

sudo vi /etc/postgresql/12/main/pg_hba.conf

ㅁ 데이터 베이스 생성

- DBMS 접속

sudo su postgres

psql

CREATE DATABASE "USER"; // USER 데이터베이스 생성

- USER 생성 및 권한부여

CREATE USER test WITH PASSWORD 'a123456789';

ALTER USER test WITH SUPERUSER;

ALTER USER test WITH LOGIN;

- 해당 유저로 접속 및 Sample 데이터 생성

psql -U test -d USER // test유저로 USER 데이터베이스 접근

CREATE table user_info( id int NOT NULL, name char(20) DEFAULT NULL, PRIMARY KEY (id) );

INSERT INTO user_info VALUES(1234,'kim');

INSERT INTO user_info VALUES(123,'Lee');

commit;

※ psql: error: FATAL: Peer authentication failed for user "test" 에러 발생

더보기 검색해보니 local 통신 방식에서 perr를 md5로 바꿔주라고 함 sudo vi /etc/postgresql/12/main/pg_hba.conf 검색해보니 local 통신 방식에서 perr를 md5로 바꿔주라고 함 sudo vi /etc/postgresql/12/main/pg_hba.conf

from http://st-it.tistory.com/44 by ccl(A) rewrite - 2021-11-05 18:00:29