Vercel DB 통합: 비밀번호를 몰라도 되는 이유
하루에 관리형 Postgres 두 개를 배포에 붙였습니다. 하나는 비밀번호를 재설정하고 연결 문자열을 손으로 옮겨 적었고, 다른 하나는 비밀번호를 끝내 보지 않았습니다. 후자가 더 빨랐고, 무엇보다 틀릴 자리가 없었습니다.
사고가 난 쪽은 손으로 옮기는 구성
먼저 한 쪽은 손으로 옮기는 구성이었습니다. 콘솔에서 비밀번호를 재설정하고, 연결 문자열을 받아 자격증명 저장소에 넣고, 거기서 배포처로 밀었습니다. 단계마다 사람이 값을 보고 옮깁니다.
배포하니 500 이 났습니다. 계정 이름이 틀렸습니다. 직결로 붙던 시절의 계정을 풀러 URL 에 그대로 넣었는데, 풀러는 계정 이름의 접미사로 어느 프로젝트인지 판단합니다. 접미사가 없으니 인증까지 가지도 못했습니다.
비밀번호는 맞았습니다. 호스트도 포트도 맞았습니다. 틀린 것은 조립이었습니다.
그 단계 자체가 없는 통합 쪽
다른 한 쪽은 배포 플랫폼과 데이터베이스 사이에 공식 통합이 있었습니다. 붙일 때 한 번 권한을 승인하고 나면, 데이터베이스 쪽이 연결 문자열을 배포처의 환경변수로 직접 씁니다.
환경변수 목록을 열어 보니 이런 이름들이 이미 들어와 있었습니다.
DATABASE_URL 풀러 엔드포인트
DATABASE_URL_UNPOOLED 직결 엔드포인트
POSTGRES_URL, PGHOST, PGUSER, PGPASSWORD, …제가 만든 것이 하나도 없습니다. 그래서 조립할 것도 없고, 조립을 틀릴 수도 없었습니다.
"몰라도 된다" 가 아니라 "알 이유가 없다"
비밀번호는 콘솔에 가면 언제든 볼 수 있습니다. 접근이 막힌 것이 아닙니다.
차이는 사본이 생기느냐 입니다. 값을 한 번 옮겨 적는 순간 원본과 사본이 둘이 되고, 둘은 언젠가 갈립니다. 비밀번호를 바꿨는데 한 곳만 고쳤다거나, 호스트를 바꿨는데 계정 표기를 그대로 뒀다거나 하는 식으로요. 통합은 그 사본을 만들지 않습니다.
같은 이유로 비밀번호를 교체할 때도 할 일이 없습니다. 데이터베이스 쪽에서 갈면 통합이 배포처를 따라 갱신합니다. 손으로 옮기는 쪽은 교체할 때마다 옮기는 절차가 한 번씩 더 생기고, 그 절차마다 틀릴 기회가 한 번씩 생깁니다.
대가는 주인이 둘이 된다는 것
값의 정본을 한곳에 모으는 중이었기 때문에, 이 구조는 원칙과 어긋납니다. 다른 값들은 자격증명 저장소가 주인인데 데이터베이스 URL 만 통합이 주인입니다.
그래서 대조를 돌리면 그 둘이 늘 "저쪽에만 있음" 으로 뜹니다. 처음에는 빠뜨린 것처럼 보이는데 정상 상태입니다. 다만 그 표시가 눈에 익으면, 진짜로 빠진 값이 생겼을 때 못 알아채게 됩니다. 이게 실질적인 비용이라고 봅니다.
그리고 위험한 명령이 하나 생깁니다. 저쪽에만 있는 값을 지워 정본과 일치시키는 옵션인데, 이 구성에서 그걸 돌리면 통합이 넣어 둔 데이터베이스 URL 이 지워집니다. 쓰는 CLI 가 통합 소유 변수를 이름 패턴으로 알아보고 보호하고 있었지만, 그 목록에 DATABASE_URL 은 없었습니다. 이름이 너무 일반적이라 어느 쪽 것인지 이름만으로는 알 수 없기 때문입니다.
그래서 어느 쪽을 고를까
저는 통합이 있으면 쓰는 쪽을 고르겠습니다. 사람이 값을 옮기는 단계가 사라지는 이득이, 주인이 둘이 되는 불편보다 큽니다. 오늘 사고가 난 곳이 정확히 사람이 옮긴 쪽이었다는 점도 그 판단을 굳혔습니다.
다만 그 결정을 적어 두어야 합니다. "이 값은 여기서 관리하지 않는다" 가 문서에 없으면, 다음 사람이 빠진 값으로 보고 채워 넣습니다. 그러면 주인이 둘인 상태가 아니라 값이 둘인 상태가 되고, 그때부터는 어느 쪽이 진짜인지 아무도 모릅니다.
함께 읽기
- ERR_REQUIRE_ESM: 같은 커밋인데 새로 만든 배포만 500이 난 이유블로그 목록에는 글 297편이 그대로 나왔습니다. 그중 하나를 누르면 500이었습니다. 문서 사이트도 똑같이 목록은 정상이고 문서 본문만 죽었습니다. 두 서비스 모두 마지막 커밋이 일주일 전이었고, 그 사이 코드를 건드린 사람은 없었습니다.
- Vercel Web Analytics 요금과 설치: Enable 버튼만으로는 안 되는 이유회사 홈페이지의 방문자 수를 Vercel 대시보드에서 보려고 Web Analytics를 켰습니다. Enable을 누르고 잠시 기다렸는데 지표가 0이었습니다. 스크립트를 넣어야 한다는 걸 그때 알았고, 넣고 배포한 뒤에도 한 번 더 헷갈렸습니다. 그 과정을 정리했습니다.
- Vercel 재배포 직후 500: 재배포 탓인지 값 탓인지 가르는 순서운영에 올릴 새 커밋은 없었습니다. main 과 develop 이 같은 커밋이었고, 마지막 운영 배포는 그 커밋이 올라간 지 4분 뒤에 만들어져 있었습니다. 그래도 한 번 다시 올려 두자고 해서 vercel redeploy 로 같은 배포를 다시 만들었습니다. 2분 만에 Ready 가 떴고 도메인에 붙었습니다.
- Cloudflare 존 이전과 R2: 커스텀 도메인이 따라오지 않는 이유이미지가 하나도 안 나온다는 말을 듣고 열어 봤습니다. 이미지 원본을 서빙하는 호스트 세 개가 DNS 에서 통째로 사라져 있었습니다. dig 가 아무것도 돌려주지 않았습니다.
- docker builder prune 상한: 왜 남의 캐시까지 깎일까?한 서비스의 개발 배포를 다른 호스트로 옮기는 중이었습니다. 러너를 새로 붙이고, 환경변수 출처를 바꾸고, 이제 워크플로를 켜기만 하면 되는 참이었습니다. 그런데 배포 스크립트 마지막에 있는 한 줄에서 멈췄습니다.