Firebase Summit에서 발표된 모든 내용을 살펴보고 Firebase로 앱을 빠르게 개발하고 안심하고 앱을 실행하는 방법을 알아보세요. 자세히 알아보기

기능 관리

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Firebase CLI 명령을 사용하거나 함수 소스 코드에서 런타임 옵션을 설정하여 함수를 배포, 삭제, 수정할 수 있습니다.

기능 배포

함수를 배포하려면 다음 Firebase CLI 명령어를 실행하세요.

firebase deploy --only functions

기본적으로 Firebase CLI는 index.js 내부의 모든 기능을 동시에 배포합니다. 프로젝트에 5개 이상의 함수가 포함된 경우 특정 함수 이름과 함께 --only 플래그를 사용하여 편집한 함수만 배포하는 것이 좋습니다. 이러한 방식으로 특정 기능을 배포 하면 배포 프로세스의 속도가 빨라지고 배포 할당량이 소진되는 것을 방지할 수 있습니다. 예를 들어:

firebase deploy --only functions:addMessage,functions:makeUppercase

많은 수의 기능을 배포할 때 표준 할당량을 초과하고 HTTP 429 또는 500 오류 메시지를 받을 수 있습니다. 이를 해결하려면 10개 이하의 그룹으로 기능을 배포하십시오.

사용 가능한 명령의 전체 목록은 Firebase CLI 참조 를 확인하세요.

기본적으로 Firebase CLI는 functions/ 폴더에서 소스 코드를 찾습니다. 원하는 경우 코드베이스 또는 여러 파일 세트에서 함수를 구성 할 수 있습니다.

기능 삭제

다음과 같은 방법으로 이전에 배포한 기능을 삭제할 수 있습니다.

  • functions:delete 를 사용하여 Firebase CLI에서 명시적으로
  • Google Cloud Console 에서 명시적으로
  • 배포 전에 index.js 에서 함수를 제거하여 암시적 으로.

모든 삭제 작업은 프로덕션에서 기능을 제거하기 전에 확인 메시지를 표시합니다.

Firebase CLI의 명시적 함수 삭제는 여러 인수와 함수 그룹을 지원하며 특정 지역에서 실행되는 함수를 지정할 수 있습니다. 또한 확인 프롬프트를 무시할 수 있습니다.

# Delete all functions that match the specified name in all regions.
firebase functions:delete myFunction
# Delete a specified function running in a specific region.
firebase functions:delete myFunction --region us-east-1
# Delete more than one function
firebase functions:delete myFunction myOtherFunction
# Delete a specified functions group.
firebase functions:delete groupA
# Bypass the confirmation prompt.
firebase functions:delete myFunction --force

암시적 함수 삭제를 사용하면 firebase deploy 에서 index.js 를 구문 분석하고 파일에서 제거된 모든 함수를 프로덕션에서 제거합니다.

함수의 이름, 지역 또는 트리거 수정

프로덕션 트래픽을 처리하는 기능에 대한 지역 또는 트리거의 이름을 바꾸거나 변경하는 경우 수정하는 동안 이벤트가 손실되지 않도록 이 섹션의 단계를 따르십시오. 이 단계를 수행하기 전에 먼저 함수가 멱등성 인지 확인하십시오. 변경하는 동안 함수의 새 버전과 이전 버전이 동시에 실행될 것이기 때문입니다.

함수 이름 바꾸기

함수의 이름을 바꾸려면 index.js 에서 이름이 바뀐 새 버전의 함수를 만든 다음 두 개의 개별 배포 명령을 실행합니다. 첫 번째 명령은 새로 명명된 함수를 배포하고 두 번째 명령은 이전에 배포된 버전을 제거합니다. 예를 들어 webhookNew 로 변경하려는 webhook 이라는 함수가 있는 경우 코드를 다음과 같이 수정합니다.

// before
const functions = require('firebase-functions');

exports.webhook = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

// after
const functions = require('firebase-functions');

exports.webhookNew = functions.https.onRequest((req, res) => {
    res.send("Hello");
});

그런 다음 다음 명령을 실행하여 새 기능을 배포합니다.

# Deploy new function called webhookNew
firebase deploy --only functions:webhookNew

# Wait until deployment is done; now both webhookNew and webhook are running

# Delete webhook
firebase functions:delete webhook

함수의 영역 변경

프로덕션 트래픽을 처리하는 기능에 대해 지정된 지역 을 변경하는 경우 다음 단계를 순서대로 수행하여 이벤트 손실을 방지할 수 있습니다.

  1. 함수의 이름을 바꾸고 원하는 대로 영역을 변경합니다.
  2. 이름이 바뀐 함수를 배포하면 두 지역 세트에서 동일한 코드가 일시적으로 실행됩니다.
  3. 이전 기능을 삭제합니다.

예를 들어, 현재 us-central1 의 기본 함수 영역에 있는 webhook 이라는 함수가 있고 이를 asia-northeast1 로 마이그레이션하려면 먼저 소스 코드를 수정하여 함수 이름을 바꾸고 영역을 수정해야 합니다. .

// before
const functions = require('firebase-functions');

exports.webhook = functions
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

// after
const functions = require('firebase-functions');

exports.webhookAsia = functions
    .region('asia-northeast1')
    .https.onRequest((req, res) => {
            res.send("Hello");
    });

그런 다음 다음을 실행하여 배포합니다.

firebase deploy --only functions:webhookAsia

이제 두 개의 동일한 기능이 실행되고 있습니다. webhookus-central1 에서 실행되고 webhookAsiaasia-northeast1 에서 실행됩니다.

그런 다음 webhook 을 삭제합니다.

firebase functions:delete webhook

이제 asia-northeast1 에서 실행되는 webhookAsia 함수 하나만 있습니다.

함수의 트리거 유형 변경

시간이 지남에 따라 Firebase용 Cloud Functions 배포를 개발함에 따라 다양한 이유로 함수의 트리거 유형을 변경해야 할 수 있습니다. 예를 들어 다음을 수행할 수 있습니다.

  • 레거시 스토리지 onChange 이벤트에서 onFinalize , onDelete , onArchiveonMetadataUpdate 로 변경합니다. ( 베타에서 v1 또는 v2로 업그레이드 가이드 에서 이에 대해 자세히 알아보십시오.)
  • Firebase 실시간 데이터베이스 또는 Cloud Firestore 이벤트의 한 유형에서 다른 유형으로 변경합니다(예: 일반 onWrite 이벤트에서 세분화된 onCreate 이벤트로).

소스 코드를 변경하고 firebase deploy 를 실행하는 것만으로는 함수의 이벤트 유형을 변경할 수 없습니다. 오류를 방지하려면 다음 절차에 따라 함수의 트리거 유형을 변경하십시오.

  1. 원하는 트리거 유형의 새 기능을 포함하도록 소스 코드를 수정합니다.
  2. 함수를 배포하면 이전 함수와 새 함수가 모두 일시적으로 실행됩니다.
  3. Firebase CLI를 사용하여 프로덕션에서 이전 함수를 명시적으로 삭제합니다.

예를 들어, 기존 onChange 이벤트 유형이 있는 objectChanged 함수가 있고 이를 onFinalize 로 변경하려는 경우 먼저 함수의 이름을 변경하고 onFinalize 이벤트 유형을 갖도록 편집합니다.

// before
const functions = require('firebase-functions');

exports.objectChanged = functions.storage.object().onChange((object) => {
    return console.log('File name is: ', object.name);
});

// after
const functions = require('firebase-functions');

exports.objectFinalized = functions.storage.object().onFinalize((object) => {
    return console.log('File name is: ', object.name);
});

그런 다음 이전 함수를 삭제하기 전에 다음 명령을 실행하여 먼저 새 함수를 만듭니다.

# Create new function objectFinalized
firebase deploy --only functions:objectFinalized

# Wait until deployment is done; now both objectChanged and objectFinalized are running

# Delete objectChanged
firebase functions:delete objectChanged

런타임 옵션 설정

Firebase용 Cloud Functions를 사용하면 Node.js 런타임 버전 및 함수별 시간 제한, 메모리 할당, 최소/최대 함수 인스턴스와 같은 런타임 옵션을 선택할 수 있습니다.

모범 사례로 이러한 옵션(Node.js 버전 제외)은 기능 코드 내부의 구성 개체에 설정해야 합니다. 이 RuntimeOptions 객체는 함수의 런타임 옵션에 대한 정보 소스이며 다른 방법(예: Google Cloud 콘솔 또는 gcloud CLI를 통해)을 통해 설정된 옵션을 재정의합니다.

개발 워크플로에 Google Cloud 콘솔 또는 gcloud CLI를 통해 런타임 옵션을 수동으로 설정하는 것이 포함되며 이러한 값이 배포될 때마다 재정의 되지 않도록 하려면 preserveExternalChanges 옵션을 true 로 설정하세요. 이 옵션을 true 로 설정하면 Firebase는 코드에 설정된 런타임 옵션을 다음 우선순위로 현재 배포된 함수 버전 설정과 병합합니다.

  1. 옵션은 기능 코드에서 설정됩니다. 외부 변경 사항을 재정의합니다.
  2. 기능 코드에서 옵션이 RESET_VALUE 로 설정되어 있습니다. 외부 변경 사항을 기본값으로 재정의합니다.
  3. 옵션은 함수 코드에 설정되어 있지 않지만 현재 배포된 함수에 설정되어 있습니다. 배포된 함수에 지정된 옵션을 사용하십시오.

코드가 더 이상 함수에 대한 런타임 옵션에 대한 완전한 정보 소스가 아니기 때문에 대부분의 시나리오에서 preserveExternalChanges: true 옵션을 사용하는 것은 권장 되지 않습니다. 사용하는 경우 Google Cloud 콘솔을 확인하거나 gcloud CLI를 사용하여 함수의 전체 구성을 확인하세요.

Node.js 버전 설정

Cloud Functions 2.0.0 이상용 Firebase SDK에서는 Node.js 런타임을 선택할 수 있습니다. 다음 지원되는 Node.js 버전 중 하나에 해당하는 런타임 환경에서만 프로젝트의 모든 기능을 실행하도록 선택할 수 있습니다.

  • Node.js 16
  • Node.js 14

Node.js 버전을 설정하려면:

초기화 중에 functions/ 디렉토리에 생성된 package.json 파일의 engines 필드에서 버전을 설정하십시오. 예를 들어 버전 16만 사용하려면 package.json 에서 이 줄을 편집합니다.

  "engines": {"node": "16"}

engines 필드는 필수입니다. 기능을 배포하고 실행하려면 지원되는 Node.js 버전 중 하나를 지정 해야 합니다 . 현재 firebase init functions 는 이 필드를 16 으로 설정합니다.

Node.js 런타임 업그레이드

Node.js 런타임을 업그레이드하려면:

  1. 프로젝트가 Blaze 요금제 에 포함되어 있는지 확인하세요.
  2. Firebase CLI v9.17.0 이상을 사용 중인지 확인하세요.
  3. 초기화 중에 functions/ 디렉터리에 생성된 package.json 파일의 engines 값을 변경합니다. 예를 들어 버전 10에서 버전 16으로 업그레이드하는 경우 항목은 "engines": {"node": "16"} 과 같아야 합니다.
  4. 선택적으로 Firebase 로컬 에뮬레이터 제품군 을 사용하여 변경 사항을 테스트합니다.
  5. Firebase CLI v9.17.0 이상을 사용하여 함수를 재배포합니다.

확장 동작 제어

기본적으로 Firebase용 Cloud Functions는 수신 요청 수를 기반으로 실행 중인 인스턴스 수를 조정하며, 트래픽이 감소하면 잠재적으로 0개의 인스턴스로 축소됩니다. 그러나 앱에서 대기 시간 감소가 필요하고 콜드 스타트 ​​수를 제한하려는 경우 요청을 처리할 준비가 되어 있고 따뜻하게 유지될 컨테이너 인스턴스의 최소 수를 지정하여 이 기본 동작을 변경할 수 있습니다.

마찬가지로 최대 수를 설정하여 수신 요청에 대한 응답으로 인스턴스 확장을 제한할 수 있습니다. 비용을 제어하거나 데이터베이스와 같은 지원 서비스에 대한 연결 수를 제한하는 방법으로 이 설정을 사용하십시오.

콜드 스타트 ​​횟수 줄이기

소스 코드에서 함수에 대한 최소 인스턴스 수를 설정하려면 runWith 메소드를 사용하십시오. 이 메소드는 minInstances 의 값을 정의하는 RuntimeOptions 인터페이스를 준수하는 JSON 객체를 허용합니다. 예를 들어, 이 함수는 보온을 위해 최소 5개의 인스턴스를 설정합니다.

exports.getAutocompleteResponse = functions
    .runWith({
      // Keep 5 instances warm for this latency-critical function
      minInstances: 5,
    })
    .https.onCall((data, context) => {
      // Autocomplete a user's search term
    });

다음은 minInstances 값을 설정할 때 고려해야 할 몇 가지 사항입니다.

  • Firebase용 Cloud Functions가 minInstances 설정 이상으로 앱을 확장하는 경우 해당 임계값을 초과하는 각 인스턴스에 대해 콜드 스타트가 발생합니다.
  • 콜드 스타트는 트래픽이 급증하는 앱에 가장 심각한 영향을 미칩니다. 앱에 트래픽이 급증하고 트래픽이 증가할 때마다 콜드 스타트가 줄어들도록 minInstances 값을 충분히 높게 설정하면 지연 시간이 크게 단축되는 것을 볼 수 있습니다. 트래픽이 일정한 앱의 경우 콜드 스타트는 성능에 심각한 영향을 미치지 않습니다.
  • 최소 인스턴스 설정은 프로덕션 환경에 적합할 수 있지만 일반적으로 테스트 환경에서는 피해야 합니다. 테스트 프로젝트에서 0으로 확장하면서 프로덕션 프로젝트에서 콜드 스타트를 줄이려면 FIREBASE_CONFIG 환경 변수를 기반으로 minInstances 를 설정할 수 있습니다.

    // Get Firebase project id from `FIREBASE_CONFIG` environment variable
    const envProjectId = JSON.parse(process.env.FIREBASE_CONFIG).projectId;
    
    exports.renderProfilePage = functions
        .runWith({
          // Keep 5 instances warm for this latency-critical function
          // in production only. Default to 0 for test projects.
          minInstances: envProjectId === "my-production-project" ? 5 : 0,
        })
        .https.onRequest((req, res) => {
          // render some html
        });
    

함수의 최대 인스턴스 수 제한

함수 소스 코드에서 최대 인스턴스를 설정하려면 runWith 메소드를 사용하십시오. 이 메서드는 maxInstances 에 대한 값을 정의하는 RuntimeOptions 인터페이스를 준수하는 JSON 객체를 허용합니다. 예를 들어, 이 함수는 가상의 레거시 데이터베이스를 압도하지 않기 위해 100개의 인스턴스 제한을 설정합니다.

exports.mirrorOrdersToLegacyDatabase = functions
    .runWith({
      // Legacy database only supports 100 simultaneous connections
      maxInstances: 100,
    })
    .firestore.document("orders/{orderId}")
    .onWrite((change, context) => {
      // Connect to legacy database
    });

HTTP 함수가 maxInstances 제한까지 확장되는 경우 새 요청은 30초 동안 대기한 다음 그때까지 사용할 수 있는 인스턴스가 없으면 응답 코드 429 Too Many Requests 와 함께 거부됩니다.

최대 인스턴스 설정 사용에 대한 모범 사례에 대해 자세히 알아보려면 maxInstances 사용에 대한 모범 사례를 확인하십시오.

시간 초과 및 메모리 할당 설정

어떤 경우에는 함수에 긴 시간 초과 값이나 큰 메모리 할당에 대한 특별한 요구 사항이 있을 수 있습니다. Google Cloud Console 또는 함수 소스 코드(Firebase만 해당)에서 이러한 값을 설정할 수 있습니다.

함수 소스 코드에서 메모리 할당 및 시간 제한을 설정하려면 Cloud Functions용 ​​Firebase SDK 2.0.0에 도입된 runWith 매개변수를 사용하세요. 이 런타임 옵션은 timeoutSecondsmemory 값을 정의하는 RuntimeOptions 인터페이스를 준수하는 JSON 객체를 허용합니다. 예를 들어, 이 저장 기능은 1GB의 메모리를 사용하고 300초 후에 시간 초과됩니다.

exports.convertLargeFile = functions
    .runWith({
      // Ensure the function has enough memory and time
      // to process large files
      timeoutSeconds: 300,
      memory: "1GB",
    })
    .storage.object()
    .onFinalize((object) => {
      // Do some complicated things that take a lot of memory and time
    });

timeoutSeconds 의 최대값은 540 또는 9분입니다. 함수에 부여된 메모리 양은 다음 memory 값 목록에 자세히 설명된 대로 함수에 할당된 CPU에 해당합니다.

  • 128MB - 200MHz
  • 256MB - 400MHz
  • 512MB - 800MHz
  • 1GB - 1.4GHz
  • 2GB — 2.4GHz
  • 4GB — 4.8GHz
  • 8GB — 4.8GHz

Google Cloud Console에서 메모리 할당 및 시간 제한을 설정하려면 다음 안내를 따르세요.

  1. Google Google Cloud Console의 왼쪽 메뉴에서 Cloud Functions 를 선택합니다.
  2. 기능 목록에서 해당 이름을 클릭하여 기능을 선택합니다.
  3. 상단 메뉴에서 편집 아이콘을 클릭합니다.
  4. 메모리 할당 드롭다운 메뉴에서 메모리 할당을 선택합니다.
  5. 자세히 를 클릭하여 고급 옵션을 표시하고 시간 초과 텍스트 상자에 시간(초)을 입력합니다.
  6. 저장 을 클릭하여 기능을 업데이트합니다.