AWS VPC Subnet

2024년 7월 22일 월요일

Today I Learned

날짜

2024년 7월 22일 월요일

내용

Public Subnet VS Private Subnet

지난 주 금요일부터 계속 처리하던 람다 함수를 계속 만졌다. 웬걸? 람다함수는 구글 드라이브에 스프레드 시트를 생성하는 것부터 실패하고 있었다. 아예 요청 자체가 가질 못하고 있었다. 요청의 문제라기보단 통신의 문제였다. 람다함수가 외부 인터넷과 통신을 못하고 있는게 분명했다.

AWS Lambda 함수가 VPC 내의 퍼블릭 서브넷에 배치될 때, 자동으로 퍼블릭 IP를 할당받지는 않습니다. Lambda 함수는 ENI(Elastic Network Interface)를 사용하여 VPC 내에서 네트워크 통신을 수행합니다. 이러한 ENI는 퍼블릭 IP를 갖지 않기 때문에 퍼블릭 서브넷에 배치되어도 인터넷에 직접 접근할 수 없습니다.

내가 구성한 VPC라는 망에서, 외부 인터넷과 자유롭게 주고받을 수 있는 영역이 퍼블릭 서브넷, 그렇지 못한 영역이 프라이빗 서브넷이다. 나는 분명 람다함수를 퍼블릭 서브넷에서 실행했는데도 인터넷(구글 API)에 접근 못하는 상황이어서 의아했는데.. 람다함수를 프라이빗 서브넷에 배치하고, 프라이빗 서브넷이 인터넷과 통신할 수 있도록 NAT 게이트웨이를 생성해주면 됐다.

반년 전 쯤 ECS 크론 태스크가 S3에서 환경변수를 불러오지 못하는 문제를 겪을때 프라이빗 서브넷이 인터넷에 접근할 수 있도록 NAT 게이트웨이를 생성해주었기 때문에 쉽게 해결될거라고 생각했다. 우선 NAT 게이트웨이에게 할당할 Elastic IP가 부족했다. 이미 샐러드랩 계정은 계정당 기본 할당량인 5개를 모두 사용하고 있어서… AWS에게 5개를 추가로 요청했고 30분만에 승낙받았다. 퍼블릭 서브넷 중 하나에 NAT 게이트웨이를 생성하고, 프라이빗 서브넷들이 향하는 라우팅 테이블들이 새로 만든 NAT 게이트웨이로 향하도록 만들었다. 이제 프라이빗 서브넷에서도 인터넷에 접근 가능할 줄 알았다. 저번엔 그럤으니까…

정말 골떄리는 상황이 생겼는데 NAT 게이트웨이로 프라이빗 서브넷을 설정해줄 경우 내 로컬에서 테스트서버 RDS에 접근할 수가 없었다. ACL 정책이나 보안그룹, 데이터베이스의 퍼블릭 액세스 활성화도 수십번을 체크했는데도.. 같은 VPC 내에 있는 테스트서버 ECS는 접근 가능했기 떄문에 테스트 서버가 돌아가는데는 이상이 없었다. 다만 내가 로컬에서 pgadmin4로 테스트서버 데이터베이스에 접근할 수 없었고, 로컬에서 테스트서버 데이터베이스에 연결하여 서버를 구동할 수 없았다.

혹시나 프라이빗 서브넷이 아직 인터넷에 접근하지 못하는건 아닌가 싶어 테스트를 해보았다. 퍼블릭 서브넷과 프라이빗 서브넷에 각각 EC2 인스턴스를 만들었다. 우선 퍼블릭 서브넷에 만든 인스턴스에 접속한 후 그 내부에서 프라이빗 서브넷에 만든 인스턴스로 들어갔다. 프라이빗 서브넷은 말그대로 프라이빗이기 떄문에 퍼블릭 서브넷을 통해서만 접근 가능하다. 여기서 telnet이나 ping으로 외부 인터넷과 통신이 안되면 NAT 게이트웨이의 문제였을 것이다. 하지만 너무 잘돌아갔다. 따라서 프라이빗 서브넷이나 NAT 게이트웨이의 문제는 아니라고 결론내렸다.

NAT 게이트웨이 설정을 취소하고 모든 서브넷을 인터넷 게이트웨이(igw)로 연결해주었다. 즉, 프라이빗 서브넷 없이 퍼블릭 서브넷만 4개인 VPC가 된것. 이랬더니 데이터베이스에 접근 가능하다. 다만 프라이빗이 없어서 람다함수 내부에선 인터넷에 접근할 수 없었다… 뭔일이여 이게… 원인은 모르겠으나 가설을 우선 세웠다.

  1. 퍼블릭 서브넷에서만 데이터베이스가 접근 가능하다. 왜냐하면 서브넷 4개를 모두 퍼블릭으로 만들었을 떄 로컬에서 테스트서버 데이터베이스에 접근했었기 떄문이다.
  2. 프라이빗 서브넷에서만 람다함수가 인터넷에 접근할 수 있다.
  3. 따라서 람다함수가 실행될 서브넷은 프라이빗 서브넷으로 한정지어준다.
  4. 데이터베이스가 구동되는 서브넷 그룹에는 현재 모든 서브넷이 들어가있지만, 이걸 퍼블릭만 포함하도록 수정해주면 될지도 모른다.

근데 같은 VPC 내의 또다른 서브넷 그룹으로는 데이터베이스를 수정할 수 없댄다… 어쩔수 없이 잠시 다른 VPC로 옮겼다가 다시 가져오는 과정에서 퍼블릭 서브넷 2개로만 이루어진 서브넷그룹에서 데이터베이스가 구동되도록 설정했다.

이랬더니 진짜 된다. 로컬에서 데이터베이스도 접근 가능하고, 람다함수도 인터넷고 통신할 수 있다! 이걸 7시간 만에 꺠달아버렸다… 람다 함수 완성은 언제하냐…

회고

AWS 진짜 어렵다…