오래전에 구글 클라우드에서 매일이 2개 왔는데 firebase functions 를 v2로 업그레이드 해 달라는 것이고, node 버전을 올려달라는 것이다. 귀찮아서 미루다가 마감이 임박하여 정리한다.
v2 업데이트는 https://firebase.google.com/docs/functions/2nd-gen-upgrade?hl=ko
index.js 를 참고하면 되고,
node rumtime 업데이트는 https://cloud.google.com/functions/docs/runtime-support?hl=ko 를 참고한다. function 1개를 쓰고 있는데, 만든지 너무 오래되었다. 오랫동안 아무런 문제없이 잘 실행되었다는게 놀랍다. 오래되서 어떻게 개발하고 배포했는지 잘 기억나지 않는다. 이 문서는 3년 뒤에 다시 할 때 참고하기위한 문서일뿐.. 그때되면 다시 https://firebase.google.com/docs/functions/get-started?hl=ko&gen=2nd 여기부터 될 듯..
2020년 11월에 배포된게 마지막이고, 하루에 600번 정도 호출되고, Nodejs 12기반이다.
NODE 런타임 업그레이드
node 12는 2025년 1월 30에 사용이 중단된다. node 22는 2027년 10월까지 사용할 수 있으므로 22로 업그레이드 한다.
functions/package.json 에서 22로 변경
"engines": {
"node": "22"
},
테스트를 위해서
# 노드 설치
nvm install 22
# 노드 사용
nvm use 22
# node를 바꿨으므 CLI 다시 설치
npm install -g firebase-tools
node 22는 경고가 있다. 하지만 punycode는 사용하지 않으므로 무시한다.
(node:95266) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
functions/v2 마이그레이션
# 기존 소스에 있던건데 참조하지 않기에 불필요한 package 제거
npm remove firebase-admin
# functions는 문서에는 4.3.0으로 되어있지만 최신으로 설치
npm install --save firebase-functions@latest
index.js 를 가이드게 맞게 수정한다.
로컬 테스트
https://firebase.google.com/docs/functions/local-emulator?hl=ko
에뮬레이터 : firebase emulators:start (오류가 있다면 firebase init functions 를 다시하되 package.json과 index.js 는 덮어쓰지 말 것. 프로젝트가 너무 오래됬나보다. ) 실행하면 , 주소와 포트가 포함된 URL이 보인다. 에뮬레이터를 잘 만들었다.
리얼 배포
firebase deploy --only functions
firebase deploy --only functions
...
...
Error: [checkRefund(us-central1)] Upgrading from GCFv1 to GCFv2 is not yet supported. Please delete your old function or wait for this feature to be ready
이런 에러가 뜨는데 GCFv1이 Google Cloud Functions v1의 약자인 것 같다. 즉 v1에서 v2로 자연스러운 업그레이드가 불가능하다는 뜻이다. 따라서 먼저 기존 function을 지우고 다시 배포하면 된다. 그 동안 물론 서비스가 안된다. 흔히 말하는 무중단 배포가 안 된다는 뜻이다. 하지만 제공하는 기능이 무중단배포가 필수가 아니므로 삭제후 배포했다. 잠깐 쫄리기는 했다.
리얼 테스트
에뮬레이터로 테스트 하기는 했지만 리얼에서 한 번 더 한다. 로그 보기로 두 가지를 확인할 수 있다. Remote IP로 내 IP에서 호출된 것임을 확인하고 http 코드 200으로 정상 동작을 확인한다.