이번 프로젝트에서 VPC 를 학습해 서버를 구축하는 요구 사항이 있어서, 인프라를 구축하는 과정에 대해 기록하려고 한다.
기록 시작 !
목표 인프라 구상도
1. VPC (CIDR - 10.0.0.0/16)
2. Public 서브넷 (CIDR - 10.0.1.0/24)
- EC2 (NAT)
- EC2 (Bastion)
- EC2 (Web Server / Nginx)
- EC2 (WAS / Spring Boot)
- EC2 (DB / MySQL)
3. Private 서브넷 (CIDR - 10.0.2.0/24)
4. Private 서브넷 (CIDR - 10.0.3.0/24)
5. 인터넷 게이트웨이
6. 라우팅 테이블
- Public 서브넷과 연결할 RT (인터넷 게이트웨이를 연결해서 인터넷 연결 0.0.0.0/0 허용)
- Private 서브넷과 연결할 RT (NAT 인스턴스와 연결해 WAS 서버에서 나오는 요청을 처리)
- Private 서브넷과 연결할 RT (NAT 인스턴스와 연결해 DB 서버에서 나오는 요청을 처리)
7. Git Action 을 사용한 자동배포
인프라 구상도에 맞춰 VPC, 서브넷 등 생성
1. VPC 생성
가장 먼저 VPC 를 생성해야 한다.
VPC 이름 적고, CIDR 을 정의하는데, 간단하기 10.0.0.0/16 으로 설정한다.
다른 태그는 몰라도 Name 태그는 잊지말고 꼭 작성하자. 태그가 없다면 나중에 뭐가 뭔지 구분할 수 없다.
2. 서브넷 생성
VPC 를 생성했다면, Public 서브넷 1개, Private 서브넷 2개를 생성해주자.
현재 구상도에서는, Public 서브넷에 NAT, Bastion, WEB Server 3개의 EC2 인스턴스가 위치한다.
그리고 Private 서브넷에 WAS, MySQL 2개의 EC2 인스턴스가 위치한다.
주의할 점은, 서브넷의 CIDR은 VPC CIDR 의 부분집합 형태로 CIDR 을 지정해줘야 한다. (어짜피 범위 안맞으면 생성조차 안됨 😫)
3. 인터넷 게이트웨이 생성
서브넷을 생성했지만 인터넷과 통신하기 위해서는, 인터넷 게이트를 생성하고 VPC 에 연결해줘야 한다.
이름과 태그만으로 간단하게 생성할 수 있다.
인터넷 게이트웨이가 생성되면, VPC 연결이라는 배너가 뜨는데, 바로 연결해주는 것이 좋다. (실수 방지)
4. 라우팅 테이블 생성
라우팅 테이블은 서브넷이 라우터를 통해 보내는 네트워크 트래픽이 전달되는 위치를 제어하는 역할을 한다.
구상도의 서브넷은 총 3개니까 라우팅 테이블을 3개 만들어주자.
서브넷에 연결해주는거라 연결할 서브넷의 가용 영역을 이름, 태그에 적어주는 것이 좋다. (가독성 UP)
내 구상도의 Private 서브넷에는 EC2 인스턴스가 하나 씩 위치하기 때문에, 관련 인스턴스 이름도 같이 이름, 태그에 적어줬다.
5. 보안그룹 생성
EC2 인스턴스를 생성하기 전에, 각 인스턴스에서 사용할 보안그룹을 미리 생성하자.
나중에 EC2 인스턴스 생성 시 보안그룹 자체를 허용하는게 되기 때문에 미리 생성하면 편하다 ㅎ_ㅎ
가) WEB Server 보안그룹 생성
유저 접속을 허용하지 위해 모든 IP에 대해 HTTP(80), HTTPS(443) 포트를 개방한다.
나) Bastion 보안그룹 생성
관리자 (개발자) 의 접속을 허용하기 위해 모든 IP에 대해 ssh(22) 포트를 개방한다.
원래 내 IP 접속만 22 포트가 개방되어야 하지만, 맥북을 여러군데 옮기면서 개발을 하기 때문에 편의상 모든 IP에 대해 개방했다.
다) WAS 보안그룹 생성
WAS 에는 관리자 (개발자), 유저, DB 접근을 허용해야 한다.
관리자는 Bastion 을 통해 접근하기 때문에 Bastion 보안그룹에 대해 8080 포트를 개방,
유저는 Web Server 를 통해 접근하기 때문에 Web Server 보안그룹에 대해 8080 포트를 개방,
DB 와의 통신도 필요하기 때문에 DB Server 보안그룹에 대해 8080 포트를 개방하면 된다.
이렇게 하는게 위에서 언급한 보안그룹 자체를 허용하는 방법이다 😀
라) DB 보안그룹 생성
DB 는 관리자 (개발자), WAS (Spring Boot) 접근을 허용해야 한다.
관리자는 Bastion 을 통해 접근하기 때문에 Bastion 보안그룹에 대해 DB (3306) 포트를 개방,
WAS (Spring Boot) 와의 통신도 필요하기 때문에 WAS 보안그룹에 대해 DB (3306) 포트를 개방하면 된다.
마) NAT 게이트웨이 보안 그룹 생성
Private 서브넷의 EC2 인스턴스들은 인터넷 게이트웨이를 직접 거쳐서 인터넷과 통신하는게 아닌, NAT 를 통해 인터넷과 통신해야 한다.
구상도를 보면, WAS 와 DB 를 가진 EC2 인스턴스가 NAT 를 거치기 때문에, 인바운드 규칙으로 포트를 열어주자.
즉, WAS, DB 보안그룹을 개방하고 통신 유무를 확인할 수 있도록 ICMP 또한 포트를 개방해주면 된다.
(ICMP 는 통신 유무 확인을 위해 사용할 수 있는 프로토콜로, ping 명령어를 사용해서 통신 유무를 확인할 수 있다)
6. EC2 인스턴스 생성
가. WEB Server (Nginx)
VPC 는 위에서 생성한 VPC 로 선택, 해당 인스턴스는 Public 서브넷에 위치, Public 이기 때문에 IP 자동 할당 활성화로 설정한다.
용도, 가용 영역을 적어준 Name 태그를 추가 ~
미리 설정한 Web Server 보안그룹으로 설정하고 키페어 등 나머지 설정은 생략한다.
나. NAT Gateway
NAT Gateway 는 일반적으로 EC2 인스턴스를 생성하는 방법과는 조금 다르게 생성한다.
먼저 NAT 를 검색창에 작성하고 커뮤니티 AMI 결과를 클릭한다. 다른 사람들이 만들어둔 NAT Gateway 를 사용하는 것.
원하는 플랫폼을 선택한다.
이후 설정은 똑같다.
VPC 는 위에서 생성한 VPC 로 선택, 해당 인스턴스는 Public 서브넷에 위치, Public 이기 때문에 IP 자동 할당 활성화로 설정한다.
용도, 가용 영역을 적어준 Name 태그를 추가 ~
미리 설정한 NAT Gateway 보안그룹으로 설정하고 키페어 등 나머지 설정은 생략한다.
NAT Gateway 생성 후 마지막으로 네트워킹 -> 소스/대상 확인 변경에서 중지 체크박스를 클릭해줘야 한다.
다. Bastion
VPC 는 위에서 생성한 VPC 로 선택, 해당 인스턴스는 Public 서브넷에 위치, Public 이기 때문에 IP 자동 할당 활성화로 설정한다.
용도, 가용 영역을 적어준 Name 태그를 추가 ~
미리 설정한 Bastion 보안그룹으로 설정하고 키페어 등 나머지 설정은 생략한다.
라. WAS Server
VPC 는 위에서 생성한 VPC 로 선택, 해당 인스턴스는 Private 서브넷에 위치, Private 이기 때문에 IP 자동 할당 비활성화로 설정한다.
용도, 가용 영역을 적어준 Name 태그를 추가 ~
미리 설정한 WAS Server 보안그룹으로 설정하고 키페어 등 나머지 설정은 생략한다.
마. DB Server
VPC 는 위에서 생성한 VPC 로 선택, 해당 인스턴스는 Private 서브넷에 위치, Private 이기 때문에 IP 자동 할당 비활성화로 설정한다.
용도, 가용 영역을 적어준 Name 태그를 추가 ~
미리 설정한 DB Server 보안그룹으로 설정하고 키페어 등 나머지 설정은 생략한다.
7. 서브넷과 라우팅 테이블 연결
여기까지 잘 진행했다면, 5 개의 EC2 인스턴스가 잘 생성된 것을 확인할 수 있다.
서브넷은 라우팅 테이블이 있어야 인터넷과 통신할 수 있는데, 아직 서브넷에 라우팅 테이블이 연결되어 있지 않기 때문에,
EC2 인스턴스로 접속할 수는 없다.
따라서 라우팅 테이블을 알맞은 서브넷과 연결시켜주자.
Public 서브넷은 Public 라우팅 테이블과, Private 서브넷 2개는 WAS, DB 라우팅 테이블과 연결해주면 된다.
8. 라우팅 테이블 편집
서브넷과 라우팅 테이블을 연결했다면, 마지막으로 라우팅 테이블을 편집하면 설정은 모두 끝난다 !
Public 라우팅 테이블은 모든 IP 에 대해 위에서 만들어준 인터넷 게이트웨이로 통신을 가능하게 설정한다.
Private 라우팅 테이블은 인터넷 게이트웨이를 통해 연결하는게 아닌, NAT 게이트웨이를 라우팅 규칙에 추가한다.
현재 Private 서브넷이 2개므로, 2개의 라우팅 테이블 모두 만들어둔걸로 잘 설정하면 된다.
9. Bastion 인스턴스를 통해 Private 인스턴스에 접속하기
Public IP 가 없는 Private 인스턴스는 Bastion 인스턴스를 통해 접속해야 한다.
여기에는 Bastion 인스턴스에 Private Key 를 옮기는 방법 등 여러가지 방법이 있는데, 만약 이런식으로 Private Key 를 옮겨버리면
보안상 매우 취약하고 Bastion 인스턴스의 존재 의의가 사라지게 된다.
따라서 ssh-agent 를 사용해 Private Key 를 등록하고 사용하는 방법을 알아보자.
가) ssh-agent 에 Private Key 등록
먼저, ssh-agent 에 Private Key 를 알려줘야 한다.
OpenSSH 에는 ssh-agent 라는 authentication agent가 있어서 암호를 갖고있는 private key를 메모리에 캐싱한다. 따라서
세션 (Private Key 유효시간) 이 유지되는 동안, ssh -i "tany-ec2.pem" ubuntu@10.0.11.242 이런 식으로 접속하지 않아도 된다.
(암호가 필요 없어진다는 뜻)
ssh-add [private key의 경로]
예시
ssh-add ~/.ssh/tany-ec2.pem
등록 성공 시, 출력되는 결과물 (명령어 아님)
Identity added: tany-ec2.pem (tany-ec2.pem)
나) Private Key 유효시간 설정
키의 유효시간 기본 단위는 기본적으로 s(초) 이며, m, h, d, w 로 설정할 수도 있다.
ssh-add -t [유효기간][private key의 경로]
예시
ssh-add -t 7d ~/.ssh/gitaction.pem
등록 성공 시, 출력되는 결과물 (명령어 아님)
Identity added: tany-ec2.pem (tany-ec2.pem)
Lifetime set to 604800 seconds
다) 캐싱된 Key 확인하기
ssh-add -l
캐싱된 키 결과물 (명령어 아님)
2048 SHA256:pSVRQuq6dH8JqPBkpcfj+8OWo6uafxDDDhqZ7kSMT5k tany-ec2.pem (RSA)
라) 캐싱된 Key 삭제하기
ssh-add -D
마) Bastion 인스턴스에 Private Key 가져가기
일련의 과정들로 ssh-agent 에 Private Key를 등록했다면 Bastion 인스턴스에 접속할 때 키 정보를 같이 가져갈 수 있다.
ssh -A -i [private key경로] [user]@[Bastion_instance_ip]
예시
ssh -A -i ~/.ssh/tany-ec2.pem ubuntu@13.125.68.33
Bastion 인스턴스에 접속이 됐고, 드디어 Private 인스턴스에 접속할 수 있게 되었다.
바) Private 인스턴스에 접속
위에서 언급했듯 이제 암호 역할을 하는 pem 파일이 접속 때 필요가 없어졌다.
ssh [user]@[프라이빗 인스턴스ip]
예시
ssh ubuntu@10.0.11.242
잘 보면, Public 서브넷의 Bastion 인스턴스 내부에서 위 명령어를 사용해 Private 인스턴스로 잘 접속된 것을 확인할 수 있다.
10. Public 서브넷에 위치한 EC2 인스턴스 접속
ssh 22 번 포트를 개방한 EC2 인스턴스의 접속만 확인하면 된다.
NAT 게이트웨이는 Ping Test 를 해보자.
가) Bastion 접속 테스트
나) NAT Gateway Ping 테스트
보류
지금까지 AWS VPC, 서브넷, 인터넷 게이트웨이, 라우팅 테이블 등을 활용해 AWS 인프라를 구성하는 방법에 대해 공부하고 정리해봤다.
4시간 정도 걸려서 작성했는데, 틈틈히 와서 복습해야겠다 ... (아직 어려움 😫)
'VPC' 카테고리의 다른 글
[AWS] 실습으로 배우는 AWS 핵심 서비스 VPC 정리 (0) | 2022.05.29 |
---|