많고 많던 외주를 거의 다 마무리하고, 잠깐 시간이 남아서 미루고 미루던 파트너사 서비스의 배포 시스템을 만들었다. 이미 2년이 넘게 개발 & 운영뿐만 아니라 리뉴얼도 여러 번 거치고 고도화까지 하고 있으니, 외주라기보다는 파트너에 가깝다.
어쨌든 매번 내가 직접 GCP 콘솔에 접속하여 배포하다가, 언젠가 꼭 배포 시스템에 포함시키겠다고 했는데 드디어 이뤘다.
자세한 내용은 회사 블로그인 라이브러리에서 다루고, 개발하면서 겪은 함정 하나를 공유하려고 한다.
파트너사 서비스들은 쿠버네티스를 사용하지 않고, 인스턴스 그룹을 사용하고 있다. 인스턴스 그룹을 운영하기 위해서는 VM, 스냅샷, 이미지, 인스턴스 템플릿, 인스턴스 그룹 이렇게 총 4개의 서비스를 활용해야 한다. 즉, 자동화한다는 것은 기준 VM의 디스크를 토대로 앞서 4개를 자동으로 만들어 배포해야 한다는 뜻이다.
다행히 GCP는 친절하게 모든 GUI의 기능에 CLI로 변환하는 버튼을 달아놨다. 해당 버튼을 누르면 현재 화면에서 하려는 동작을 CLI 명령어(gcloud)를 사용하여 실행하려면 작성해야 하는 명령어를 그대로 보여준다.
그 중, 오늘 문제가 되었던 기능은 인스턴스 템플릿이었다. 명령어를 띄우면 많은 옵션이 존재하는 데 그 중 네트워크 인터페이스 항목이 있다. GCP가 제공했던 명령어에는
--network-interface=network=default,network-tier=PREMIUM
라고, 되어있다. 곧이곧대로 믿고 적용했더니 인스턴스 그룹에 접속 못하는 문제가 발생했는데, 확인해보니 외부 IP가 생성되지 않았다.
이럴 땐 공식 문서를 보면 대개 정답이 있으니,
address
Assigns the given external address to the instance that is created. Specifying an empty string will assign an ephemeral IP. Mutually exclusive with no-address. If neither key is present the instance will get an ephemeral IP.
이런 설명이 있었다. 즉 empty string을 명시해야 임시 IP가 할당된다는 것이다. 하지만 기본적으로 생성되는 네트워크 인터페이스는 이러한 속성이 없다. 이 부분이 문제인 이유는, 별도로 추가 설정하지 않고 GUI에서 생성하면 임시 IP가 할당되기 때문에 그렇다.
--network-interface=network=default,network-tier=PREMIUM,address=
이렇게 address를 추가로 설정하니 문제없이 임시 IP가 할당되고, 배포 시스템을 완성할 수 있었다.
요새는 Github의 Actions와 같이 CI/CD 서비스를 많이 이용하다 보니 직접 배포 시스템을 만드는 곳이 별로 없는 것 같지만, 덕분에 시스템을 조금 더 이해할 수 있게 되었다.
개발하다 보면 “그래도 구글이 만들었는데”, “그래도 네이버가 만들었는데”와 같이 맹목적으로(?) 신뢰하는 때가 있다. 사실 소프트웨어는 언제든 버그나 문제가 발생할 수 있는 것인데, 조금 더 유연한 마음을 가져야겠다.