on
(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