Gerenciar a implantação de funções e as opções de ambiente de execução

Você pode implantar, excluir e modificar funções usando os comandos da Firebase CLI ou definindo opções de tempo de execução no código-fonte das suas funções.

Implantar funções

Para implantar funções, execute este comando da Firebase CLI:

$ firebase deploy --only functions

Se você encontrar erros de permissão ao implantar funções, verifique se os papéis do IAM apropriados estão atribuídos ao usuário que executa os comandos de implantação.

Por padrão, a Firebase CLI implanta todas as funções dentro de index.js ao mesmo tempo. Se o projeto tiver mais de cinco funções, recomendamos que você use a sinalização --only com nomes de função específicos para implantar apenas as funções editadas. Implantar funções específicas dessa forma acelera o procedimento e ajuda a evitar alcançar o limite de cotas de implantação. Exemplo:

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

Ao implantar um grande número de funções, talvez você exceda a cota padrão e receba mensagens de erro HTTP 429 ou 500. Para resolver isso, implante funções em grupos de 10 ou menos ou solicite um aumento de cota para a cota de solicitações de gravação por 100 segundos por usuário.

Consulte a Referência da Firebase CLI para ver uma lista completa de comandos disponíveis.

Por padrão, a Firebase CLI procura o código-fonte na pasta functions/. É possível especificar outra pasta adicionando as seguintes linhas em firebase.json:

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

Excluir funções

Funções implantadas previamente podem ser excluídas:

  • explicitamente na Firebase CLI com functions:delete
  • explicitamente usando o menu de contexto na lista de funções no Console do Firebase
  • implicitamente removendo a função de index.js antes da implantação.

Em todas as operações é necessário confirmar antes de remover a função da produção.

A exclusão explícita de funções na Firebase CLI aceita vários argumentos, como grupos de funções, e permite especificar uma função executada em uma região específica. Além disso, você pode substituir o prompt de confirmação.

# 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

Com a exclusão implícita de funções, firebase deploy analisa index.js e remove da produção todas as funções que foram removidas do arquivo.

Modificar o nome, a região ou o acionador de uma função

Se você estiver renomeando ou alterando a região ou o acionador para funções que estão manipulando o tráfego de produção, siga as etapas nesta seção para evitar a perda de eventos durante a modificação. Antes de prosseguir, verifique se a função é idempotente, já que a versão antiga e a nova serão executadas simultaneamente durante a modificação.

Renomear uma função

Para renomear uma função, crie uma nova versão renomeada da função em index.js e execute dois comandos de implantação separados. O primeiro comando implanta a função recém-nomeada e o segundo remove a versão implementada anteriormente. Por exemplo, se você tiver uma função chamada webhook e quiser alterá-la para webhookNew, revise o código da seguinte maneira:

// 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");
});

Em seguida, execute os seguintes comandos para implantar a nova função:

# 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

Alterar a região ou as regiões de uma função

Se você estiver alterando as regiões especificadas de uma função que processa tráfego de produção, poderá evitar a perda de eventos executando estas etapas na ordem a seguir:

  1. Renomeie a função e altere a região ou as regiões dela, conforme quiser.
  2. Implante a função renomeada, o que resulta na execução temporária do mesmo código nos dois conjuntos de regiões.
  3. Exclua a função anterior.

Por exemplo, se você tiver uma função chamada webhook que esteja atualmente na região de funções padrão de us-central1 e quiser migrá-la para asia-northeast1, primeiro será necessário modificar o código-fonte para renomear a função e revisar a região.

// 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");
    });

Em seguida, implante executando o comando:

$ firebase deploy --only functions:webhookAsia

Agora, há duas funções idênticas em execução: webhook está em execução em us-central1, enquanto webhookAsia está em execução em asia-northeast1.

Em seguida, exclua webhook:

$ firebase functions:delete webhook

Agora, há apenas uma função: webhookAsia, que está sendo executada em asia-northeast1.

Alterar o tipo de acionador de uma função

À medida que você desenvolve seu Cloud Functions para implantação do Firebase ao longo do tempo, pode ser necessário alterar o tipo de acionador de uma função por vários motivos. Por exemplo:

  • Altere do evento onChange de armazenamento legado para onFinalize, onDelete, onArchive e onMetadataUpdate. Saiba mais sobre isso no Guia de atualização da versão Beta à v1 ou v2.
  • Altere de um tipo de evento do Firebase Realtime Database ou do Cloud Firestore para outro, como o evento onWrite genérico para o evento onCreate granular.

Não é possível alterar o tipo de evento de uma função apenas alterando o código-fonte e executando firebase deploy. Para evitar erros, altere o tipo de acionador de uma função ao seguir este procedimento:

  1. Modifique o código-fonte para incluir uma nova função com o tipo de acionador desejado.
  2. Implante a função, o que resulta na execução temporária da função antiga e da nova.
  3. Exclua explicitamente a função antiga da produção usando o Firebase CLI.

Por exemplo, se você tiver uma função objectChanged com o tipo de evento legado onChange e quiser alterá-la para onFinalize, renomeie a função e edite-a para ter o tipo de evento 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);
});

Em seguida, execute os seguintes comandos para criar a nova função primeiro, antes de excluir a função antiga:

# 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

Definir opções de tempo de execução

Com o Cloud Functions para Firebase, você pode selecionar opções de tempo de execução, como a versão de tempo de execução do Node.js, o tempo limite por função e a alocação de memória.

Definir a versão do Node.js

O Firebase SDK para Cloud Functions 2.0.0 e versões posteriores permite uma seleção do ambiente de execução do Node.js. É possível executar exclusivamente todas as funções em um projeto no ambiente de execução correspondente a uma dessas versões compatíveis do Node.js:

  • Node.js 10
  • Node.js 8

Para definir a versão do Node.js:

Defina a versão no campo engines no arquivo package.json que foi criado no diretório functions/ durante a inicialização. Por exemplo, para usar apenas a versão 10, edite esta linha em package.json:

  "engines": {"node": "10"}

O campo engines é obrigatório. Ele precisa especificar uma das versões compatíveis do Node.js para que você possa implantar e executar funções. Atualmente, firebase init functions define esse campo como 8.

Fazer upgrade para o ambiente de execução do Node.js 10

Para fazer upgrade do ambiente de execução do Node.js 8 para o Node.js 10, siga as etapas a seguir:

  1. Altere o valor de engines de 8 para 10 no arquivo package.json criado no diretório functions/ durante a inicialização. Como mostrado acima, a entrada deve ter esta aparência: "engines": {"node": "10"}
  2. Se quiser, teste suas alterações usando o emulador do Firebase.
  3. Implante novamente as funções usando a Firebase CLI v8.1.0 ou posterior.

Definir tempo limite e alocação de memória

Em alguns casos, suas funções podem ter requisitos especiais para um valor de tempo limite longo ou uma grande alocação de memória. Você pode definir esses valores no Console do Google Cloud ou no código-fonte da função (somente no Firebase).

Para definir a alocação de memória e o tempo limite no código-fonte das funções, use o parâmetro runWith introduzido no SDK do Firebase para Cloud Functions 2.0.0. Essa opção de tempo de execução aceita um objeto JSON em conformidade com a interface RuntimeOptions, que define valores para timeoutSeconds e memory. Por exemplo, essa função de armazenamento usa 1 GB de memória e expira após 300 segundos:

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
  });

O valor máximo para timeoutSeconds é 540 ou 9 minutos. Estes são os valores válidos para memory:

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

Para definir a alocação de memória e o tempo limite no Console do Google Cloud Platform, siga as etapas a seguir:

  1. No Console do Google Cloud Platform, selecione Cloud Functions no menu localizado na parte esquerda.
  2. Clique no nome de uma função para selecioná-la em uma lista de funções.
  3. Clique no ícone Editar no menu na parte superior.
  4. Selecione uma alocação de memória no menu suspenso Memória alocada.
  5. Clique em Mais para exibir as opções avançadas e insira um número de segundos na caixa de texto Tempo limite.
  6. Clique em Salvar para atualizar a função.