프로그래밍/devops

AWS NLB를 활용한 private VPC 구성

브래드 킴 2023. 2. 24. 14:32
728x90

일반적인 AWS 웹서비스 서버프로그램 구성 절차(public/private 서브넷)

 

1)VPC를 생성한 뒤에 igw를 생성하여 VPC에 연결

2)public용, private용 서브넷을 각각 구성

3)public/private용 라우팅테이블을 각각 만들어, public 라우팅테이블에는 igw를 라우팅시키고 public서브넷에 연결을시키고, private용 라우팅테이블에는 nat 게이트웨이 및 로컬사설IP만 라우팅 설정. private서브넷에서도 패키지 download, 외부서버와의 통신 등의 이유로 outbound 인터넷 통신이 필요하기 때문에 nat사용.

4)nat 게이트웨이 생성시 외부에서 IP인식될 IP를 할당하기 위해 EIP(고정IP)생성하여 연결. 또한 nat는 인터넷환경이 가능한 public서브넷에 구성.

 

위 단계까지 했다면 네트워크는 어느정도 구성되었다.  위와 같이 네트워크를 구성하게 되면, Route53에 설정된 도메인을 설정하고, ALB등을 연동시키게 되면 서버프로그램에 WAF 및 SSL인증서를 쉽게 적용할 수 있므로 많이들 ALB 구성을 사용할 것이다. 이때 ALB는 public한 subnet에 구성하여, Listener를 사용하여 원하는 private instance의 port로 타겟그룹을 통하여 로드밸런싱이 가능하다.

 

public환경의 alb단에 waf 등을 두고 private subnet에 위치한 instance로 로드밸런싱 함으로서, 서비스를 private에 구성하면서도 igw를 타고 들어오는 inbound traffic에 대한 처리가 가능하도록 하는 것이다.

 

이때 ALB단에 보안그룹은 80,443을 모든 ip에 대해서 열어두고,

 

private 서브넷에 있는 instance에 대한 보안그룹은 ALB에만 80,443을 열도록 하자. private서버에 구성된 웹서비스의 경우 ALB만을 통해서 들어오는 traffic만을 받을 수 있도록 하는 것이다. 22port같은 경우에는 public 서브넷 서버에만 열어두자. 어차피 any로 열어도 private 라우팅테이블에 igw가 라우팅되어 있지 않으므로, 같은 VPC외에는 인터넷 접속이 되지는 않는다.

 

public instance에는 사무실IP + 22 port 등을 열어두어 개발자는 public의 서버를 통해 private서버로 ssh 접속하는 베스천서버 구성을 갖추게 되는게 보통의 웹서비스 구성이 될 것이다.

 

정리하자면 route53 -> (public서브넷) alb ->(waf) -> (private서브넷)instance  이 그림이 가장 simple한 일반적인 구성이 되겠다.

 

 

NLB를 활용한 private VPC 네트워크 구성

일단 private VPC를 구성한다는 것의 의미는 igw를 연결한 1개의 VPC외에 igw가 연결되지 않은 완전히 private한 VPC를 별도로 둔다는 것을 의미한다. 일반적으로 금융서비스 같은 높은 보안성 수준을 요구되는 서비스가 이러한 구성을 갖고 있다. 이 구성을 하게 되면, private VPC안의 instance로의 SSH접근은 원천적으로 차단되게 된다. 베스천 서버를 둔다거나, 보안그룹을 열어준다 하더라도 접속은 원칙적으로 불가하게 된다.(물론 tgw, vpc 피어링 등을 통해 가능하긴하다)

 

무슨말인지 이해를 하려면 먼저 웹서비스가 어떻게 구성될지에 대한 예시구성을 먼저 그려보자.

 

route53 -> (VPC_1의 public 서브넷) alb -> (waf) -> (VPC_1)target group에서 nlb ip주소 명시 -> (VPC_2)nlb -> (VPC_2)alb -> (VPC_2)ec2 instance 

 

만약 VPC를 완전히 private하게 만든다면, VPC가 2개가 있을 것이다. igw가 붙은 public 서브넷 생성이 가능한 VPC_1와 private 서브넷만으로 이루어진 VPC_2로 구성이 될 것이다.

 

VPC1에서 VPC2로 서비스를 연계시키려면 VPC1에서 VPC2에 위치한 로드밸런서를 호출해야 연계를 시킬 수 있다. 그런데 VPC1의 alb에서 VPC2의 alb를 호출하는 방식은 불가하다. alb에는 고정 IP주소가 없기 때문이다. 그래서 중간에 nlb를 두어 VPC1의 alb가 VPC2에 있는 nlb IP주소를 호출하는 구조가 되는 것이다. 물론, nlb ip명시 뿐만 아니라 라우팅테이블, tgw 등 설정해줘야 할 것들이 몇가지 더 있다. 그러나, 여기서는 private VPC구성시에 nlb역할에 대해서만 말하고자 한다.

 

결론을 말하면, 완전한 private VPC를 별도로 구성하고 싶은 아키텍처라 하더라도, 인터넷환경이 되는 VPC가 1개는 필요할 것이고, 더불어 로드밸런서를 사용한다면, 두 VPC를 연계시킬때에 alb만을 사용하게 된다면, alb에는 고정IP가 없어 다른 VPC에 존재하는 alb를 찾을수가 없기에 nlb를 통해 연계하는 아키텍처를 쓰게 된다는 것이다.

728x90