기본 인프라 구성도
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
우선 root 비밀번호를 변경해준다 (*초기 비밀번호는 없다)
$ mysql -uroot -p
비밀번호 입력 : // 비밀번호 없으니 엔터 누른다
$ status;
'신규비밀번호' 부분만 고쳐서 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를 했는데 다음달 비용이 얼마나 나올지가 걱정이다. (하하하..)
이렇게 또 하나 경험하고 배워간다
'공부 > DevOps' 카테고리의 다른 글
[AWS] VPC, Subnet, EC2 개발 인프라 구성 (선착순 쿠폰 발급 시스템) (0) | 2024.09.20 |
---|---|
[NHN Cloud] 컨테이너 기반 Prometheus, Grafana 모니터링 환경 구성(by 오픈 소스 툴) (0) | 2024.09.02 |
Jenkins 빌드 배포시 Slack 알림 설정 (5) (0) | 2023.07.16 |
[Ubuntu] /bin/bash로 기본 shell 변경하기 (0) | 2023.07.15 |
[Docker] Jenkins Build, Deploy, Execute Shell / 자동배포 환경 테스트 (4) (0) | 2023.07.15 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!