공부/DevOps

[NHN Cloud] 기본적인 웹 서버, DB 인프라 구축 (vpc, subnet, floating ip, ..)

leejinwoo1126 2024. 8. 30. 11:02
반응형

 

기본 인프라 구성도

nhn cloud 사용하여 아래와 같은 기본 인프라 구성해본다

 

 

참고로

- ssh(22)로 web 서버 접근시 floating ip 주소로 서버 접속한다 (10.*.*.* : 사설 ip로는 외부에서 접근 x)

- private subnet에 있는 MySQL 서버는 외부에서 접근 불가하고, public subnet 통해서 접속/접근 가능하다

 

 


1. VPC(Virtual Private Cloud) , Internet Gateway

- 클라우드 컴퓨팅 환경에서 사용자가 정의한 가상 사설 네트워크
- RFC 1918 기재되어 있는 범위로 사설 네트워크를 생성할 수 있다

- 10.*.*.* / 172.*.*.* / 192.*.*.*  주소가 해당

 

[VPC 생성] 버튼 눌러서 10.0.0.0/16 으로 "vpc-edu"를 생성한다  ( 네트워크 : 2^16개, 네트워크 별 호스트 : 2^16 - 2개 )

 

 

VPC가 생성되면 Router 생성되고 연결된다. 현 상태에서는 vpc로 외부 접근을 할 수 없는 상태이다.

외부 접근(인터넷) 접근을 하기 위해서는 먼저 Internet Gateway를 생성하고 Router에 등록 해줘야 한다 

 

[Network > Internet Gateway] 메뉴 이동해서 인터넷 게이트웨이를 생성한다

 

다시 Routing 메뉴로 돌아와 라우터를 선택 후 [인터넷 게이트웨이 연결] 버튼을 눌러서 연결한다

 

 

정상적으로 등록되면 라우터에 아래와 같이 인터넷 게이트웨이가 추가된 것을 확인할 수 있다

 


2. Subnet 생성

가상 사설 네트워크(VPC)에 서브넷을 생성하여 구역을 나누도록 한다. 

서브넷을 나누는 이유는 한정된 ip 자원을 효율적으로 나누어 사용하고 관리하기 위해서이다

 

[Network > Subnet] 메뉴를 이동하여 아래 두 개의 서브넷을 생성한다

① public subnet : 10.0.1.0/24

② private subnet : 10.0.2.0/24


두 서브넷 모두 네트워크 아이디가 2^24 개 이고, 각 네트워크별 호스트는 (2^8 - 2)개 ip 할당하여 사용가능하다

 


public subnet(
10.0.1.0/24)은 Web서버 인스턴스가 위치하게 된다.

- 외부 접속 가능, 단 floating ip 할당하고 보안 그룹 설정을 통해 허용된 ip만 접근 가능하도록 할 예정(ssh, http 등)

 

private subnet(10.0.2.0/24)MySQL 인스턴스가 위치하게 된다.

- 외부 접속 불가, public subnet(10.0.2.0/24) 통해서 접근할 수 있도록 할 예정

 

 

3. 인스턴스 생성 

3-1. web 서버 인스턴스 생성

[Compute > Instance] 메뉴로 이동하여 생성 버튼을 누른다

- os는 ubuntu로 했고, 인스턴스 타입은 m2.c2m4 (2vCPU, 4 GB RAM) 선택 

- 키 페어의 경우 앞서 만들어둔 helloCloud.pem 선택

- 네트워크 : public subnet 지정

- 플로팅 IP : 인터넷을 통해 외부 접근 허용할 것이기 때문에 floating ip 생성

- 보안 그룹  보안 그룹을 개별 관리하기 위해 "web-sg"로 신규 생성

 

 

public subnet에 인스턴스가 위치하도록 한다

 

security-group은 "web-sg" 생성해서 관리해주도록한다

 

외부 접속하기 위해 floating IP를 생성한다


[Compute > Instance] 메뉴에서 인스턴스 선택 후 아래 "플로팅 IP 관리" 버튼을 눌러 생성도 가능하다 
생성된 floating ip 주소 (ex 133.186.209.52) 통해서 외부에서 서버 접속할 수 있다

 

 

 

 

3-2. MySQL 인스턴스 생성

[Database > MySQL instance] 메뉴로 이동해서 생성 버튼을 누른다. 

- os는 ubuntu에 MySQL 8.0으로 했고, 인스턴스 타입은 m2.c2m4 (2vCPU, 4 GB RAM) 선택 

- 키 페어 생성하게 되면 *.pem 자동으로 다운로드 된다 (*서버 접속시 사용되므로 잘 보관한다)

- 네트워크 : private subnet 지정

- 플로팅 IP : 외부 접근 허용하지 않으므로 생략

- 보안 그룹 : 보안 그룹을 개별 관리하기 위해 "db-sg"로 신규 생성

 

 

 

4. 보안 그룹 (Security Group) 설정

외부의 허용되지 않은 접근을 차단하고 관리하기 위해 보안 그룹을 사용한다

서버 작업을 해봤다면 iptables, ufw, firewall 등을 관리하는 메뉴라 생각하면 이해가 쉬울 것이다

 

 

[Network > Security Groups] 메뉴 이동하여 생성한 "web-sg""db-sg"에 보안 규칙을 설정한다

 

4-1. "web-sg"에는 ssh 접속 위한 22번 tcp 포트 규칙을 추가한다. (*http 포트 80은 필요시 추가)

 

4-2. "db-sg"에는 public subnet에서 오는 트래픽을 허용하기 위해 mysql 3306 tcp port 와 ssh 22 tcp port 규칙을 추가한다

즉 web 서버(public subnet)를 통해서만 MySQL 서버(private subnet)에 접근할 수 있다

 

 

 

5. web 서버 접속

- *.pem 키와 floating ip 주소 (ex. 133.186.247.46) 사용해서 ssh 접속한다 

- 당연히 web서버 보안 그룹에 ssh 22번 tcp port 접근 허용이 필요하다

 

 

내 컴퓨터에서 web 서버 접근 가능한지 telnet을 통해 먼저 확인가능하다

$ telnet <아이피 주소> 22

 

로컬에서 키 관리를 위해 ~/.ssh 디렉토리에 이동 시킨 후 ssh 명령어로 web 서버 접속한다

$ ssh -i ~/.ssh/helloCloud.pem ubuntu@<웹서버 public ip>

 

 

web 서버에서 MySQL 서버로 접속하기 위해서는 helloCloud.pem 필요하다. 하지만.. web 서버에는 키가 없다

scp 명령어 사용하여 로컬에 *.pem 키를 업로드하고, MySQL 서버로 접속한다 

$ scp -i ~/.ssh/helloCloud.pem ./helloCloud.pem ubuntu@133.186.247.46:~/.ssh/
$ ssh -i ~/.ssh/helloCloud.pem ubuntu@133.186.247.46

# web 서버 -> MySQL 서버 접속 
$ ssh -i ~/.ssh/helloCloud.pem ubuntu@<mysql 서버 private ip>

 

 

참고. jre 설치, JAVA_HOME 설정

친절하게 자바 버전 설치 방법을 알려준다

# 1. jre 설치       
$ sudo apt install -y openjdk-17-jre-headless 
$ ubuntu@edu-web:/home$ update-alternatives --config java
There is only one alternative in link group java (providing /usr/bin/java): /usr/lib/jvm/java-17-openjdk-amd64/bin/java
Nothing to configure.

# 2. JAVA_HOME 설정
$ vim ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

$ source ~/.bashrc
$ echo $JAVA_HOME
/usr/lib/jvm/java-17-openjdk-amd64

 

 

6. MySQL 서버 접속, 설정

- MySQL 서버는 floating ip를 할당하지 않았기 때문에 외부와 격리된 상태이다 (private subnet)

- 보안 그룹을 통해 설정한 web서버(public subnet)를/을 통해서만 접근가능하다

 

 

참고. NHN Cloud MySQL 설치 가이드 

https://docs.nhncloud.com/ko/Compute/Instance/ko/component-guide/#mysql-instance

 

설치 구성 요소 가이드 - NHN Cloud 사용자 가이드

Compute > Instance > 설치 구성 요소 가이드 NAT Instance NAT 인스턴스는 프라이빗 네트워크 인스턴스에서 특정 IP 주소 대역에 대해 인터넷에 액세스할 수 있게 하는 인스턴스입니다. 한국(판교), 한국(

docs.nhncloud.com

 

 

우선 root 비밀번호를 변경해준다 (*초기 비밀번호는 없다)

$ mysql -uroot -p    
비밀번호 입력 :       // 비밀번호 없으니 엔터 누른다

$ status;

개인적으로 characterset은 특별히 설정할 필요가 없어 보인다

 

 

'신규비밀번호' 부분만 고쳐서 root 비밀번호를 갱신한다

mysql> use mysql;
mysql> ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '신규비밀번호';
mysql> flush privileges;  // 저장

 

 

임의로 board 스키마 생성한다

mysql> create database board default character set utf8mb4;

 

web 서버(10.0.1.5)에서 MySQL 접속, 요청하기 위한 계정과 권한을 생성한다 (*중요)

mysql> CREATE USER 'tester'@'10.0.1.%' IDENTIFIED BY '비밀번호';
mysql> GRANT ALL PRIVILEGES ON board.* TO 'tester'@'10.0.1.%';

mysql> CREATE USER 'tester'@'localhost' IDENTIFIED BY '비밀번호';
mysql> GRANT ALL PRIVILEGES ON board.* TO 'tester'@'localhost';
mysql> FLUSH PRIVILEGES;

- % :  anywhere, 10.0.2.0/24 서브넷의 어느 ip 주소든지

- localhost : MySQL 서버용, 관리자만 root 계정을 사용하지 보통은 스키마별 계정, 권한 할당하여 관리한다

- 내컴퓨터에서 접속하고 싶은 경우 로컬 아이피 주소 확인해서 계정과 권한 생성하면 된다

 


Reference. NHN Cloud 7분 클라우드

https://www.youtube.com/watch?v=5lOwfdlNrYw&list=PL42XJKPNDepZT626V00gWBs00oHwk9PmY

 


 

이번에 성능/부하 테스트를 공부해보면서 호스트 컴퓨터에서 다 돌리려니 부담이 되었다. 

그래서 nhn cloud 무료 credit 받은 김에 기본 인프라를 구성해보고 이를 기록으로 남겨보았다

 

인스턴스 생성이나 보안 그룹은 해봤던 거라서 금방 쉽게 할 수 있었다.

하지만 vpc , subnet, routing, Internet gateway, floating ip 설정은 처음이었는데,

"nhn cloud 유튜브 채널의 7분 클라우드 영상" 덕분에 쉽게 인프라를 구축할 수 있었다

 

근데.. 

클라우드 서버에서 stress test를 했는데 다음달 비용이 얼마나 나올지가 걱정이다. (하하하..)

 

이렇게 또 하나 경험하고 배워간다

반응형