Skip to content
isdnetworks
Go back

테스트 서버는 운영에 닿을 수 없다는 것을 차단 장치 8항으로 증명한 뒤에야 열었다

넘겨받은 커머스에는 시험할 곳이 없었다. 그래서 테스트 서버를 새로 세우기로 했고, 이때 가장 먼저 정한 것은 「언제 열 것인가」였다. 테스트 서버가 실수로 운영 결제를 부르거나 운영 고객에게 문자를 보내면, 시험 환경이 곧 사고의 원천이 된다. 그래서 운영에 닿을 수 없다는 것을 장치마다 증명한 뒤에만 열기로 했다.

Table of contents

Open Table of contents

배경 — 시험할 곳이 없던 시스템

dev 프로젝트를 실측한 결과 상시로 도는 컴퓨트는 0 이었고, dev API 주소 뒤에는 서버가 없었다. 「쓸 때만 띄우는 구조」로 바꿀 것도 없었지만, 거꾸로 말하면 운영과 같은 코드를 운영 밖에서 돌려 볼 곳이 하나도 없다는 뜻이었다. 결제·문자·앱 푸시가 모두 실제 고객에게 닿는 시스템에서, 시험할 곳이 없으면 모든 수정이 운영에서 처음 검증된다.

판단 — 시험할 곳을 새로 세우는 방식

결정은 dev 프로젝트에 별도 GKE 클러스터를 두는 쪽이었다. 운영 클러스터에 네임스페이스만 나눠 두는 방식과 견주면 그쪽이 비용은 적다. 반면 시험 파드가 운영 서비스 계정·네트워크·설정을 공유하게 된다. 별도 클러스터가 맞다고 본 이유는 테스트 서버의 첫 요건이 「운영을 못 부른다」였기 때문이다. 대가는 클러스터와 Cloud NAT 의 월 비용이 새로 생긴다는 점이다.

구성은 다음과 같다.

API 이미지는 운영 이미지를 복사하는 대신 dev 용으로 따로 빌드했다. 운영 이미지에는 「테스트 서버면 결제 승인 앞에서 멈춘다」 같은 관문이 없기 때문이다.

검증 — 운영 차단 장치 8항

테스트 서버를 여는 조건은 차단 장치 8항이 대조군까지 통과하는 것이었다.

#장치결과
①dev 서비스 계정 16개가 운영 프로젝트 IAM 에 0줄통과
②운영 projectId 로 띄운 파드가 기동 단계에서 exit 1 로 거부통과
③dev 파드에서 운영 주소 6곳이 모두 403, 결제 VM 방화벽도 dev 출구 IP 거부통과
④dev 문자 발송 1건이 「발송 안 함」, 운영 발송 기록은 전후 같음통과
⑤결제·선물 주문·Slack 이 관문에서 TEST_SERVER_BLOCKED통과
⑥허용 밖 출구에서 dev 호스트 403, 오리진 LB 직접 접속은 시간초과통과
⑦운영 Realtime Database 호스트 차단통과(단서 있음)
⑧운영 클러스터 네임스페이스 15개에 -dev 0, configmap 의 projectId 모두 운영 값통과

대조군은 항마다 붙였다. 사무실에서 같은 운영 주소를 부르면 열리는지, 운영 projectId 가 아니면 파드가 Ready 가 되는지, 운영 발송 기록에 정상 발송 줄이 보이는지를 함께 봤다. 마지막 배포 뒤에는 운영 백오피스 파드 네 개의 시작 시각과 재시작 0, 이미지 digest 가 그대로인 것을 확인했고, dev 출구 IP 가 운영 존에 낸 요청이 0 인 것도 쟀다. 같은 조회가 배포 전 구간의 시험 요청 1건은 잡아냈다.

영향 범위 — 통과 표 옆의 단서

통과 표만 남기면 무엇을 못 쟀는지가 사라지므로 단서도 그대로 적었다. ⑦은 dev 에만 있는 주문 고객 11명은 운영에 0 이지만, 나머지 32명은 예전 사본이라 운영에도 같은 uid 가 있어 이 방법으로는 가를 수 없다. Firestore 는 호스트가 공용이라 관문이 막지 않고, 막는 근거는 ①의 IAM 이다. 그리고 iOS 의 dev 빌드에는 Debug 에도 운영 결제창 주소가 고정돼 있어, 그 자리를 나누기 전까지 iOS dev 빌드로 결제 시험을 하지 않는다.

결과 — 개방 조건이 지킨 운영 경계

정리


Share this post on:

Previous Post
넘겨받은 고객 명단에는 광고 수신 동의가 따라오지 않는다는 것에서 설계를 시작했다
Next Post
새 개발 리더에게 넘기는 인계는 그 사람이 정할 것부터 쓰고, 업무 보드는 진척률이 도는 단위로 바꿨다