Firebase Extensions를 직접 만든 함수 키트로 마이그레이션

이전 경로 선택: npm의 함수 키트로 이전 자체 생성 함수 키트로 이전

게시자가 npm에 배포된 공식 대체 키트를 만들지 않은 경우 이 가이드에서는 확장 프로그램을 포크하고 로컬 함수 키트로 설정하는 단계를 안내합니다.

알려진 이전 제한사항 확인하기

확장 프로그램 인스턴스 마이그레이션을 시작하기 전에 설정에서 해결 방법이 필요하거나 함수 키트에서 아직 지원되지 않는 다음 기능을 사용하는지 확인하세요.

  • 커스텀 Docker 저장소 및 KMS 키에는 수동 해결 방법이 필요함 Cloud Functions for Firebase는 커스텀 Docker 저장소 또는 고객 관리 암호화 키(KMS 키)를 구성하기 위한 대체 시스템 매개변수를 지원하지 않습니다. 확장 프로그램에서 이러한 매개변수를 구성하는 경우 FAQ 해결 방법을 참고하세요.

시작하기 전에

Firebase CLI를 설정하고 Firebase 프로젝트를 초기화해야 합니다. CLI를 사용할 때는 새 마이그레이션 및 함수 키트 명령어가 있는 firebase-tools 버전 >= 15.32.0를 사용해야 합니다.

필수 계정 권한 및 역할

마이그레이션 중에 Firebase CLI에서 만들고 구성해야 하는 항목에 따라 Firebase 및 Google Cloud로 인증하는 데 사용하는 계정에 다음 역할이 있어야 합니다.

  • roles/firebaseextensions.editor
  • roles/cloudbuild.builds.editor
  • roles/artifactregistry.writer
  • roles/run.developer
  • roles/iam.serviceAccountUser
  • roles/iam.serviceAccountCreator
  • roles/cloudfunctions.admin(공개 엔드포인트에 setIamPermissions를 수행해야 하는 경우)
  • roles/secretmanager.admin(보안 비밀을 사용하는 경우)
  • roles/serviceusage.serviceUsageAdmin(새 API를 사용 설정해야 하는 경우)

이러한 권한 대부분은 이미 부여되어 있으므로 이전에 확장 프로그램을 설치하고 함수를 배포한 계정을 사용하는 것이 좋습니다. 마이그레이션 계정에 더 많은 역할이 필요한 경우 Google Cloud IAM 안내에 따라 역할을 추가합니다.

확장 프로그램 인스턴스를 최신 버전으로 업그레이드

확장 프로그램 인스턴스와 대체 키트 간의 차이를 최소화하려면 확장 프로그램을 최신 버전으로 업데이트해야 합니다. 확장 프로그램을 업그레이드하지 않으면 확장 프로그램 인스턴스와 키트 대체 간에 중대한 브레이킹 체인지가 발생할 수 있습니다. 버전 간 매개변수 변경으로 인해 내보낸 구성이 키트에서 예상하는 구성과 일치하지 않을 수 있습니다.

확장 프로그램이 설치된 위치에 따라 다음 옵션 중 하나를 사용하여 확장 프로그램을 업데이트합니다.

  • Firebase 콘솔에서
  • Firebase CLI에서 다음을 사용합니다.
    • firebase ext:update <extension-instance-id> --project <project-id> firebase deploy --only extensions --project <project-id>

이 단계를 건너뛰면 확장 프로그램이 최신 버전이 아닌 경우 구성을 내보낼 때 CLI에서 업그레이드하라는 메시지가 표시됩니다.

확장 프로그램을 로컬 함수 키트로 포크

확장 프로그램을 로컬 함수 키트로 변환하기 전에 확장 프로그램 소스 코드가 Firebase 프로젝트 내에 있는지 확인하세요. 이렇게 하려면 GitHub에서 확장 프로그램 저장소를 클론하고 Firebase 프로젝트 루트 내에 디렉터리를 만든 후 확장 프로그램의 functions/ 폴더와 extension.yaml를 여기에 복사합니다.

mkdir -p path/to/kit
cp -r /path/to/extension-source/functions/* path/to/kit/
cp /path/to/extension-source/extension.yaml path/to/kit/.

게시자 이전 가이드의 1~8단계에 따라 확장 프로그램 소스 코드를 2세대 함수로 이전합니다. 그런 다음 아래 단계를 따릅니다.

로컬 키트에서 내보낸 함수 리전 및 고급 파라미터를 지원하도록 설정

로컬 함수 키트에서 Firebase CLI는 패키지를 설정하고 마이그레이션된 시스템 매개변수를 사용하도록 구성하는 index.ts 파일을 생성하지 않습니다. 확장 프로그램에 구성된 함수 리전 및 고급 매개변수를 사용하려면 firebase ext:export --mode functions에서 내보낸 형식을 환경 변수 파일로 읽도록 index.ts 파일을 설정합니다.

특히 함수를 내보내는 최상위 index.ts 파일에서 FUNCTION_DEFAULT_REGION의 매개변수를 정의하고 CLI에서 사용하는 index-kit-migration.ts 템플릿과 유사하게 EXT_MIGRATED_SYSTEM_<GLOBAL_OPTION> 형식의 환경 변수로 setGlobalOptions를 호출합니다.

import { setGlobalOptions } from "firebase-functions";
import { MemoryOption, VpcEgressSetting, IngressSetting } from "firebase-functions/v2/options";
import { defineString } from "firebase-functions/params";

export const regionParam = defineString("FUNCTION_DEFAULT_REGION", {
  input: { text: { nonEmpty: true } },
  description: "Global default region where functions should be deployed. Can be overridden per-function.",
});

setGlobalOptions({
  region: regionParam,
  memory: (process.env.EXT_MIGRATED_SYSTEM_MEMORY as MemoryOption) ?? undefined,
  timeoutSeconds: process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS
    ? Number(process.env.EXT_MIGRATED_SYSTEM_TIMEOUTSECONDS)
    : undefined,
  vpcConnectorEgressSettings:
    process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS &&
    process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS !== "VPC_CONNECTOR_EGRESS_SETTINGS_UNSPECIFIED"
      ? (process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOREGRESSSETTINGS as VpcEgressSetting)
      : undefined,
  vpcConnector: process.env.EXT_MIGRATED_SYSTEM_VPCCONNECTOR ?? undefined,
  maxInstances: process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES
    ? Number(process.env.EXT_MIGRATED_SYSTEM_MAXINSTANCES)
    : undefined,
  minInstances: process.env.EXT_MIGRATED_SYSTEM_MININSTANCES
    ? Number(process.env.EXT_MIGRATED_SYSTEM_MININSTANCES)
    : undefined,
  ingressSettings: (process.env.EXT_MIGRATED_SYSTEM_INGRESSSETTINGS as IngressSetting) ?? undefined,
  // Parses a comma-separated string of key:value pairs into a key-value object
  // (for example, "key1:value1,key2:value2" -> { key1: "value1", key2: "value2" }).
  labels: process.env.EXT_MIGRATED_SYSTEM_LABELS
    ? process.env.EXT_MIGRATED_SYSTEM_LABELS.split(",").reduce<Record<string, string> | undefined>(
        (acc, curr) => {
          const [key, value] = curr.split(":");
          const trimmedKey = key?.trim();
          const trimmedValue = value?.trim();
          if (!trimmedKey || !trimmedValue) {
            return acc;
          }
          acc = acc ?? {};
          acc[trimmedKey] = trimmedValue;
          return acc;
        },
        undefined,
      )
    : undefined,
});

// Re-export all functions so the Firebase CLI can deploy them
export * from "./your-functions";

이전 전에 키트 테스트

이제 배포 시 확장 프로그램의 새 설치와 동일하게 작동하는 로컬 함수 키트가 있습니다. 다음 단계는 프로덕션 확장 프로그램 인스턴스를 마이그레이션하기 전에 실수로 발생한 문제를 확인하고 해결하는 것입니다.

먼저 포크를 로컬 키트로 추가하고 구성한 후 테스트 프로젝트에 배포합니다. 로컬 함수 키트는 Firebase 프로젝트 내에 있어야 하므로 클론된 확장 프로그램 저장소가 Firebase 프로젝트 외부에 있는 경우 프로젝트 디렉터리 내부로 이동합니다. 그런 다음, 다음 키트 설치 명령어를 실행하여 로컬 키트로 설치합니다.

firebase functions:kits:install --directory <path-to-your-fork> --project <test-project-id>

이 명령어는 첫 번째 테스트 인스턴스의 키트 ID, 인스턴스 ID, 구성을 선택하는 과정을 안내합니다. 그런 다음 firebase.json 파일을 수정하여 포크된 디렉터리를 가리키는 로컬 키트를 등록하고, 각 인스턴스의 구성은 function-kits/<kit-id>/config-<instance-id>의 .env 파일에 저장됩니다.

동작을 테스트하기 위해 적절한 리소스를 사용하여 로컬 키트를 테스트 프로젝트에 배포합니다. 확장 프로그램을 테스트하여 이미 테스트 프로젝트를 설정한 경우 다음 명령어를 실행합니다.

firebase deploy --only functions:<kit-instance-id> --project <test-project-id>

작업 예시: Cloud Firestore에서 BigQuery로 스트리밍(firestore-bigquery-export)

Cloud Firestore에서 BigQuery로의 엔드 투 엔드 동기화를 확인합니다.

  1. Firebase Console의 Cloud Firestore 페이지에서 COLLECTION_PATH(users)로 설정한 컬렉션이 아직 없으면 만듭니다.
  2. 값이 있는 필드가 포함된 bigquery-mirror-test이라는 문서를 만듭니다.
  3. Google Cloud 콘솔의 BigQuery 페이지에서 원시 변경 로그 테이블을 쿼리합니다. 문서 생성을 로깅하는 단일 행이 포함되어야 합니다.

    SELECT * FROM `PROJECT_ID.analytics.users_raw_changelog`
    
  4. 최신 뷰를 쿼리합니다. 그러면 존재하는 유일한 문서(bigquery-mirror-test)의 최신 변경 이벤트가 반환됩니다.

    SELECT * FROM `PROJECT_ID.analytics.users_raw_latest`
    
  5. Cloud Firestore에서 bigquery-mirror-test 문서를 삭제합니다. 최신 뷰에서 사라지고 DELETE 이벤트가 원시 변경 로그 테이블에 추가됩니다.

    다음을 사용하여 단일 문서의 전체 기록을 검사할 수 있습니다.

    SELECT *
       FROM `PROJECT_ID.analytics.users_raw_changelog`
       WHERE document_name = "bigquery-mirror-test"
       ORDER BY timestamp ASC
    

확장 프로그램 테스트와의 차이점:

  • 트리거는 ext-<instanceId>-fsexportbigquery가 아닌 kit-<kit-instance-id>-fsexportbigquery로 배포됩니다. Cloud Functions 대시보드 및 로그에서 해당 이름을 찾습니다.
  • 코드는 Firebase Local Emulator Suite에서 표준 함수로 실행됩니다. .env.local를 사용하여 에뮬레이터에서 사용할 파라미터 값을 설정할 수 있습니다. Cloud Functions 단위 테스트에 설명된 대로 firebase-functions-test SDK를 사용하여 코드를 단위 테스트할 수도 있습니다.
  • 프로비저닝은 더 이상 확장 프로그램 런타임에 의해 구동되지 않습니다. 배포 후 변경 로그 테이블이 누락된 경우 설정 태스크를 수동으로 다시 실행합니다(firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>). 태스크는 멱등성이므로 다시 실행하면 데이터 세트, 테이블, 뷰가 조정됩니다.
  • 매개변수 값은 설치 양식이 아닌 .env에서 가져오므로 .env가 완료되면 firebase deploy의 재실행은 비대화형입니다.

(선택사항) 테스트 후 삭제

테스트 후 이 테스트 인스턴스를 삭제하려면 제거합니다.

firebase functions:kits:uninstall --instance <kit-instance-id> --project <test-project-id>

이렇게 하면 키트를 배포하여 만든 모든 클라우드 리소스가 삭제되고 인스턴스 구성이 삭제됩니다. 키트 인스턴스가 하나만 있는 경우 firebase.json에서 키트 항목도 삭제됩니다. 로컬 소스 코드 디렉터리는 삭제되지 않습니다. 프로덕션 마이그레이션을 위해 키트를 설치할 때 키트 ID를 다시 선택할 수 있습니다.

확장 프로그램에서 로컬 키트로 마이그레이션

로컬 키트가 테스트되었으므로 라이브 배포된 확장 프로그램 인스턴스를 이전할 수 있습니다.

1. 대체 함수 키트 인스턴스 설치

로컬 함수 키트를 설치하고 --no-configure를 전달하여 수동 구성을 건너뛰면 다음 단계에서 기존 확장 프로그램 구성을 이 키트 인스턴스로 직접 내보낼 수 있습니다.

firebase functions:kits:install --no-configure --directory <path-to-your-fork> --project <project-id>

2. 확장 프로그램과 동일하게 함수 키트 인스턴스 구성

대체하는 확장 프로그램과 동일한 구성으로 이 키트 인스턴스를 맞춤설정해야 합니다. 확장 프로그램 인스턴스 구성을 .env 파일로 내보낼 수 있습니다. 이 파일에는 키트를 포함한 모든 Cloud Functions의 매개변수, 환경 변수, 보안 비밀 참조 구성 데이터가 저장됩니다. 키트의 구성 파일로 직접 내보내려면 다음을 실행합니다.

firebase ext:export --mode functions --instance <extension-instance-id> --kit-instance <kit-instance-id> --project <project-id>

이 단계가 끝나면 이 인스턴스의 구성 정보가 인스턴스 구성 디렉터리의 프로젝트별 .env 파일에 저장됩니다. 예를 들면 다음과 같습니다. function-kits/<kit-name>/config-<instance-id>/.env.<project-id>

3. 키트 교체 배포 및 확인

이제 키트가 설치되고 함수 집합으로 사용할 수 있으므로 키트 대체를 배포할 수 있습니다. 함수 키트는 표준 함수처럼 작동하며, 각 키트 인스턴스는 함수를 구성하는 별도의 코드베이스 역할을 합니다. 모든 함수를 배포하거나 특정 키트 인스턴스만 배포할 수 있습니다. 단일 확장 프로그램 인스턴스를 이전하는 동안 해당 키트 인스턴스만 배포합니다.

마이그레이션한 확장 프로그램 인스턴스에 없는 새 매개변수를 키트에서 사용하는 경우 Firebase CLI는 배포 프로세스 시작 시 해당 매개변수를 입력하라는 메시지를 표시합니다. 최신 firestore-bigquery-export 확장 프로그램의 이 작업 예시에서는 예상되지 않지만, 많은 키트에서 키트에서 사용하는 모든 이벤트 트리거 소스에 대한 새 매개변수를 요청합니다. 이전에는 확장 프로그램에서 1세대 함수를 사용했지만, 이번 마이그레이션의 일환으로 업데이트된 키트에서는 2세대 함수를 사용합니다. 2세대에서는 함수가 이벤트 소스 근처에 위치하며 추가 매개변수로 추가됩니다. 향후 업데이트에서 새 매개변수가 추가되면 CLI가 다음 배포에서 메시지를 표시합니다.

예시:

firebase deploy --only functions:firestore-bigquery-export --project my-project

출력:

=== Deploying to 'my-project'...
i  deploying functions
i  functions: Loaded environment variables from function-kits/firestore-bigquery-export/config-firestore-bigquery-export/.env.my-project
i  functions: ensuring required API bigquery.googleapis.com is enabled...
i  functions: ensuring required API cloudtasks.googleapis.com is enabled...
✔  functions: required APIs are enabled
i  functions: granting declarative IAM roles to managed service account:
   - BigQuery Data Editor
   - BigQuery User
   - Cloud Datastore User
   - Eventarc Event Receiver
   - roles/run.invoker
✔  functions: successfully granted IAM roles
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-fsexportbigquery(us-central1)...
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-initBigQuerySync(us-central1)...
i  functions: creating Node.js 22 (2nd Gen) function kit-firestore-bigquery-export-setupBigQuerySync(us-central1)...
✔  functions[kit-firestore-bigquery-export-fsexportbigquery(us-central1)] Successful create operation.
✔  functions[kit-firestore-bigquery-export-initBigQuerySync(us-central1)] Successful create operation.
✔  functions[kit-firestore-bigquery-export-setupBigQuerySync(us-central1)] Successful create operation.
i  functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔  functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/us-central1/queues/kit-firestore-bigquery-export-initBigQuerySync.
✔  Deploy complete!

키트의 firebase deploy에 오류가 없는지 확인하려면 배포 로그를 확인하여 수명 주기 후크가 트리거되었는지 확인합니다. Cloud Firestore에서 BigQuery로 스트리밍과 같은 인기 확장 프로그램은 수명 주기 후크를 사용합니다. 다음은 트리거될 때 수명 주기 후크가 표시되는 방식의 예시입니다.

i  functions: Executing afterFirstDeploy lifecycle hook targeting: kit-firestore-bigquery-export-initBigQuerySync...
✔  functions: Successfully queued task for lifecycle hook kit-firestore-bigquery-export-initBigQuerySync in queue projects/my-project/locations/europe-west1/queues/kit-firestore-bigquery-export-initBigQuerySync.
i  functions: View logs for afterFirstDeploy at: https://console.cloud.google.com/logs/query;query=resource.type%3D%22cloud_run_revision%22%0Aresource.labels.service_name%3D%22kit-firestore-bigquery-export--initbigquerysync%22%0Aresource.labels.location%3D%22europe-west1%22;project=my-project

이러한 로그 메시지는 다음을 확인합니다.

  • 수명 주기 후크가 발견되어 실행되었습니다.
  • 수명 주기 후크의 연결된 태스크 큐에 태스크가 추가되었습니다.
  • Cloud Logging 링크가 제공되므로 작업이 오류 없이 완료되었는지 확인할 수 있습니다.

Google Cloud 콘솔에 대한 로그 링크를 따라 로그에 오류가 없고 태스크 큐 이벤트가 성공적으로 처리되었는지 확인합니다. 수명 주기 이벤트가 성공적으로 실행되지 않은 경우 다음을 실행하여 다시 트리거할 수 있습니다.

firebase functions:lifecycle:run <hook-name> <codebase>

함수 키트 인스턴스를 처음 배포하는 경우 다음을 실행합니다.

firebase functions:lifecycle:run afterFirstDeploy <kit-instance-id>

검증 중에 언제든지 이 이전을 중지하거나 실행취소하려면 확장 프로그램 제거의 안내에 따라 키트를 제거하면 됩니다.

함수 키트의 초기 배포가 성공적으로 완료되었는지 확인한 후에는 키트의 기능이 실제로 예상대로 작동하는지 확인해야 합니다. 확장 프로그램 자체는 계속 실행 중이므로, 확장 프로그램이 계속 실행되고 있고 앞으로도 계속 실행될 것이기 때문에 두 가지 중 하나가 작동했는지 여부만 확인하지 않도록 주의해야 합니다.

처리가 변경되지 않고 확장 프로그램과 키트에서 중복 결과가 표시되지 않는 경우 가장 좋은 방법은 키트의 기능을 트리거한 후 키트의 로그를 직접 검사하는 것입니다.

실제 예시: Cloud Firestore에서 BigQuery로 스트리밍

Cloud Firestore에서 BigQuery로 스트리밍 확장 프로그램을 사용하면 동일한 이벤트가 키트와 확장 프로그램에 전달되는 경우 원시 변경 로그 테이블(*_raw_changelog)과 최신 뷰 테이블(*_raw_latest)에 대한 쓰기가 중복 삭제됩니다. 따라서 BigQuery에서 행이나 중복 행의 존재를 사용하여 키트가 작동하는지 확인할 수 없습니다.

firebase functions:logs를 사용하여 Firestore 컬렉션에 작성한 직후 함수 로그를 보고 쓰기가 성공적으로 처리되었음을 나타내는 로그 항목을 찾을 수 있습니다. 기본 인스턴스 ID가 firestore-bigquery-export인 이 키트의 경우 다음과 같습니다.

2026-09-25T19:52:46.328612Z I kit-firestore-bigquery-export-fsexportbigquery: Started execution of extension
2026-09-25T19:52:46.328644Z I kit-firestore-bigquery-export-fsexportbigquery: {"message":"Firestore event received by onDocumentWritten trigger","document_name":"projects/extensions-eventarc-testing/databases/(default)/documents/exported-messages/cmGP6XLyksqGdw2OgTOq","operation":0,"event_id":"9f59a2a4-1a5e-4c41-a32d-561e3c734502"}
2026-09-25T19:52:46.616064Z I kit-firestore-bigquery-export-fsexportbigquery: Completed execution of extension
2026-09-2

로그가 많은 경우 다음 명령어를 사용하여 특정 키트 함수로 필터링할 수 있습니다.

firebase functions:log --only <function name>

키트 인스턴스의 특정 함수 이름을 찾으려면 다음 명령어를 사용하면 됩니다.

firebase functions:list | grep kit-<kit instance id>

이 예시에서는 다음을 수행합니다.

firebase functions:list | grep kit-firestore-bigquery-export
│ kit-firestore-bigquery-export-fsexportbigquery  │ v2      │ google.cloud.firestore.document.v1.written                    │
│ kit-firestore-bigquery-export-initBigQuerySync  │ v2      │ taskQueue                                                     │
│ kit-firestore-bigquery-export-setupBigQuerySync │ v2      │ taskQueue                                                     │
│ kit-firestore-bigquery-export-syncBigQuery      │ v2      │ taskQueue                                                     │

4. 확장 프로그램 제거

배포된 함수 키트를 확인한 후에는 키트와 확장 프로그램에 대해 동작을 중복하지 않도록 확장 프로그램을 제거할 수 있습니다. --immediate 플래그를 전달하면 설치 방법에 관계없이 Firebase CLI에서 모든 확장 프로그램을 제거할 수 있습니다.

firebase ext:uninstall <extension-instance-id> --project <project-id> --immediate

예시:

firebase ext:uninstall firestore-bigquery-export --project my-project --immediate

출력:

i  extensions: uninstalling firestore-bigquery-export...
i  extensions: deleting extension instance resources in project my-project...
✔  extensions: successfully uninstalled firestore-bigquery-export

고급 이전

단일 코드베이스로 관리하려는 여러 Firebase 프로젝트에 확장 프로그램을 포함할 수 있습니다. 예를 들어 동일한 인프라를 testing 환경과 production 환경에 배포하고, 각 환경에 BigQuery로 내보내는 documents Cloud Firestore 인스턴스가 있는 경우 firestore-bigquery-export 확장 프로그램의 인스턴스 두 개가 설치될 수 있습니다.

  • export-documents-testing
  • export-documents-production

Firebase CLI를 사용할 때 이 두 확장 프로그램 인스턴스를 단일 코드베이스의 두 함수 키트 인스턴스로 마이그레이션하고 firebase deploy --project testing 및 firebase deploy --project production를 사용하여 배포한 경우 각 배포는 testing 및 production 환경 모두에 두 개의 인스턴스를 만듭니다.

대신 두 확장 프로그램 인스턴스를 여러 프로젝트에 배포된 firestore-bigquery-export의 함수 키트 인스턴스 하나로 대체합니다. 각 프로젝트에는 자체 구성이 있습니다. 인스턴스의 구성 디렉터리는 다음과 같습니다.

  • config-export-documents/
    • .env.testing
    • .env.production

testing 및 production에 배포할 때마다 해당 구성으로 키트 인스턴스가 하나씩 생성됩니다. 기존 CLI 명령어는 ext:migrate 또는 functions:kits:install를 호출할 때마다 --project 플래그를 전달하는 한 이 설정을 만듭니다.

예시:

firebase functions:kits:install --package @firebase-function-kits/firestore-bigquery-export --project testing --no-configure --template migration
✔ What would you like to name this kit? firestore-bigquery-export
✔ What would you like to name this instance? export-documents
✔  Wrote function-kits/firestore-bigquery-export/source/package.json
✔  Wrote function-kits/firestore-bigquery-export/source/tsconfig.json
✔  Wrote function-kits/firestore-bigquery-export/source/.gitignore
✔  Wrote function-kits/firestore-bigquery-export/source/src/index.ts
i  functions: Running npm install
✔  Wrote configuration info to firebase.json
✔  functions: Function kit firestore-bigquery-export successfully installed.
# This creates the export-documents instance with an empty .env.testing file
# for the testing project. Now populate it via export:
firebase ext:export --mode functions --instance export-documents-testing \
  --kit-instance export-documents --project testing

# Repeat the export for production into the same kit instance to create
# .env.production from the export-documents-prod instance:
firebase ext:export --mode functions --instance export-documents-prod \
  --kit-instance export-documents --project production

이제 각각의 구성으로 testing 및 production 프로젝트에 배포하도록 구성된 단일 키트 인스턴스가 있습니다. testing 프로젝트에서 인스턴스를 만들고 production 프로젝트에서 동일한 패키지에 대해 functions:kits:install 명령어를 실행하면 testing에 구성된 인스턴스를 재사용하거나 두 번째 인스턴스를 설치하는 옵션이 표시됩니다.