Cloud Service Practice 04

인터넷 게이트웨이: VPC의 바깥문, 자동 인터넷 연결은 아닙니다

인터넷 게이트웨이를 만들기만 하면 인터넷이 된다고 생각하기 쉽지만, 실제로는 VPC에 붙어야 하고 라우팅도 따로 필요하다는 점이 흐릿하다.

근거 · 교안 p21-p26

인터넷 게이트웨이는 자동문이 아니다: VPC 인터넷 연결의 진짜 원리 대표 이미지

1장: 인터넷 게이트웨이, 만들었지만 아직 ‘문’이 아닌 이유

솔라의 손가락이 경쾌하게 키보드를 두드렸다. AWS 콘솔 화면에 ‘성공’이라는 초록색 메시지가 뜨자 만족스러운 미소를 지었다.

“좋았어! sola-igw 인터넷 게이트웨이 생성 완료. 이제 우리 집(VPC)에도 드디어 바깥 세상으로 통하는 문이 생겼네.”

솔라는 의자에 등을 기댄 채 뿌듯하게 화면을 바라봤다. 이름부터 ‘인터넷 게이트웨이’. 인터넷으로 나가는 관문이라니. 이 문만 있으면 VPC 안에 갇혀 있던 서버들이 자유롭게 인터넷을 향해 달려 나갈 수 있을 터였다. 이제 모든 준비가 끝났다고 생각하는 순간, 솔라의 시선이 실습 가이드의 다음 단계에 머물렀다.

“어? 그런데 왜 다음 단계가 또 있지? ‘VPC에 연결’?”

솔라의 미간이 살짝 좁혀졌다. 방금 문을 만들었는데, 그걸 또 ‘연결’하라니. 마치 현관문을 주문 제작해서 받았는데, 아직 건물에 달지 않고 마당 한쪽에 덩그러니 세워둔 느낌이었다. 상식적으로 문을 만들었으면 당연히 어딘가에 붙어 있어야 하는 것 아닌가?

“언니, 이거 좀 이상하지 않아? 인터넷 게이트웨이를 만들었는데 이걸 또 VPC에 연결하래. 그럼 만들기만 한 건 대체 뭐야? 연결도 안 된 문짝이야?”

옆에서 조용히 자신의 노트북을 보던 루나가 솔라의 화면으로 시선을 옮겼다. 루나는 솔라의 질문에 바로 답하는 대신, 화면을 가리켰다.

“음… 다시 한번 볼래? 방금 네가 만든 그 게이트웨이 목록을. 거기 뭐라고 쓰여 있어?”

“목록? 아, 여기.”

솔라는 인터넷 게이트웨이 목록 페이지로 돌아갔다. 자신이 방금 만든 sola-igw가 선명하게 보였다. 이름, 그리고 복잡해 보이는 ID. 그리고 그 옆에 작은 회색 글씨로 적힌 단어가 있었다.

“상태… ‘Detached’라고 되어 있네. Detached? 붙어있지 않다는 뜻이잖아!”

솔라의 목소리가 커졌다. 마치 중요한 단서를 발견한 탐정처럼. 그녀는 방금 자신이 뱉은 말을 곱씹었다. 분리된, 연결되지 않은. 그제야 머릿속에 흩어져 있던 조각들이 맞춰지는 기분이었다.

루나는 솔라가 스스로 깨닫도록 잠시 기다려주었다.

“맞아. 바로 그거야.”

“아! 그러니까… 게이트웨이를 ‘만드는’ 행위랑, 그걸 우리 VPC라는 집에 ‘설치하는’ 행위는 완전히 별개의 단계였구나. 나는 ‘생성’ 버튼을 누르면 당연히 착 하고 붙는 줄 알았지.”

솔라는 허탈하게 웃으며 말했다. 이름에 ‘게이트웨이’가 들어가니 당연히 문으로서의 역할을 바로 시작할 거라 기대했던 것이다. 하지만 AWS의 세계는 생각보다 더 절차를 중요시하는 듯했다.

| Name       | Internet gateway ID     | State      |
|------------|-------------------------|------------|
| sola-igw   | igw-xxxxxxxxxxxxxxxxx   | Detached   |

루나는 솔라가 보고 있는 화면을 보며 고개를 끄덕였다.

“온라인 쇼핑으로 최신형 디지털 도어록을 주문했다고 생각해봐. 배송 기사님이 문 앞에 상자를 두고 갔어. 그럼 우리 집에 도어록이 생긴 건 맞지만, 아직 현관문에 설치된 건 아니잖아. 누군가 공구를 가져와서 기존 문고리를 떼고, 새 도어록을 단단히 고정해야 비로소 ‘우리 집의 문’이 되는 것처럼.”

“와, 그 비유 완벽하다. 지금 내 인터넷 게이트웨이는 그냥 현관문 앞에 놓인 택배 상자였네.”

솔라는 이제 ‘Detached’라는 상태의 의미를 명확히 이해했다. 생성은 그저 부품을 만들어 둔 것일 뿐, 실제 내 VPC에 기능을 하도록 연결하는 과정은 따로 필요하다는 것을. 생성과 연결이 분리된 덕분에, 하나의 게이트웨이를 다른 VPC에 실수로 붙이는 일 없이 신중하게 작업할 수 있다는 장점도 어렴풋이 보였다.

스스로의 오해를 해결한 솔라는 다시 자신감이 붙었다. 그녀는 마우스를 쥐며 말했다.

“알겠어! 그럼 이제 저 ‘Detached’를 ‘Attached’로 바꾸기만 하면 진짜 끝이겠네. 이 문을 우리 VPC에 달아주면, 내 서버가 바로 인터넷으로 나갈 수 있는 거지?”

솔라의 눈빛은 확신으로 가득 차 있었다. 이제 정말 마지막 한 단계만 남았다고 믿는 사람의 눈빛이었다. 루나는 그런 솔라를 보며 아무 말 없이 희미하게 미소만 지었다.

2장: VPC에 ‘문’을 달았지만, 왜 인스턴스는 여전히 인터넷에 나가지 못할까?

솔라는 자신만만했다. 마우스 커서는 망설임 없이 ‘작업’ 메뉴로 향했고, ‘VPC에 연결’을 클릭했다. 팝업창이 뜨자, 그녀는 자신의 VPC를 선택하고 ‘인터넷 게이트웨이 연결’ 버튼을 힘주어 눌렀다. 잠시 후, 화면이 새로고침되더니 회색으로 보이던 ‘Detached’ 상태가 선명한 초록색 글씨의 ‘Attached’로 바뀌었다.

| Name       | Internet gateway ID     | State     | VPC ID                  |
|------------|-------------------------|-----------|-------------------------|
| sola-igw   | igw-xxxxxxxxxxxxxxxxx   | Attached  | vpc-yyyyyyyyyyyyyyyyy   |

“자, 봐봐. 이제 완벽하게 ‘우리 집 문’이 됐어. 택배 상자를 뜯어서 현관문에 제대로 달았다고.”

솔라는 뿌듯하게 외치며 터미널 창을 열었다. 그녀의 VPC 안에 있는 테스트용 서버에 이미 접속해 둔 상태였다. 이제 이 서버가 인터넷과 통신이 되는지 확인하는 마지막 관문만 남았다. 마치 새로 설치한 디지털 도어록이 잘 작동하는지 비밀번호를 눌러보는 것처럼, 솔라는 키보드에 명령어를 입력했다.

ping 8.8.8.8

구글의 DNS 서버 주소였다. 인터넷이 연결되어 있다면, 이 주소로 신호를 보내고 응답을 받아오는 것은 아주 기본적인 확인 절차였다. 엔터 키를 누르자, 커서가 다음 줄에서 깜빡이기 시작했다.

1초, 2초, 3초… 응답이 없다.

솔라의 미간이 살짝 찌푸려졌다. 보통은 1초도 안 되어 응답 패킷이 돌아와야 했다. 그녀는 혹시나 하는 마음에 몇 초 더 기다렸지만, 화면에 나타난 것은 희망적인 메시지가 아니었다.

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3054ms

100% packet loss. 보낸 신호가 전부 사라졌다. 인터넷 세상으로 보낸 편지가 단 한 통도 목적지에 도착하지 못하고 실종된 셈이었다.

“말도 안 돼… 왜?”

솔라는 당황해서 중얼거렸다. ‘Attached’라는 초록색 글씨가 마치 자신을 비웃는 것처럼 느껴졌다. 문을 달았는데, 왜 밖으로 나갈 수가 없는 걸까? 현관문은 분명 열려 있는데, 집 안에서 현관문으로 가는 길을 잃어버린 기분이었다.

“언니, 이거 진짜 이상해. 인터넷 게이트웨이도 VPC에 붙였는데, 왜 인터넷이 안 되지? Attached 됐다고 나오는데!”

솔라의 다급한 목소리에 루나가 노트북 화면에서 고개를 들었다. 그녀는 솔라의 화면에 뜬 ‘100% packet loss’ 메시지를 잠시 보더니, 차분하게 질문을 던졌다.

“음… 새로운 대형 쇼핑몰이 개장했다고 상상해볼까? 건물 정문에 아주 멋진 자동문이 설치됐어. 바로 네가 방금 한 것처럼.”

“응. 그 문을 설치했지. 그런데?”

“그런데, 그 쇼핑몰 3층 구석에 있는 가게에 들어간 손님이 이제 집에 가려고 해. 그 손님은 이 쇼핑몰이 처음이야. 주변에는 아무런 안내 표지판이 없어. ‘출구는 이쪽’이라거나 ‘정문’ 같은 표시가 전혀 없다면, 그 손님이 과연 한 번에 정문을 찾아 나갈 수 있을까?”

루나의 비유에 솔라는 잠시 생각에 잠겼다. 3층 구석 가게, 처음 온 손님, 안내판 없는 복잡한 쇼핑몰…

“못 찾겠지. 어디로 가야 할지 모르니까 그냥 주변을 헤매거나, 막다른 길에 부딪히기만 할 거야.”

“바로 그거야.”

루나는 솔라의 컴퓨터 화면을 손가락으로 가리켰다.

“지금 네 서버가 바로 그 ‘길 잃은 손님’이야. VPC는 거대한 쇼핑몰이고, 인터넷 게이트웨이는 ‘정문’이지. 너는 정문을 건물에 설치하는 작업까지는 마쳤어. 하지만 쇼핑몰 내부(VPC)에 있는 손님(서버)에게 ‘외부 인터넷으로 나가려면 저쪽 정문(인터넷 게이트웨이)을 이용해야 해’라고 알려주는 안내판을 아직 설치하지 않은 거야.”

“안내판…?”

솔라는 ‘안내판’이라는 단어를 입안에서 굴렸다. 그제야 그녀는 깨달았다. 인터넷 게이트웨이를 VPC에 ‘연결’하는 행위는, 말 그대로 물리적인 연결 지점을 만드는 것일 뿐이었다. 그 문을 ‘어떻게’, ‘어떤 상황에’ 사용해야 하는지에 대한 규칙이나 경로를 알려주는 절차는 전혀 포함되어 있지 않았던 것이다.

‘Attached’는 그저 ‘문이 달려 있음’을 의미할 뿐, ‘누구나 이 문을 통해 나갈 수 있음’을 보장하는 상태가 아니었다.

“아…! 그럼 문을 다는 거랑, 그 문으로 가는 길을 알려주는 건 별개의 작업이구나. 나는 문만 달면 다들 알아서 그쪽으로 나갈 줄 알았지.”

솔라는 허탈한 웃음을 지었다. 두 번째 함정에 빠진 기분이었다. 생성과 연결이 분리되어 있던 것처럼, 연결과 길 안내 또한 분리된 단계였던 것이다.

이제 그녀의 머릿속은 다음 질문으로 가득 찼다.

“알겠어. 그럼 그 ‘안내판’은 어떻게 만드는 건데? 내 서버한테 인터넷으로 가는 길을 알려주려면 뭘 해야 하는 거지?”

3장: ‘길’을 알려줘야 ‘문’으로 나갈 수 있어요: 라우팅 테이블의 역할

솔라의 질문이 채 끝나기도 전에, 루나는 이미 자신의 노트북을 돌려 솔라에게 보여주고 있었다. 화면에 떠 있는 것은 AWS 콘솔의 한 페이지였다. ‘라우팅 테이블’이라는 제목 아래, 복잡해 보이는 표가 하나 덩그러니 놓여 있었다.

“네가 방금 물어본 ‘안내판’이 바로 이거야.”

솔라는 화면으로 시선을 옮겼다. 이전 장에서 봤던 ‘Detached’나 ‘Attached’ 같은 직관적인 상태 표시와는 사뭇 다른 화면이었다. 표 안에는 ‘대상(Destination)’과 ‘타겟(Target)’이라는 열이 있었고, 이미 한 줄의 규칙이 들어가 있었다.

대상 (Destination)타겟 (Target)
10.10.0.0/16local

솔라는 눈살을 찌푸렸다. “이게 안내판이라고? 암호문 같은데… 10.10.0.0/16은 우리 VPC 주소 범위인 건 알겠어. 그런데 타겟이 ‘local’이라니. 이게 무슨 뜻이야?”

“좋은 관찰이야.” 루나가 말했다. “저 규칙은 ‘이 쇼핑몰(VPC) 내부 주소로 가려는 손님은, 그냥 이 안에서 길을 찾으면 된다’는 뜻이야. 굳이 정문으로 나갈 필요 없이, 1층에서 3층으로 가거나 같은 층 다른 가게로 가는 내부 경로를 알려주는 거지.”

“아, 내부 통신 규칙이구나. VPC 안에 있는 서버들끼리는 저 규칙 덕분에 서로 대화할 수 있었던 거네.” 솔라는 고개를 끄덕였다. “그럼… 외부, 그러니까 인터넷으로 가려면?”

솔라의 시선은 다시 터미널 창에 멈춰 있던 실패한 ping 명령어에 닿았다. 8.8.8.8이라는 주소는 명백히 10.10.0.0/16 범위 안에 없었다. 하지만 현재 안내판에는 그 주소로 가기 위한 어떤 규칙도 없었다. 길 잃은 손님은 어디로 가야 할지 몰라 그저 제자리에서 발만 동동 구르고 있었던 것이다.

“바로 그거야. 지금 이 안내판에는 ‘VPC 바깥 주소’로 가는 방법이 전혀 쓰여 있지 않아. 그러니 네 서버는 8.8.8.8로 가려다가, 규칙이 없어서 포기하고 packet loss를 일으킨 거지.”

루나는 솔라가 직접 답을 찾을 수 있도록 한 걸음 물러섰다. “이제 우리가 할 일은 뭘까? 이 안내판에 어떤 규칙을 새로 써줘야 할까?”

솔라는 잠시 생각에 잠겼다. 필요한 것은 ‘VPC 내부에 없는 모든 주소’를 향한 길 안내였다. 인터넷 세상에 존재하는 무수히 많은 IP 주소를 일일이 적어줄 수는 없는 노릇이었다.

“‘여기 적힌 주소들 말고, 나머지 전부’를 의미하는 그런 표현이 필요해.”

그때, 솔라의 머릿속에 네트워크 기초 강의에서 스쳐 지나갔던 개념 하나가 떠올랐다. ‘기본 경로(Default Route)’.

“잠깐만… 혹시 ‘0.0.0.0/0’ 아니야?” 솔라가 조심스럽게 입을 열었다. “이 라우팅 테이블에 명시되지 않은 모든 트래픽을 의미하는 거.”

루나의 입가에 옅은 미소가 번졌다.

“정답. 그럼 그 트래픽을 어디로 보내야 할까? 타겟은 뭐가 되어야 하지?”

“타겟은… 당연히 우리가 애써 만든 ‘정문’이지! sola-igw!”

솔라는 망설임 없이 라우팅 테이블 편집 화면으로 들어가 새 규칙을 추가했다.

  • 대상 (Destination): 0.0.0.0/0
  • 타겟 (Target): Internet Gateway > sola-igw

‘저장’ 버튼을 누르자, 라우팅 테이블이 업데이트되었다. 이제 안내판은 두 개의 규칙을 갖게 되었다.

대상 (Destination)타겟 (Target)
10.10.0.0/16local
0.0.0.0/0igw-xxxxxxxxxxxxxxxxx

“좋아, 이제 진짜 모든 준비가 끝났어. 쇼핑몰에 멋진 정문도 달았고, 건물 모든 층 모든 구석에 ‘외부로 나가려면 저쪽 정문으로!’라고 쓰인 완벽한 안내판까지 설치했어.”

솔라는 비장한 표정으로 다시 터미널 창을 열었다. 이전의 실패가 떠올랐지만, 이번에는 달랐다. 모든 논리적인 단계를 스스로 점검하고 문제를 해결했다는 확신이 있었다. 그녀는 위쪽 화살표 키를 눌러 이전에 입력했던 명령어를 다시 불러왔다.

ping 8.8.8.8

엔터 키를 누르자, 거짓말처럼 즉각적인 반응이 화면에 나타나기 시작했다.

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=2.45 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=2.51 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=2.48 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms

0% packet loss. 완벽한 성공이었다. VPC라는 고립된 공간에 갇혀 있던 서버가 드디어 바깥 세상과 악수하는 데 성공한 순간이었다.

솔라는 의자에 등을 기댔다. 이제야 모든 조각이 맞춰진 기분이었다. 인터넷 게이트웨이는 단순히 ‘문’이 아니었다.

첫째, ‘문’이라는 부품을 만든다. (인터넷 게이트웨이 생성, Detached 상태) 둘째, 그 부품을 내 건물에 단단히 설치한다. (VPC에 연결, Attached 상태) 셋째, 건물 안 사람들에게 문으로 가는 길을 알려주는 안내판을 설치한다. (라우팅 테이블에 경로 추가)

이 세 가지가 모두 완벽하게 맞물려야 비로소 VPC는 외부 인터넷과 소통할 수 있는 진정한 ‘집’이 되는 것이었다. 솔라는 자신의 깨달음을 노트에 정리하며, 더 이상 ‘게이트웨이’라는 이름에 속지 않을 것이라 다짐했다.