Cloud Service Practice 03
서브넷: 네트워크의 '진짜 자리' 만들기
서브넷 이름과 CIDR을 입력하는 화면은 단순한 양식처럼 보이지만, 왜 VPC 안에서 다시 주소 범위와 가용 영역을 나누는지 헷갈린다.
근거 · 교안 p13-p20
1장: VPC는 큰 그림, 서브넷은 구체적인 칸
솔라의 손가락이 노트북 트랙패드 위에서 잠시 멈췄다. 모니터 화면에는 ‘VPC 생성 완료’라는 반가운 메시지가 떠 있었다. 192.168.0.0/16. 자그마치 65,536개의 IP 주소를 가질 수 있는 거대한 가상 네트워크 공간을 자신의 손으로 막 만들어낸 참이었다. 뿌듯함도 잠시, 다음 단계인 ‘서브넷 생성’ 화면이 솔라의 발목을 잡았다.
“언니, 잠깐만. 나 지금 좀 이상한데.”
거실 소파에서 책을 읽던 루나가 고개를 들었다. 솔라의 목소리에는 이제 막 무언가를 이해했다고 생각했는데, 바로 다음 장벽에 부딪힌 사람 특유의 억울함이 묻어 있었다.
“왜? 방금 네트워크 하나 뚝딱 만들었다고 하지 않았어?”
“그러니까 말이야. VPC라는 내 전용 네트워크를 만들었잖아. 192.168.0.0/16이라는 엄청 넓은 땅도 확보했고. 그럼 이제 여기에 서버(EC2 인스턴스)를 바로 올리면 되는 거 아니야? 그런데 왜 또 그 안에 ‘서브넷’이라는 작은 네트워크를 만들라고 하는 거지? 이건 그냥 불필요한 절차 아닌가?”
솔라는 마치 ‘방금 집을 다 지었는데, 이제 방을 만들 차례입니다’라는 말을 들은 사람처럼 황당한 표정이었다. 그녀에게 VPC는 곧 ‘네트워크’ 그 자체였고, 서브넷은 그저 관리를 위한 귀찮은 하위 폴더 정도로 보였다.
루나는 소리 없이 일어나 솔라의 의자 뒤로 다가왔다. 화면을 잠시 들여다보더니, 책상 위에 놓인 빈 A4 용지와 펜을 솔라 쪽으로 밀었다.
“그렇네. 아주 넓은 도화지를 마련했구나. 우리 솔라가 만든 그 ‘땅’을 한번 그려볼까?”
“그림으로?”
솔라는 어리둥절했지만, 펜을 들고 A4 용지 가득 커다란 사각형을 그렸다. 그리고 그 위쪽에 ‘My VPC: 192.168.0.0/16’이라고 적었다.
“좋아. 이제 그 안에 솔라가 만들고 싶은 서버 한 대를 그려 넣어 봐.”
솔라는 사각형 안쪽, 대충 중앙쯤에 작은 네모를 그리고 ‘EC2’라고 썼다. 그러자 루나가 물었다.
“바로 거기. 그 서버의 ‘자리’는 어떻게 표현할 거야? 방금 그린 그 위치에 있다는 걸 어떻게 알 수 있지?”
“어? 자리? 그냥… 이 VPC 안에 있는 거지.”
“알아. 그 넓은 VPC 안에 있다는 건. 그런데 정확히 어디? 왼쪽 위 모서리에서 10cm, 위에서 5cm 떨어진 곳? 아니면 오른쪽 아래?”
솔라의 펜 끝이 허공에서 망설였다. 루나의 질문은 단순했지만, 핵심을 찌르고 있었다. 종이 위에서는 어디든 그릴 수 있었다. 하지만 그 위치는 아무런 의미도 갖지 못했다. 왼쪽 위에 그리든, 오른쪽 아래에 그리든, 그것은 그저 임의의 점일 뿐, 논리적인 ‘주소’나 ‘위치’가 될 수 없었다.
“그릴 수는 있는데… 이 그림이 아무 의미가 없는 것 같아. 그냥 텅 빈 공간에 점 하나 찍는 느낌이야. 이 서버의 ‘자리’가 어디라고 콕 집어 말할 수가 없어.”
솔라가 중얼거렸다. 그녀는 방금 자신이 그린 거대한 사각형이 실제 컴퓨터를 배치할 수 있는 구체적인 공간이 아니라, 그저 ‘여기부터 여기까지’라고 선언만 해놓은 추상적인 경계선에 불과하다는 것을 깨달았다. 6만 개가 넘는 IP 주소 목록은 그저 숫자의 나열일 뿐, 서버가 발을 딛고 설 수 있는 단단한 땅이 아니었다.
루나는 솔라의 어깨를 가볍게 두드렸다.
“바로 그거야. VPC가 제공하는 IP 주소 범위는 진짜 ‘자리’가 아니야. 앞으로 우리가 자리를 만들 수 있는 ‘가능성’의 영역 같은 거지. 일종의 거대한 토지 소유권 문서랄까. ‘서울시’라는 주소는 있지만, 몇 번지 무슨 건물인지는 정해지지 않은 상태야.”
솔라는 그제야 고개를 끄덕였다. 눈앞의 ‘서브넷 생성’ 화면이 더 이상 귀찮은 절차로 보이지 않았다.
“아! 그럼 서브넷이 바로 그 구체적인 ‘칸’을 만드는 거구나. VPC라는 추상적인 공간 안에, 실제로 서버를 놓을 수 있는 진짜 자리를 만드는 첫 단계네.”
솔라의 눈빛이 다시 빛나기 시작했다. 그녀는 이제 VPC가 전부가 아니며, 그 안에 명시적으로 ‘자리’를 만들어야 한다는 사실을 받아들였다. 비로소 서브넷의 존재 이유를 납득한 것이다. 솔라는 다시 한번 서브넷 생성 화면을 자신 있게 바라보았다. 그러나 새로운 의문이 고개를 들었다.
“알았어. 그럼 이 큰 땅을 구획으로 나눠서 ‘칸’을 만들어야 한다는 건 이해했어. 그런데 여기 서브넷 설정에 또 CIDR을 넣으라고 하네. 192.168.1.0/24 이런 식으로. 그냥 ‘1번 칸’, ‘2번 칸’처럼 이름만 붙이면 안 되나? 왜 굳이 IP 주소 범위를 또 잘게 쪼개는 방식으로 칸을 정의해야 하는 거지?”
2장: CIDR 분할: 논리적 구획으로 길을 내다
솔라는 방금 전 깨달음의 흥분이 가시지 않은 채, 다시 A4 용지를 끌어당겼다. VPC라는 거대한 땅이 추상적인 공간이라는 것을 이해했으니, 이제 구체적인 ‘칸’을 만들 차례였다. 그녀는 펜을 들고 ‘My VPC’라고 적힌 큰 사각형 안에 자신 있게 두 개의 선을 그어 공간을 셋으로 나눴다. 그리고 각각의 구획에 ‘1번 칸’, ‘2번 칸’, ‘3번 칸’이라고 이름 붙였다.
이 정도면 완벽해 보였다. 솔라는 만족스러운 표정으로 그림을 루나에게 보여주었다.
“언니, 이거 봐. 이렇게 ‘칸’을 만들면 되잖아. 웹서버는 1번 칸, 데이터베이스는 2번 칸, 이런 식으로. 굳이 복잡하게 IP 주소 범위를 또 쓸 필요가 있을까? 192.168.1.0/24 같은 건 그냥 이 ‘1번 칸’에 할당된 주소 목록이라고 내부적으로만 알면 되는 거 아니야?”
솔라의 주장은 명쾌했다. 그녀에게 CIDR은 여전히 주소의 개수를 정하는, 성가신 기술적 제약에 불과했다. 칸의 본질은 이름에 있다고 믿는 듯했다.
루나는 솔라의 그림을 잠시 들여다보더니, 고개를 끄덕이며 새로운 비유를 꺼냈다.
“음, 거대한 주차장을 구획으로 나눈 것 같네. 아주 좋아. 그럼 저기 ‘1번 칸’에 주차하러 온 차가 있다고 해보자. 그 차는 ‘1번 칸’이 어디 있는지 어떻게 알지?”
“당연히 입구에 안내도가 있거나, 바닥에 화살표로 ‘1번 칸 가는 길’이라고 표시되어 있겠지.”
솔라는 당연하다는 듯 대답했다. 하지만 루나는 고개를 저었다.
“네트워크에는 그런 친절한 안내원이나 표지판이 없어. 모든 통신은 ‘주소’를 보고 스스로 길을 찾아가야 해. ‘1번 칸’이라는 이름은 우리 사람한테나 의미가 있지, 데이터를 실어 나르는 라우터에게는 그냥 모르는 글자일 뿐이야.”
루나는 펜을 가져가 솔라의 그림 위에 설명을 덧붙이기 시작했다.
“이 전체 주차장의 주소가 192.168.0.0/16이야. 이건 ‘대한민국 서울시 강남구 테헤란로 123번지’ 같은 큰 주소지. 이제 192.168.1.5라는 주소를 가진 차 한 대가 주차장으로 들어왔다고 상상해 봐.”
루나는 ‘1번 칸’이라고 적힌 글자 옆에 작은 글씨로 192.168.1.0/24라고 썼다.
“우리가 ‘1번 칸’을 이렇게 CIDR 블록으로 정의하는 순간, 마법 같은 일이 벌어져. 주차장 입구의 라우터는 192.168.1.5라는 목적지를 보고 고민할 필요가 없어. ‘아, 이 주소는 192.168.1.0/24 범위 안에 있구나. 저쪽으로 보내면 되겠네.’ 하고 바로 길을 안내하는 거지.”
“잠깐, 어떻게 그렇게 바로 알아?”
“CIDR 표기법 자체가 그 정보를 담고 있거든. 라우터는 복잡한 계산을 통해 192.168.1.5가 192.168.1.0부터 192.168.1.255까지의 주소를 사용하는 구역에 속한다는 걸 순식간에 알아채. 만약 솔라가 그냥 ‘1번 칸’이라고만 했다면? 라우터는 ‘1번 칸이 뭔데?’ 하면서 데이터를 어디로 보내야 할지 몰라 그냥 버릴 거야.”
그제야 솔라의 눈이 동그래졌다. 그녀는 ‘1번 칸’이라는 자신의 라벨과 192.168.1.0/24라는 CIDR 블록을 번갈아 쳐다보았다. 하나는 인간을 위한 이름이었고, 다른 하나는 기계를 위한 지도였다.
“아! 그럼 이 CIDR 블록이 그냥 IP 주소 몇 개를 쓸 수 있냐는 크기를 정하는 게 아니었구나. 이 자체가 네트워크 라우터들이 알아볼 수 있는 ‘논리적인 구역’의 주소, 이정표 그 자체였던 거야! ‘1번 칸’은 그냥 이름표지만, 192.168.1.0/24는 ‘이쪽 길로 가시오’라는 길 안내까지 포함된 거네.”
솔라는 자신의 그림에 있던 ‘1번 칸’, ‘2번 칸’이라는 글자를 펜으로 지웠다. 대신 그 자리에 192.168.1.0/24, 192.168.2.0/24라고 고쳐 적었다. 이제 더 이상 단순한 칸막이가 아니었다. 각자의 명확한 주소 체계를 가진, 독립적인 논리적 경계가 그어진 것이다.
“맞아. 우리는 서브넷을 만들면서 단순히 칸을 나누는 게 아니라, 데이터가 다닐 ‘길’의 경계를 설정하는 거야. 각 서브넷 CIDR은 독립적인 라우팅 정책을 가질 수 있는 최소 단위가 돼. 그래서 웹서버가 있는 서브넷은 외부와 통신하게 하고, 데이터베이스 서브넷은 내부에서만 통신하게 막는 식의 제어가 가능해지는 거지.”
이제 솔라는 서브넷 생성 화면의 CIDR 입력창이 다르게 보였다. 그곳은 단순히 숫자를 채워 넣는 칸이 아니라, 내 네트워크의 교통 흐름을 설계하는 첫 번째 설계도면이었다.
자신감이 붙은 솔라는 의기양양하게 말했다.
“좋아. 그럼 이제 이해했어. VPC라는 큰 땅을 CIDR로 논리적인 구획까지 나눴어. 길도 다 냈고 주소도 붙였으니, 이제 진짜로 이 칸 안에 서버를 배치할 수 있는 거지?”
솔라의 손가락은 ‘생성’ 버튼을 누를 준비를 마쳤다. 하지만 루나는 솔라의 노트북 화면의 다른 곳을 가리켰다.
“거의 다 왔어. 그런데 그 논리적인 구획이 실제로 어디에 ‘물리적으로’ 지어질지 정해야지. 저기 봐. ‘가용 영역’을 선택하라고 하잖아.”
3장: 가용 영역: 물리적 안전지대를 만들다
솔라의 자신감 넘치는 손가락이 ‘생성’ 버튼 위에서 멈칫했다. 방금 전까지 그냥 숫자의 나열로 보였던 CIDR 블록이, 이제는 데이터가 다닐 길을 내는 설계도처럼 느껴졌다. A4 용지 위에는 그녀가 직접 그린, 논리적인 경계가 선명한 네트워크 구획들이 자리 잡고 있었다. 192.168.1.0/24, 192.168.2.0/24. 완벽한 논리적 분할이었다.
하지만 루나의 손가락은 솔라의 노트북 화면에서 다른 곳, ‘가용 영역(Availability Zone)’이라고 적힌 드롭다운 메뉴를 가리키고 있었다. 메뉴 안에는 ap-northeast-2a, ap-northeast-2c, ap-northeast-2d 같은 생소한 이름들이 나열되어 있었다. 솔라는 잠시 망설이다 대수롭지 않다는 듯 말했다.
“아, 저거. ‘가용 영역’. 논리적인 구획도 다 나눴고 길도 냈으니, 이제 어디에 놓을지 정하는 건가 보네. 그냥 서울 안의 여러 지역 중 하나를 고르는 느낌인데… 2a나 2c나 무슨 차이가 있어? 그냥 첫 번째 걸로 선택하면 되는 거 아니야?”
솔라에게 ‘가용 영역’은 그저 리전을 좀 더 잘게 쪼갠 지역명 정도로 보였다. 192.168.1.0/24라는 논리적 주소만 있으면 충분하다고 생각했기에, 물리적 위치는 부가적인 정보, 심지어는 번거로운 제약처럼 느껴졌다.
루나는 “잠깐,” 하고 솔라의 손을 가볍게 제지했다. 그리고는 아까 사용했던 A4 용지를 다시 가져왔다. 솔라가 그려놓은 VPC 사각형과 그 안의 서브넷 CIDR 구획들은 그대로 둔 채, 용지의 넓은 여백에 커다란 직사각형 두 개를 나란히, 하지만 뚜렷한 간격을 두고 그렸다.
“좋아. 방금 우리가 만든 논리적인 주소 구획들이 살 집을 지어보자. 여기 이 두 개의 사각형은 서로 멀리 떨어진 별개의 건물이라고 생각해 봐. A동 건물, C동 건물. 각각 독립된 전원과 냉방 시설, 통신망을 가지고 있어. 한쪽에 불이 나거나 정전이 되어도 다른 쪽은 전혀 영향을 받지 않아.”
루나는 왼쪽 건물에 ‘A동 (ap-northeast-2a)’, 오른쪽 건물에 ‘C동 (ap-northeast-2c)’이라고 적었다.
“자, 이제 솔라가 설계한 그 소중한 서브넷들을 이 건물들 안에 배치해 볼래? 웹서버를 위한 192.168.1.0/24 구획과 데이터베이스를 위한 192.168.2.0/24 구획을 어디에 두고 싶어?”
솔라는 잠시 고민했다. 관리하기 편하게 한곳에 모아두는 게 좋겠다는 생각이 들었다. 그녀는 펜을 들어 A동 건물 그림 안에 두 개의 서브넷 CIDR(192.168.1.0/24, 192.168.2.0/24)을 모두 그려 넣었다.
“음… 이렇게 A동에 같이 두면 관리하기 편하지 않을까? C동은 나중에 필요하면 쓰고.”
루나는 고개를 끄덕이며 솔라가 그린 그림을 바라봤다. 그리고는 붉은색 펜을 들어, 솔라가 서브넷들을 배치한 ‘A동’ 건물 전체에 커다랗게 X표를 그었다.
“어느 날 밤, A동 데이터센터로 들어가는 주 전력선이 폭우로 유실됐어. 건물 전체가 마비됐네. 이제 솔라의 서비스는 어떻게 될까?”
순간 솔라의 얼굴이 굳어졌다. A동 안에 그려 넣었던 웹서버와 데이터베이스 구획이 붉은 X표 아래 갇혀 있었다. 논리적으로 아무리 완벽하게 길을 내고 주소를 붙였더라도, 그 ‘논리’가 담겨 있는 물리적인 그릇이 깨져버리자 모든 것이 무용지물이 되는 순간이었다. C동 건물은 아무런 상처 없이 멀쩡했지만, 그 안에는 아무것도 없었다.
“아…!”
짧은 탄식이 솔라의 입에서 터져 나왔다. 그녀는 ‘가용 영역’이라는 이름 뒤에 숨겨진 거대한 의미를 그제야 깨달았다. 그것은 단순히 리전의 하위 분류가 아니었다. 재해나 장애 상황에서도 서비스를 지켜내기 위한, 물리적으로 격리된 안전지대였다.
“그럼… 이렇게 했어야 했네.”
솔라는 떨리는 손으로 펜을 다시 잡았다. 그리고 처음부터 다시 그리듯, 웹서버용 서브넷(192.168.1.0/24)은 A동 건물에, 데이터베이스용 서브넷(192.168.2.0/24)은 C동 건물에 나눠서 그렸다. 더 나아가 웹서버용 서브넷을 하나 더 만들어(192.168.3.0/24), 그것 역시 C동에 배치했다. 이제 A동 건물이 통째로 마비되더라도, C동에 있는 웹서버와 데이터베이스가 살아남아 최소한의 서비스를 이어갈 수 있었다.
“그래. 바로 그거야. ‘가용 영역’을 선택하라는 건, ‘네 논리적인 구획을 어느 안전지대에 둘래?’ 하고 묻는 거였어. 하나의 물리적 위치에 모든 걸 몰아넣는 위험을 피하고, 의도적으로 분산시켜서 서비스의 생존 가능성을 높이는 거지. 이게 바로 고가용성의 첫걸음이야.”
이제 솔라는 노트북 화면의 ‘가용 영역’ 드롭다운 메뉴를 완전히 다른 눈으로 바라보았다. ap-northeast-2a, ap-northeast-2c는 더 이상 의미 없는 문자열이 아니었다. 하나가 무너져도 다른 하나가 버텨줄, 내 서비스의 생명줄을 나눠 담을 수 있는 튼튼한 물리적 고립 단위들이었다.
“와… 알겠다. 서브넷을 만든다는 건, 단순히 IP 주소 범위를 나누는 논리적 분할에서 끝나는 게 아니었어.”
솔라는 A4 용지 위에 그려진 두 개의 그림을 번갈아 보았다. 하나는 CIDR로 논리적 경계를 그린 네트워크 지도, 다른 하나는 가용 영역으로 물리적 안전지대를 표시한 건물 배치도였다. 지금까지 이 둘은 별개의 것처럼 느껴졌다.
“논리적인 주소 체계(CIDR)와 물리적인 안전지대(가용 영역)… 서브넷은 이 두 가지를 합쳐서, 비로소 ‘A동 건물에 있는 101호실’처럼, 실제로 내 서버가 존재할 수 있는 진짜 ‘자리’를 만드는 거구나!”