Home AWS를 사용해 무중단 배포 자동화 환경 구축하기 - 3. VPC와 기본 리소스 생성하기
Post
Cancel

AWS를 사용해 무중단 배포 자동화 환경 구축하기 - 3. VPC와 기본 리소스 생성하기

AWS를 사용해 무중단 배포 자동화 환경 구축하기 시리즈

  1. 개요
  2. VPC와 기본 리소스
  3. VPC와 기본 리소스 생성하기
  4. 어플리케이션 구축 및 로드밸런서 적용
  5. AWS 리소스 세팅
  6. CodeDeploy 연동 / 마무리

VPC와 기본 리소스 생성하기

AWS 콘솔을 사용해 직접 VPC와 필요한 리소스들을 생성해 보겠습니다.

VPC 생성하기

첫번째로 VPC를 생성해보도록 하겠습니다.

일단 AWS 콘솔에 접속한 후에, 검색창에 VPC를 검색해 VPC 대시보드로 들어갑니다. vpc-1

그 후 오른쪽 상단의 VPC 생성을 눌러 VPC 생성 화면으로 이동합니다. 앞 포스팅에서 말씀드렸듯이 CIDR 블록에는 사설망 대역을 사용하는게 일반적인데요, 저는 3가지중 192.168.0.0/16 을 사용하겠습니다. IPv6 CIDR 블록도 사용할 수 있지만 여기서는 IPv4 CIDR 블록에만 초점을 맞추도록 하겠습니다. vpc-2

VPC 가 생성 되었습니다. vpc-3

여기까지의 구성도입니다. vpc-4

서브넷 생성하기

AWS 콘솔 검색창에 서브넷을 검색하여 서브넷 대시보드로 들어갑니다. 그 후 오른쪽 상단의 서브넷 생성을 눌러 서브넷 생성 화면으로 이동합니다.

먼저 방금전 만든 VPC를 선택해줍니다. 서브넷은 총 4개를 만들어야 합니다. 가용존 ap-northeast-2a, ap-northeast-2c 에 각각 서브넷 2개씩 만들어 줍니다. 가용존 하나에 만들어도 되지만 장애 대응 측면에서 가용존을 나누어 만들도록 하겠습니다. (물론 더 많은 가용존에 만들어도 무방합니다.) 우리가 만든 VPC의 IP 범위는 192.168.0.0 ~ 192.168.255.255 이기 때문에, 하나의 서브넷당 IP의 범위를 192.168.X.X 만큼 설정해 주도록 하겠습니다. subnet-1 subnet-2

서브넷 4개가 생성되었습니다. subnet-3

여기까지의 구성도입니다. subnet-4

인터넷 게이트웨이 생성하기

앞서 만든 VPC는 인터넷과 연결된 통로가 없습니다. 그래서 이 상태에서 인스턴스를 만들어도 접속할 수 없는데요. 아마존에서는 인터넷 액세스를 활성화하려면 다음을 수행해야 한다고 설명하고 있습니다.

  1. 인터넷 게이트웨이를 생성하여 VPC에 연결합니다.
  2. 인터넷 바인딩된 트래픽을 인터넷 게이트웨이로 전달하는 라우팅을 서브넷의 라우팅 테이블에 추가합니다.
  3. 서브넷의 인스턴스에 전역적으로 고유한 IP 주소(퍼블릭 IPv4 주소, 탄력적 IP 주소 또는 IPv6 주소)가 있는지 확인합니다.
  4. 네트워크 액세스 제어 목록 및 보안 그룹 규칙에서 관련 트래픽이 인스턴스로, 그리고 인스턴스에서 흐르도록 허용되는지 확인합니다.

AWS 콘솔 검색창에 인터넷 게이트웨이를 검색하여 대시보드로 들어갑니다. 그 후 오른쪽 상단의 인터넷 게이트웨이 생성을 눌러 생성 화면으로 이동하고 이름을 입력하여 인터넷 게이트웨이를 생성합니다. igw-1

인터넷 게이트웨이는 생성후에 VPC와 연결해 주어야 합니다. 오른쪽 상단의 작업 탭을 선택후 VPC에 연결을 선택하여 VPC 연결 화면으로 이동합니다. 그후 처음에 만든 VPC를 선택하고 인터넷 게이트웨이 연결을 눌러 VPC와 인터넷 게이트웨이를 연결해줍니다. igw-1

여기까지의 구성도입니다. igw-3

라우팅 테이블 생성하기

인터넷 게이트웨이를 생성하여 VPC와 연결했지만 아직 인스턴스에 연결할 수 없습니다. 아마존에서 설명한대로 서브넷의 라우팅 테이블이 방금 만든 인터넷 게이트웨이를 향하게 해야하는데요. 일단 라우팅 테이블을 검색하여 라우팅 테이블 대시보드로 진입합니다.

그러면 기본으로 생성된 라우팅 테이블 한개를 볼 수 있습니다. 쉽게 구분하기 위해 일단 이름을 rtb-public으로 변경합니다. 그 후 하단의 라우팅을 눌러보면 VPC 내부연결을 위한 규칙만 존재하는것을 확인 할 수 있습니다. 라우팅 탭의 라우팅 편집 을 눌러 라우팅을 추가해봅시다. 라우터(목적지)는 0.0.0.0/0 을 지정하고 방금 만든 인터넷 게이트웨이를 타겟과 연결합니다. rtb-1

라우팅 테이블의 라우팅(목적지)이 수정되었습니다. rtb-2

이제 라우팅 테이블과 서브넷을 연결해야 합니다. 서브넷 연결 탭을 눌러보면 명시적 연결이 없는 서브넷 이 보이는데요, 이중 subnet-public-1subnet-public-2 서브넷을 연결하여 이름뿐이 아닌 진짜 퍼블릭 서브넷으로 만들어 보겠습니다. rtb-3

서브넷 연결 탭의 명시적 연결이 없는 서브넷 박스에서 서브넷 연결 편집 을 눌러 서브넷 연결을 편집 화면에 진입합니다.

subnet-public-1subnet-public-2 을 선택하고 하단의 연결 저장 버튼을 클릭합니다. rtb-4

이제 위에서 만든 4개의 서브넷중 2개의 서브넷이 퍼블릭 서브넷이 되었습니다. 실제로 연결되는지 한번 확인해봅시다.

인스턴스를 생성하기 위해 인스턴스 대시보드로 들어가 오른쪽 상단의 인스턴스 시작을 눌러 인스턴스 마법사를 시작합니다. 인스턴스 마법사 설정을 간단하게 설명드리겠습니다.

  1. AMI 선택 - 여기서는 Amazon Linux 2 AMI를 선택하겠습니다.
  2. 인스턴스 유형 선택 - 자금의 압박이 있기 때문에 프리티어 사용 가능 유형인 t2.micro를 선택하겠습니다.
  3. 인스턴스 세부 정보 구성 - 이곳이 중요합니다. 네트워크는 우리가 만든 VPC를 선택해주고 서브넷은 subnet-public-1을 선택하도록 하겠습니다.
  4. 스토리지는 기본 8GB 스토리지를 사용하겠습니다
  5. 태그는 건너 뛰겠습니다.
  6. 보안그룹도 새로 생성되는 보안그룹을 선택하겠습니다. 기본은 0.0.0.0/0 에 대해 22번 포트가 열려있는 형태입니다.
  7. 인스턴스 시작을 클릭합니다. 그 후 새 키 페어 생성을 선택하고 키 페어를 다운받아 잘 저장해 둡니다. (주의! 다시 다운로드 할 수 없습니다.)

rtb-5

생성한 인스턴스의 정보입니다. VPC 와 퍼블릭 서브넷이 올바르게 매핑되었는지 확인합니다. rtb-6

그 후 탄력적 IP를 한개 발급받아 인스턴스와 연결하고, SSH Client를 사용해 원격 접속되는지 확인합니다.

탄력적 IP는 대시보드 좌측의 네트워크 및 보안 - 탄력적 IP 탭에서 할당받고 연결시킬 수 있습니다. SSH Client의 사용법을 모르신다면 이곳 에서 확인해보세요.

퍼블릭 서브넷으로의 전환까지 완료한 구성도입니다. rtb-7

앞 포스팅에서 설명드렸듯이 인터넷 게이트웨이로 향하는 라우팅이 없는 라우팅 테이블과 연결된 서브넷을 프라이빗 서브넷 이라 합니다. 프라이빗 서브넷을 만들기 위해 rtb-private 라는 이름을 가진 라우팅 테이블을 만들고 subnet-private-1 과 subnet-private-2 서브넷을 연결해 두겠습니다. rtb-8 rtb-9

여기까지 라우팅 테이블을 만들고 퍼블릭 서브넷, 프라이빗 서브넷에 연결하여 구성 완료한 구성도입니다. rtb-10

Bastion Host 생성하기

퍼블릭 서브넷에 프론트 & 백엔드 어플리케이션을 올리지는 않습니다. (물론 가능은 합니다.) 보통 프라이빗 서브넷에 어플리케이션을 올리고 외부에서의 접근은 로드밸런서를 통해 80, 443 포트만 프라이빗 서브넷의 인스턴스에 접근할 수 있게 하지요.

그렇다면 프라이빗 서브넷 내부 인스턴스에 문제가 생겨 내 PC 에서 직접 인스턴스에 접속하려면 어떻게 해야 할까요? 정답은 Bastion Host 입니다. 퍼블릭 서브넷에 안스턴스를 생성하고 생성한 인스턴스에서 프라이빗 IPv4 주소를 통해 재접속하는 방식입니다. 일종의 프록시 서버이죠.

시작하기 전에 프라이빗 서브넷에 인스턴스 한개를 만들어 두도록 하겠습니다. 아까 인스턴스 생성 과정의 3. 인스턴스 세부 정보 구성 에서 서브넷만 subnet-private-1 으로 바꾸고 다른 옵션은 유지한채 인스턴스를 시작합니다. bastionhost-1 퍼블릭 IPv4 주소가 없고 서브넷 ID가 subnet-private-1 인 인스턴스 한개를 생성하였습니다. 사설 IP 대역이기 때문에 당연히 현재 PC 에서 이 인스턴스로 접근할 수 없습니다.

이제 퍼블릭 서브넷에 Bastion Host 용도의 인스턴스 한개를 만들어 보겠습니다.

Bastion Host는 보통 Linux로 구성합니다. 하지만 자신이 터미널 환경의 운영체제에 익숙하지 않거나 터미널 환경의 DB 조작에 익숙하지 않다면 Windows 환경으로 구성하는것도 무방합니다. Windows 환경으로 구축하였을 경우 원격 데스크톱으로 해당 인스턴스에 접근해야 하는데요, 관련해서는 많은 글과 예제가 있으니 검색해 보시기 바랍니다.

bastionhost-2 퍼블릭 서브넷에 인스턴스 한개를 생성하고 탄력적 IP를 연결하였습니다. 이 인스턴스가 Bastion Host 용도의 인스턴스가 되는 것입니다.

이제 SSH Client를 이용해 방금 만든 Bastion Host에 접속해 보겠습니다.

bastionhost-3 ifconfig 명령어를 통해 현재 ip를 확인해 보니 192.168.0.247로 subnet-public-1에 있는 컴퓨터인것을 확인하였습니다.

그 후 프라이빗 서브넷에 있는 인스턴스를 생성할때 만든 .pem 파일을 Bastion Host로 옮깁니다. 옮긴 후에 ssh -i key.pem ec2-user:192.168.X.X 명령어를 사용하여 인스턴스에 접근해 보겠습니다. 음? 접속이 되지 않습니다. 어떻게 된 일일까요?

정답은 보안그룹입니다. 프라이빗 서브넷의 인스턴스를 생성하실때 보안그룹을 잘 확인하지 않고 그냥 기본 생성되는 보안그룹을 적용하셨다면 문제없이 접근하셨을 수도 있습니다. 그러나 22번 포트에 대해 인바운드 규칙을 없애버리셨다면 접근 할 수 없는것이 당연합니다.

보안그룹 탭에 들어가 현재 프라이빗 서브넷에 적용되어 있는 보안그룹을 변경하겠습니다. 유형에 SSH를 선택하시고 소스에는 Bastion Host의 EIP CIDR 블록을 직접 입력하는 것이 아닌 Bastion Host에 적용되어 있는 보안그룹을 선택해주세요. (여기서는 편의상 public, private sg 라 지칭해 두었습니다.) bastionhost-4 보안그룹이 적용되었다면 다시한번 Bastion Host에 접속해서 프라이빗 서브넷의 인스턴스에 접속해 보겠습니다.

bastionhost-5 프라이빗 서브넷 내부 인스턴스에 접속 성공하였고 ifconfig 명령어를 통해 subnet-private-1에 있는 컴퓨터인것을 확인하였습니다.

혹시 아래와 같은 에러 메시지를 보게 된다면 전송한 key.pem 파일의 권한을 chmod 600 key.pem 명령어를 통해 바꿔주세요. bastionhost-6

Bastion Host 생성을 완료하였고 여기까지의 구성도는 다음과 같습니다. bastionhost-7

귀찮게 뭐하러 한단계 거쳐서 접근해? 내 컴퓨터에서 바로 접근하는 방법은 없어? 라고 생각하시는 분들이 계실텐데요 (저도 그랬습니다…) 이 부분은 SSH Tunneling 혹은 SSH Reverse Tunneling 으로 해결할 수 있으니 궁금하신 분들은 검색해 보시기 바랍니다.

NAT Gateway 생성하기

Bastion Host를 통해 프라이빗 서브넷에 있는 인스턴스에 접근까지는 성공하였습니다. 하지만 프라이빗 서브넷은 현재 인터넷과 관련된 동작은 할 수 없습니다. 이유는 나가는 라우팅(목적지)이 없기 때문입니다. 일례로 sudo yum update 명령어를 쳐도 아무것도 동작하지 않습니다. 오히려 Connection time out 이라는 타임아웃 에러메시지를 확인 할 수 있습니다. 이때 필요한 것이 NAT Gateway 입니다.

AWS 콘솔에서 NAT 게이트웨이를 검색하여 대시보드로 이동한 후에 우측 상단의 NAT 게이트웨이 생성을 눌러 생성화면으로 이동해보겠습니다. 이름을 지정하고 서브넷은 subnet-public-1 을 지정해 2a 가용영역의 퍼블릭 서브넷에 NAT Gateway가 생성될 수 있도록 합니다. 마지막으로 탄력적 IP를 하나 할당 받아 적용하고 NAT Gateway를 생성합니다. nat-1

NAT Gateway를 생성하였지만 아직 프라이빗 서브넷의 인스턴스에서는 인터넷에 접속할 수 없습니다. 이유는 프라이빗 서브넷의 라우터(목적지)를 수정하지 않았기 때문인데요. 이를 수정하기 위해 라우팅 테이블 대시보드로 이동하여 현재 프라이빗 서브넷에 적용되어 있는 라우팅 테이블을 선택후 라우팅 편집을 클릭하여 편집화면으로 이동하도록 하겠습니다. 라우팅 편집화면으로 이동하였다면 0.0.0.0/0 에 대한 라우팅을 추가하고 대상을 방금 만든 NAT Gateway로 지정해주도록 하겠습니다. nat-2

편집이 모두 완료되었다면 다시 프라이빗 서브넷의 인스턴스로 접속하여 sudo yum update 명령어를 쳐보겠습니다. nat-3

인스턴스가 NAT Gateway를 통해 인터넷과 연결되어 패키지가 업그레이드 되는것을 확인할 수 있습니다. 만약 외부 업체의 api에 접근해야 하는데 보안 정책상 기본 접근은 막아두고 접근 허용할 IP를 알려달라고 하면 방금 만든 NAT Gateway의 EIP를 알려주면 되겠죠? 또 지금은 2a 가용영역에만 NAT Gateway를 만들었지만 보통 가용존의 수만큼 만든다고 하니 알맞은 수의 NAT Gateway를 만들어 보시기 바랍니다.

NAT Gateway 까지 생성 완료한 현재까지의 구성도입니다. nat-4

This post is licensed under CC BY 4.0 by the author.

AWS를 사용해 무중단 배포 자동화 환경 구축하기 - 2. VPC와 기본 리소스

AWS를 사용해 무중단 배포 자동화 환경 구축하기 - 4. 어플리케이션 구축 및 로드밸런서 적용