Cloud_Functions_배포_안됨_문제_해결 - boostcampwm-2024/and04-Nature-Album GitHub Wiki

💥 Cloud Functions 배포 안됨 문제 해결

❓ 문제 정의

Firebase Cloud Functions를 배포하려고 했지만, 배포가 실패하거나 배포 중 오류가 발생하는 문제가 발생했다. Firebase Functions의 배포 과정에서 문제가 발생하면, firebase deploy 명령어를 실행해도 정상적으로 함수가 배포되지 않거나, 배포 중 오류가 발생해 실패하게 된다.

  • 정말 많은 일이 있었다.

image

💡 문제 원인 및 해결 방법

1 파서 오류(Parsing Error)

배포 중 발생하는 파서 오류(Parsing Error)는 종종 package.json 파일의 설정 문제로 발생한다. 이는 종속성이나 스크립트 설정에 오류가 있을 때 발생할 수 있다.

해결 방법

  1. package.json 수정:
    • package.json에서 lint 스크립트를 수정하여 문제를 해결한다. 예를 들어, eslint . 대신 eslint로 수정한다.

https://nadiya-h.tistory.com/14

  • firebase / pakage.json
{....
  "scripts": {
    **"lint": "eslint .",
    ...**
}

  • 아래와 같이 변경 "lint": "eslint .", ⇒ "lint": "eslint",
{...
  "scripts": {
    "lint": "eslint",
  ...
  }
  1. 배포 다시 시도:
    • package.json 파일을 수정한 후, 배포를 다시 시도한다.

결과: 이건 해결했지만 다른 문제 발생


2. IAM 권한 문제

배포 과정에서 서비스 계정에 필요한 권한이 부족할 경우 배포에 실패하는 문제가 발생할 수 있다. 특히 Firebase CLI를 통해 Cloud Functions를 배포할 때, 적절한 IAM(Identity and Access Management) 권한이 설정되지 않으면 Firebase가 프로젝트의 서비스 계정에 필요한 권한을 추가할 수 없어서 배포가 실패한다.

해결 방법

  1. Google Cloud Console에서 IAM 권한 확인:
    • Google Cloud Console에서 IAM 권한을 확인하고, Firebase Functions를 배포하는 데 필요한 권한이 프로젝트의 서비스 계정에 부여되어 있는지 확인한다.
    • 서비스 계정에 roles/firebase.admin 권한을 추가하여 배포 권한을 부여한다.
  2. Firebase CLI로 IAM 권한 부여:
    • Firebase CLI에서 gcloud 명령어를 통해 gcloud iam 명령어를 사용하여 필요한 IAM 권한을 추가할 수 있다.
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member=serviceAccount:[email protected] \
  --role=roles/firebase.admin

  • 해당 사항에 대해서 이렇게 하면 된다고는 하지만 IAM 권한 확인을 했을 때 잘 확인이 되지 않아서 이 부분은 패스했다.

결과 : 실패


3. Node.js 버전 불일치 문제

배포할 Firebase Functions 코드가 특정 Node.js 버전에 의존성이 있을 때, 로컬 개발 환경과 배포 환경의 Node.js 버전이 일치하지 않으면 배포가 실패할 수 있다. Firebase Cloud Functions는 Node.js 16을 기본으로 지원하므로, 사용 중인 Node.js 버전이 16 이상이어야 한다.

해결 방법

  1. Node.js 버전 확인:
    • node -v 명령어로 현재 사용 중인 Node.js 버전을 확인한다.
  2. Node.js 버전 업데이트:
    • Firebase에서 요구하는 Node.js 버전과 일치하도록 Node.js를 업데이트한다. Firebase Functions는 기본적으로 Node.js 16 이상을 지원한다.
    • Node.js 버전 관리 도구(nvm)를 사용하여 필요한 버전을 설치하고, nvm use 명령어로 버전을 변경할 수 있다.
nvm install 16
nvm use 16

  1. Firebase Functions의 package.json 확인:
    • package.json 파일 내에서 engines 필드를 확인하고, Node.js 버전을 지정한다. 예를 들어, Firebase Functions는 node: 18과 같은 특정 버전을 요구할 수 있으므로, 이를 맞춰준다.
{
  "engines": {
    "node": "18"
  }
}

  1. 열심히 다 바꿔보고 배포 다시 시도:
    • Node.js 버전을 수정한 후 배포를 다시 시도한다.

결과 : 실패


4. Firebase CLI 및 종속성 업데이트 문제

Firebase CLI나 Firebase Functions 관련 종속성의 버전 불일치로 인해 배포에 실패할 수 있다. Firebase CLI가 최신 버전이 아니면, Firebase Functions의 새로운 기능이나 배포 관련 문제가 발생할 수 있다.

해결 방법

  1. Firebase CLI 업데이트:
    • Firebase CLI를 최신 버전으로 업데이트한다.
npm install -g firebase-tools

  1. Firebase Functions 종속성 업데이트:
    • Firebase Functions 관련 종속성을 최신 버전으로 업데이트한다. firebase-adminfirebase-functions 라이브러리의 버전이 맞지 않으면, 배포 과정에서 충돌이 발생할 수 있다.
npm install firebase-admin@latest firebase-functions@latest

  1. 배포 다시 시도:
    • Firebase CLI와 종속성을 업데이트한 후 배포를 다시 시도한다.

결과 : 실패


5. 배포 실패 시 로그 확인

배포 과정에서 문제가 발생하면, Firebase CLI에서 배포 실패 로그를 확인하여 문제의 원인을 파악할 수 있다.

해결 방법

  1. 배포 로그 확인:
    • firebase deploy 명령어로 배포를 시도한 후, 배포 로그를 확인하여 오류 메시지를 파악한다.
firebase functions:log

  1. 오류 메시지 분석:
    • 오류 메시지에서 제공하는 정보로 문제를 분석하고, 해당 문제를 해결하기 위한 추가 조치를 취한다.
    • 그래서 한 것들이 위의 과정들이다.

결과 : 실패


6. Firebase Functions 초기화 및 Helloworld 테스트

배포 오류를 해결하기 위해 Firebase Functions의 설정을 전부 초기화하고, 기본적인 Helloworld 기능부터 테스트했다. Firebase Functions 초기화를 위한 설정을 다시 진행하고, Firebase Functions가 정상적으로 배포되고 작동하는지 확인했다.

해결 방법

  1. Firebase Functions 초기화:
    • Firebase Functions를 완전히 초기화하고, firebase init functions 명령어를 실행하여 기본 설정을 진행했다.
  2. Helloworld 테스트:
    • Firebase Functions의 index.js에 기본적인 Helloworld 기능을 추가하여 배포가 정상적으로 이루어졌는지 확인했다.
  3. 배포 성공:
    • firebase deploy 명령어로 배포를 시도하고, 배포가 성공적으로 완료되었음을 확인했다.

결과: 배포 성공!!


💡 결론

배포가 실패할 경우, IAM 권한 문제, Node.js 버전 불일치, Firebase CLI 또는 종속성 문제 등 다양한 원인이 있을 수 있다. 각 문제에 대해 적절한 해결 방법을 적용한 후 배포를 다시 시도하면 문제가 해결된다. 특히, 파서 오류(Parsing Error)는 종종 package.json 설정에 문제가 있기 때문에 해당 부분을 확인하고 수정하는 것이 중요하다. FCM을 통해 푸시 알림을 정상적으로 보내기 위해서는 Firebase Functions의 배포가 성공적으로 이루어져야 한다. 만약 어떠한 것들을 시도해보아도 안된다면 나처럼 다 초기화 하고 처음부터 천천히 다시 도전해보는 것을 추천한다.