콘솔로 이동

함수 배포 및 런타임 옵션 관리

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

함수 배포

함수를 배포하려면 이 Firebase CLI 명령어를 실행합니다.

$ firebase deploy --only functions

기본적으로 Firebase CLI는 index.js 내에서 모든 함수를 동시에 배포합니다. 프로젝트에 포함된 함수가 5개를 넘는 경우 수정한 함수만 배포되도록 특정 함수 이름에 --only 플래그를 사용하는 것이 좋습니다. 특정 함수만 배포하면 배포 프로세스 속도가 빨라지고 배포 할당량에 도달하는 것을 방지하는 데 도움이 됩니다. 예:

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

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

기본적으로 Firebase CLI는 소스 코드의 functions/ 폴더를 확인합니다. firebase.json에 다음 줄을 추가하여 다른 폴더를 지정할 수 있습니다.

"functions": {
  "source": "another-folder"
}

함수 삭제

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

  • Firebase CLI에서 functions:delete를 사용하는 명시적 방법
  • Firebase 콘솔에서 함수 목록의 컨텍스트 메뉴를 사용하는 명시적 방법
  • 배포 전에 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 deployindex.js를 파싱하고 파일에서 삭제된 함수를 프로덕션에서 삭제합니다. 비-대화형 모드로 배포하면 함수를 삭제할 수 없습니다.

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

프로덕션 트래픽을 처리하는 함수의 리전 또는 트리거의 이름을 바꾸거나 이를 변경하는 경우 수정 중에 이벤트가 손실되지 않도록 이 섹션의 단계를 따르세요. 변경 과정에서 새 버전 및 구 버전의 함수가 동시에 실행되므로 이 단계를 수행하기 전에 먼저 멱등 함수인지 확인해야 합니다.

함수 이름 바꾸기

함수의 이름을 바꾸려면 index.js로 이름을 변경한 새 버전의 함수를 만든 후 별도의 두 배포 명령어를 실행합니다. 첫 번째 명령어는 새로운 이름의 함수를 배포하고 두 번째 명령어는 이전에 배포한 버전을 삭제합니다. 예를 들어 webhook이라는 함수의 이름을 webhookNew로 변경하려면 다음과 같이 코드를 수정합니다.

// 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 함수를 개발하는 과정에서 여러 가지 이유로 함수의 트리거 유형을 변경해야 할 수 있습니다. 예를 들어 다음과 같은 경우가 있을 수 있습니다.

  • 이전 저장소 onChange 이벤트에서 onFinalize, onDelete, onArchive, onMetadataUpdate로 변경합니다. 자세한 내용은 베타-v1 또는 v2 업그레이드 가이드를 참조하세요.
  • Firebase 실시간 데이터베이스 또는 Cloud Firestore 이벤트의 유형을 변경합니다(예: 일반적인 onWrite 이벤트에서 상세한 onCreate 이벤트로 변경).

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

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

예를 들어 이전 onChange 이벤트 유형을 사용하는 함수 objectChangedonFinalize로 변경하려는 경우 우선 함수의 이름을 변경하고 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 함수를 사용하면 Node.js 런타임 버전과 함수별 제한 시간 및 메모리 할당 등의 런타임 옵션을 선택할 수 있습니다.

Node.js 버전 설정

Cloud 함수용 Firebase SDK 2.0.0 이상 버전에서는 Node.js 런타임을 선택할 수 있습니다. Node.js의 버전 6 또는 버전 8에서만 프로젝트의 모든 함수를 실행하도록 선택할 수 있습니다. Node.js 8 런타임은 현재 베타 버전이며 함수를 Node.js 8에 배포하려면 firebase-tools 4.0.0 이상 버전이 필요합니다.

초기화 중에 functions/ 디렉토리에 생성된 package.json 파일에 engines 필드를 추가해 버전을 설정합니다. 예를 들어 버전 8만 사용하려면 package.json을 수정해 다음 줄을 추가합니다.

  "engines": {"node": "8"}

또는 engines 필드를 완전히 생략하고 모든 함수에 Node.js 6(기본값)을 사용해도 됩니다.

제한 시간 및 메모리 할당 설정

함수에 제한 시간 값이나 메모리 할당을 늘리는 등의 특별한 요구사항이 있는 경우가 있습니다. 이러한 값은 Google Cloud Console 또는 함수 소스 코드(Firebase만 해당)에서 설정할 수 있습니다.

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

const runtimeOpts = {
  timeoutSeconds: 300,
  memory: '1GB'
}

exports.myStorageFunction = functions
  .runWith(runtimeOpts)
  .storage
  .object()
  .onFinalize((object) = > {
    // do some complicated things that take a lot of memory and time
  });

timeoutSeconds의 최대 값은 540 또는 9분입니다. 올바른 memory 값은 다음과 같습니다.

  • 128MB
  • 256MB
  • 512MB
  • 1GB
  • 2GB

Google Cloud Platform Console에서 메모리 할당 및 제한 시간을 설정하는 방법은 다음과 같습니다.

  1. Google Cloud Platform 콘솔의 왼쪽 메뉴에서 Cloud 함수를 선택합니다.
  2. 함수 목록에서 이름을 클릭해 함수를 선택합니다.
  3. 상단 메뉴에서 수정 아이콘을 클릭합니다.
  4. 할당 메모리라는 라벨이 지정된 드롭다운 메뉴에서 메모리 할당을 선택합니다.
  5. 더보기를 클릭해 고급 옵션을 표시하고 제한 시간 입력란에 초 단위 값을 입력합니다.
  6. 저장을 클릭해 함수를 업데이트합니다.