Como migrar o Cloud Functions para ambientes de execução mais recentes do Node.js

Neste documento, descrevemos as diferenças entre as versões do ambiente de execução do Node.js para ajudar você a migrar o código do Cloud Functions.

Como migrar para um ambiente de execução mais recente

Para migrar para um ambiente de execução mais recente:

  1. Leia sobre seu ambiente de execução de destino neste documento para entender as diferenças que ele apresenta e faça as alterações necessárias no seu código. Especificamente, esteja ciente das alterações de variável de ambiente introduzidas no ambiente de execução do Node.js 10.
  2. Implante sua função, especificando o ambiente de execução Node.js de destino:

    gcloud functions deploy FUNCTION_NAME --runtime NODE_RUNTIME...

Diferenças no ambiente de execução do Node.js 14

O Node.js 14 apresenta alguns novos recursos e conceitos. Veja os destaques:

  • O Encadeamento opcional tem a seguinte aparência: {"hello": null}?.hello?.neat. Ele permite o acesso seguro a chaves profundas em objetos que podem não existir.
  • A combinação de valores nulos introduz ??, que é mais seguro do que usar || para atribuições, já elas avaliam null ou undefined apenas como false.

Saiba mais sobre os recursos do Node.js 14.

Diferenças no ambiente de execução do Node.js 12

O Node.js 12 usa npm ci, que sempre executa o script prepare em package.json.

As principais diferenças entre usar npm install e npm ci são:

  • O projeto precisa ter um package-lock.json ou npm-shrinkwrap.json existente.
  • Se as dependências no bloqueio de pacote não corresponderem às que em package.json, npm ci sairá com um erro em vez de atualizar o bloqueio de pacote.
  • Se um node_modules já estiver presente, ele será removido automaticamente antes de npm ci iniciar a instalação.

Para fazer upgrade do Node.js 10 para o Node.js 12, mova as dependências usadas em prepare de devDependencies para dependencies.

Para o Node.js 12 e versões posteriores, funções com limites de memória maiores que 2GiB exigem que os usuários configurem NODE_OPTIONS para ter max_old_space_size. Exemplo:

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Diferenças no ambiente de execução do Node.js 10

O ambiente de execução do Node.js 10 introduziu alterações que podem exigir que você modifique o código-fonte da função para usar os ambientes de execução mais recentes.

Para a maioria dos aplicativos, fazer upgrade do Node 8 para o Node 10 não envolverá alterações de código (a principal diferença são as alterações nas variáveis de ambiente no GCF).

O Node 10 introduz uma variedade de novos recursos interessantes, como iteradores assíncronos e uma API de arquivos baseada em promessas, além de melhorias de desempenho e patches de segurança.

Logging

Se você não usou JSON.stringify ao registrar objetos e/ou coleções no Node.js 8, é possível ver aumentos no volume de registros ao fazer upgrade para o Node.js 10. Isso pode resultar em custos adicionais. Recomendamos o uso de JSON.stringify para agrupar instruções de registro, como mostrado em Como gravar, ver e responder a registros.

Alterações nas variáveis de ambiente

O ambiente de execução do Node.js 10 introduziu alterações nas variáveis de ambiente predefinidas pelo ambiente de execução. Consulte Variáveis de ambiente definidas automaticamente para uma descrição completa das diferenças entre as variáveis de ambiente definidas pelo Node.js 10 e pelos ambientes de execução anteriores.

Para executar as funções mais antigas do Node.js no ambiente de execução do Node.js 10 e versões posteriores, talvez seja necessário fazer alterações em quaisquer variáveis de ambiente predefinidas que estejam em uso. Atualize o código para usar as variáveis de substituição sempre que possível ou defina-as ao implantar a função. Como prática recomendada, indicamos que você não use variáveis de ambiente que não foram definidas explicitamente.

As variáveis de ambiente a seguir não são mais configuradas pelo ambiente de execução do Node.js 10:

Variável de ambiente Migração
CODE_LOCATION Defina-a ao implantar a função. A localização do código é /srv.
ENTRY_POINT Em vez dela, use a variável de ambiente FUNCTION_TARGET.
GOOGLE_CLOUD_PROJECT Defina-a ao implantar a função.
GCP_PROJECT Defina-a ao implantar a função.
GCLOUD_PROJECT Defina-a ao implantar a função.
GOOGLE_CLOUD_REGION Defina-a ao implantar a função.
FUNCTION_REGION Defina-a ao implantar a função.
FUNCTION_NAME Em vez dela, use a variável de ambiente K_SERVICE.
FUNCTION_IDENTITY Defina-a ao implantar a função.
FUNCTION_MEMORY_MB Defina-a ao implantar a função.
FUNCTION_TIMEOUT_SEC Defina-a ao implantar a função.
FUNCTION_TRIGGER_TYPE Em vez dela, use a variável de ambiente FUNCTION_SIGNATURE_TYPE. Consulte Como usar variáveis de ambiente para mais detalhes.
OLDPWD Não está mais disponível.
SHLVL Não está mais disponível.

Diferenças no ambiente de execução do Node.js 8

A assinatura das funções em segundo plano foi alterada entre os ambientes de execução do Node.js 6 e do Node.js 8, continuando no Node.js 10.

Uma função em segundo plano do Node.js 6 pode ter a seguinte aparência:

exports.nodejs6BackgroundFunction = (event, callback) => {
  let data = event.data;
  let context = event.context;
  // ... the rest of your function
};

Observe que o argumento event contém propriedades data e context. No ambiente de execução do Node.js 10, as propriedades data e context foram extraídas do objeto event e agora estão incluídas como parte da assinatura da função:

exports.nodejs8AndAboveBackgroundFunction = (data, context, callback) => {
  // ... the rest of your function is unchanged
};

Essa alteração simplifica as referências aos objetos data e context anteriormente contidos no argumento event. Para mais informações, consulte Parâmetros da função em segundo plano.

Se você estiver usando a assinatura da função em segundo plano do Node.js 6, faça as seguintes alterações para executar sua função em um ambiente de execução Node.js mais recente:

  1. Altere a assinatura da função de (event, callback) para (data, context, callback).

  2. Altere as referências a event.data e event.context para data e context, respectivamente.

Suspensão de uso: Node.js 6 e Node.js 8

Os ambientes de execução do Node.js 6 e do Node.js 8 foram suspensos. Para garantir que suas funções estejam em uma versão compatível do Node.js, migre-as para o Node.js 10 ou superior.

Após 05/08/2020, as implantações de função que usam o Node.js 6 serão bloqueadas. As funções do Cloud que continuarem usando o Node.js 6 após esse período serão desabilitadas.