Firebase Hosting 배포 중 serviceusage.googleapis.com 403 해결
このコンテンツはまだ日本語訳がありません。
Issue
섹션 제목: “Issue”GitHub Actions에서 Firebase Hosting을 배포하던 중 firebase deploy가 다음 403 에러로 실패했다.
Request to https://serviceusage.googleapis.com/v1/projects/***/services/firebasehosting.googleapis.com had HTTP Error: 403, Permission denied to get service [firebasehosting.googleapis.com]해당 리포지토리는 GitHub Actions에서 GCP Workload Identity Federation의 배포용 서비스 계정을 인증한 다음, 아래 명령으로 Firebase CLI를 설치하고 Hosting에 배포(firebase deploy --only hosting)한다.
npm install -g firebase-tools이때, Firebase CLI 설치 명령에 버전을 지정하지 않기 때문에 실행 시점의 최신(latest) firebase-tools가 설치된다. 따라서 GitHub Actions를 수정하지 않아도 배포에 쓰이는 CLI 버전이 바뀔 수 있다.
Cause
섹션 제목: “Cause”이번 에러는 serviceusage.googleapis.com을 통해 배포 대상 프로젝트의 Firebase Hosting API (firebasehosting.googleapis.com) 상태를 조회하는 과정에서 발생했다. 따라서 아래의 2가지를 먼저 확인해야 했다.
- Firebase Hosting API가 활성화되어 있는지
- GitHub Actions가 사용하는 GCP Workload Identity Federation의 배포용 서비스 계정에 Firebase Hosting API 상태를 조회할 수 있는 권한이 있는지
직접적인 실패 이유는 firebase-tools 15.34.1의 변경이었다. 이 버전부터 Hosting 배포와 관련된 명령을 실행하기 전에 Firebase Hosting API가 활성화되어 있는지 확인하는 처리가 추가됐다.
현재의 Github Actions의 워크플로는 배포를 할 때마다 npm install -g firebase-tools로 매번 최신 버전을 설치하고 배포를 한다. 따라서 워크플로 파일을 수정하지 않았음에도 Firebase CLI가 15.34.1 이상의 버전이 설치되어 배포를 했다.
가장 최근에 성공한 배포는 약 한 달 전(2026.09.27)이었다. 그 당시에 사용한 버전에는 Firbase Hosting API 상태를 조회하는 과정이 없어서 문제없이 배포가 되었던 것이다.
지금 사용하고 있는 GCP Workload Identity Federation의 배포용 서비스 계정에는 Firebase Hosting 관리자와 API 키 뷰어 역할(Role)만 있었고, Firebase Hosting API 상태를 조회하는 서비스 사용량 뷰어 역할은 없었다. 따라서 권한 부족으로 인한 에러가 발생한 것이다. (Firebase CLI 저장소에도 15.34.0에서는 성공하고 15.34.1에서 동일한 403이 발생 했다는 재현 보고가 있었다.)
Resolution
섹션 제목: “Resolution”1) 대상 프로젝트와 Hosting API 상태 확인
섹션 제목: “1) 대상 프로젝트와 Hosting API 상태 확인”Google Cloud 콘솔에서 배포 대상 프로젝트를 선택하고 Firebase Hosting API (firebasehosting.googleapis.com)가 활성화되어 있는지를 확인했다. 사실 Firebase 콘솔에서 프로젝트를 생성했다면 생성 당시에 기본적으로 활성화가 된다. 따라서 당연하게도 활성화되어 있었다.
2) 배포용 서비스 계정에 조회 권한 추가
섹션 제목: “2) 배포용 서비스 계정에 조회 권한 추가”GitHub Actions에서 사용하는 GCP Workload Identity Federation의 배포용 서비스 계정에 프로젝트 수준의 서비스 사용량 뷰어 (roles/serviceusage.serviceUsageViewer) 역할을 추가했다.
이미 설정한 Firebase Hosting 관리자 (roles/firebasehosting.admin)와 API 키 뷰어 (roles/serviceusage.apiKeysViewer)는 유지한다.
3) 배포 재실행
섹션 제목: “3) 배포 재실행”설정 반영 후 실패한 GitHub Actions 실행을 다시 돌려 Firebase Hosting 배포 단계가 성공한 것을 확인했다. (만약, 동일한 403이 계속된다면 FIREBASE_PROJECT_ID, WIF_SERVICE_ACCOUNT를 다시 확인한다.)
Notes
섹션 제목: “Notes”1) 에러 메시지에서 먼저 볼 항목
섹션 제목: “1) 에러 메시지에서 먼저 볼 항목”- 요청 대상:
serviceusage.googleapis.com - 조회 대상:
firebasehosting.googleapis.com - 응답:
403 Permission denied to get service
serviceusage에서 firebasehosting의 상태를 확인할 때 Permission Deny 에러(403)를 반환했기에 serviceusage에서 API 에 대한 권한 부족임을 알 수 있었다.
2) CLI 버전 확인
섹션 제목: “2) CLI 버전 확인”배포할 때마다 매번 npm install -g firebase-tools를 실행하여 새로운 버전을 설치하기에 갑자기 배포가 실패하면 이전 성공 실행과 실패 실행의 CLI 버전을 비교한다. 15.34.1부터 도입된 “Hosting API 확인 단계” 가 이번 문제의 원인이었다.
3) 배포 계정에 부여한 역할
섹션 제목: “3) 배포 계정에 부여한 역할”- Firebase Hosting 관리자 (
roles/firebasehosting.admin): Hosting 사이트와 버전, 릴리스를 관리하고 배포하는 권한이다. - API 키 뷰어 (
roles/serviceusage.apiKeysViewer): 프로젝트의 API 키 정보를 조회하는 권한이다. - 서비스 사용량 뷰어 (
roles/serviceusage.serviceUsageViewer): 프로젝트에서 API가 활성화되어 있는지 조회하는 권한이다. 이번 오류가 발생한serviceusage.services.get요청을 위해 추가했다. API 자체를 활성화하는 권한은 없다.
4) 참고 문서
섹션 제목: “4) 참고 문서”- Firebase 프로젝트 생성 및 API 자동 활성화: Firebase를 프로젝트에 추가할 때 자동 활성화되는 API 목록에 Firebase Hosting API가 포함됨
- Firebase CLI v15.34.1 릴리스 노트: Hosting API 확인 단계가 추가된 버전
- Firebase CLI 변경 PR #11296: 배포 전 Hosting API 활성화 확인 구현
- Firebase CLI 이슈 #11335: 15.34.0과 15.34.1의 배포 결과 및 동일한 403 재현
- Google Cloud Service Usage 역할과 권한: 조회 권한이 포함된 역할 확인
- Google Cloud Firebase Hosting 역할과 권한: Hosting 관리자 역할 확인
- Google Cloud API Keys 접근 제어: API 키 뷰어 역할 확인
- Firebase GitHub Hosting Action 이슈 #465:
서비스 사용량 소비자역할을 추가하는 해결 방법