미운 오리 새끼의 우아한 개발자되기

[AWS] NAT Instance vs. Bastion Host 본문

Cloud/AWS

[AWS] NAT Instance vs. Bastion Host

Serina_Heo 2022. 12. 10. 12:27

업무 중 AWS lambda 를 사용할 일이 있었다.

Lambda function 에서 할 일은 Private subnet 안에 있는 DB 를 읽어와 AWS SES를 요청하여 이메일을 발송하는 것.

처음 Lambda를 써보는 거라 Lambda 가 일단 VPC 안에 위치하도록 설정하면, Private subnet 안에 Lambda를 둔다고 하더라도 인터넷으로 연결이 안된 다는 것을 몰랐다. 

Lambda 를 VPC 내에 두고 싶으면, 무조건 private subnet 에 있어야 한다고 doc 에 명시되어있다. 

그래서 private subnet 에 뒀더니, AWS SES 는 인터넷 Access 가 가능해야 호출을 할 수 있다는 것이다..

기본적으로 private subnet은 인터넷과 연결이 되지 않은 폐쇄적 서브넷이니, NAT Gateway를 만들어주거나, NAT Instance를 만들어줘야한다. 이래저래 찾아보며 문제를 해결하려 했지만 도저히! 인터넷 연결이 안돼서 옆자리에 앉은 인프라 담당 김대리님께 질문을 했다. 

(질문 블라블라...)

김대리님: 그래서 public subnet 에 bastion host 를 만들었다는 거죠? 

나: (내가 만든 건 nat instance 인데...) ??????????

 

그래서 궁금해진 NAT Instance 와 Bastion Host 의 차이점.

클라우드에서 기본적인 인프라 구성은 VPC 가 있으면 그 안에 

Internet gateway 와 라우팅테이블을 통해 연결이 된 public subnet 과

자기자신만을 라우팅하는 private subnet 이 있다. 

private subnet 에 있는 자원 (ec2, rds, whatever!) 경우에는 기본적으로 ssh 로도 접속할 수 없다. 

그렇다면 어떻게 private subnet의 자원에 access 할 수 있을까?

단순히 access 를 위한게 bastion host 라고 생각하면 된다. 

외부에서 private subnet의 자원에 ssh 접속을 하기 위해 public subnet 안에 만든 instance 가 bastion host이다. 

 

NAT instance 또한 public subnet 안에 만든 ec2 이지만, Network Address Translation 가 이름인 만큼 라우팅 테이블을 통해 private subnet 안의 자원이 public subnet 에 위차한 NAT instance 를 타고 외부의 인터넷으로 접근이 가능하게 하는 것이다. 

물론 외부로부터 Inbound 는 불가하다. 이것이 가능하려면 Loadbalancer 가 필요하다. 

한가지 덧붙이자면, NAT instance 를 만들 때, Ec2 에서 그냥 일반 이미지로 만들었더니

cat /proc/sys/net/ipv4/ip_forward

아무리 라우팅 테이블을 변경해도, 마스커레이드 기능은 활성화 되지 않았다.

Nat instance 를 만들려면, 반드시 ec2 에서 NAT 전용 이미지로 만들 것을 기억하자..!

 

참고 : https://dev.classmethod.jp/articles/external-communication-from-private-ec2-instance-to-nat-instance/