Noções básicas sobre o suporte do Edge para módulos Node.js

Você está lendo a documentação do Apigee Edge.
Acesse a documentação da Apigee X.
info

Qual versão do Node.js é compatível com o Apigee Edge?

No momento, o Edge é compatível com o Node.js 0.10.32.

Quais módulos padrão do Node.js são compatíveis com o Edge?

Use a tabela a seguir para determinar quais módulos padrão do Node.js estão incluídos no Edge. Em alguns casos, os módulos incluídos são parcialmente compatíveis. Esses são módulos integrados ao Node.js.

Módulo Status Observações
assert Compatível
buffer Compatível
child_process Restrito Uma exceção será gerada se houver uma tentativa de gerar um subprocesso. No entanto, "fork" é compatível para gerar subscripts.
cluster Desativado O método cluster.isMaster sempre retorna "true", e outros métodos não são implementados. Uma cópia de cada script do Node.js é implantada em cada processador de mensagens do Edge.
crypto Compatível
dns Compatível
domain Compatível
dgram Restrito Os aplicativos Node.js no ambiente do Apigee não poderão acessar serviços na Internet via UDP devido à nossa arquitetura de rede.
events Compatível
fs Restrito O acesso ao sistema de arquivos é restrito ao diretório em que o script foi iniciado: o diretório /resources/node. Os scripts do Node.js podem ler e gravar arquivos nesse diretório, por exemplo, como uma área de trabalho temporária, mas não há garantias de quanto tempo os arquivos vão persistir.
http Compatível O host virtual e o caminho para solicitações recebidas são especificados no proxy de API, não pelo módulo HTTP. Consulte "Entender o suporte aos módulos http e https" para mais informações.
https Compatível A criação de um servidor "https" é idêntica à de um servidor "http". Consulte "Entender o suporte para os módulos http e https" para mais informações.
module Compatível
net Restrito As tentativas de detectar conexões TCP de entrada vão gerar uma exceção.
path Compatível
module Compatível
process Parcialmente compatível Não há suporte para funcionalidades de manipulação de ID do usuário, associação a grupos e diretório de trabalho.
punycode Compatível
querystring Compatível
readline Desativado Não há uma entrada padrão para scripts em execução no Apigee Edge.
repl Desativado Não há uma entrada padrão para scripts em execução no Apigee Edge.
module Incluído
STDIO Compatível

A saída e o erro padrão são encaminhados para um arquivo de registro na infraestrutura do Apigee Edge. Para ver esses registros, clique no botão Registros do Node.js na interface de gerenciamento do Apigee Edge para seu proxy de API.

Não há uma entrada padrão para scripts em execução no Apigee Edge. No entanto, é possível transmitir argumentos usando o elemento ScriptTarget de TargetEndpoint. Consulte Configuração avançada de ScriptTarget para mais informações.

stream Compatível
string_decoder Compatível
timers Incluído
tls Compatível Os parâmetros do Transport Layer Security (TLS) funcionam basicamente da mesma forma que no Node.js normal. Consulte Usar o módulo TLS (SSL) do Node.js no Apigee Edge para mais detalhes.
tty Desativado Não há uma entrada padrão para scripts em execução no Apigee Edge.
url Compatível
util Compatível
vm Compatível
zlib Compatível

Outros módulos compatíveis

Esta seção lista módulos adicionais que não são compatíveis com o Node.js padrão, mas são compatíveis com o Trireme e o Trireme em execução no Apigee Edge. O Trireme é o contêiner Node.js de código aberto que é executado no Apigee Edge. Ele foi projetado para executar scripts do Node.js em uma máquina virtual Java (JVM). Todos esses módulos estão disponíveis no NPM.

Módulo Descrição
apigee-access Permite que aplicativos Node.js em execução na plataforma Apigee Edge acessem funcionalidades específicas do Apigee. Você pode usar este módulo para: acessar e modificar variáveis de fluxo, recuperar dados do repositório seguro e usar serviços de cache, cota e OAuth do Edge. Consulte também Como usar o módulo apigee-access.
trireme-support Permite que aplicativos Node.js aproveitem recursos específicos do Trireme. No momento, há apenas um recurso compatível: carregar módulos do Node.js criados em Java. Observação: o loadJars não é compatível com o Edge Cloud.
trireme-xslt Apresenta uma abstração do processamento de XLST. Ele foi projetado especificamente para a plataforma Trireme, permitindo o processamento eficiente de XSLT quando aplicativos Node.js são executados em Java.
trireme-jdbc Fornece acesso ao JDBC do Node.js. Observação: não compatível com o Edge Cloud. Para o Edge Private Cloud, é possível colocar arquivos JAR do JDPC no caminho de classe e usar este módulo.

Suporte para módulos Node.js usados com frequência

Restrições em scripts do Node.js

No entanto, o Edge impõe algumas restrições aos scripts do Node.js, como as seguintes:

  • Os aplicativos Node.js no ambiente do Apigee Edge não podem acessar serviços na Internet via UDP devido à arquitetura de rede de borda do Edge.
  • O acesso ao sistema de arquivos é restrito ao diretório em que o script do Node.js foi iniciado: o diretório /resources/node. Os scripts do Node.js podem ler e gravar arquivos nesse diretório, por exemplo, como uma área de trabalho temporária, mas não há garantias de quanto tempo os arquivos vão persistir.
  • As tentativas de detectar conexões TCP de entrada geram uma exceção.
  • Não há suporte para funcionalidades de manipulação de ID do usuário, associação a grupos e diretório de trabalho.
  • Para entrada padrão, você só pode transmitir argumentos usando o elemento ScriptTarget de TargetEndpoint. Consulte Configuração avançada de ScriptTarget para mais informações.
  • Para a saída padrão, você só pode usar o botão "Registros do Node.js" na interface de gerenciamento do Edge para seu proxy. Também é possível usar o comando "apigeetool getlogs". Para mais informações, consulte Como implantar um app Node.js independente.
  • Módulos que dependem de código nativo não são compatíveis.
  • Módulos que dependem de recursos do EcmaScript 6, como Promises e Generators, não são compatíveis.
  • As flags de ambiente de execução do Node.js, como "harmony-proxies", não são compatíveis.

Como definir restrições de conexão por IP no Edge para nuvem privada

O Edge para nuvem privada pode restringir o acesso do código Node.js a endereços IP que começam com "10.", "192.168" e localhost. Se você tentar acessar esses endereços IP, vai receber um erro no formulário:

{ [Error: connect EINVAL] message: 'connect EINVAL', code: 'EINVAL', errno: 'EINVAL', syscall: 'connect' }

Para modificar essas restrições, defina a propriedade conf_nodejs_connect.ranges.denied no arquivo message-processors.properties de cada processador de mensagens. Por padrão, essa propriedade tem o valor:

  • Edge 4.17.05 e versões anteriores: conf_nodejs_connect.ranges.denied=10.0.0.0/8,192.168.0.0/16,127.0.0.1/32
  • Edge 4.17.09 e versões mais recentes: conf_nodejs_connect.ranges.denied= (ou seja, sem restrições)

Para definir essa propriedade:

  1. Abra o arquivo message-processor.properties em um editor. Se o arquivo não existir, crie-o:
    > vi /<inst_root>/apigee/customer/application/message-processor.properties
  2. Defina a propriedade como quiser. Por exemplo, para negar o acesso apenas ao localhost:
    conf_nodejs_connect.ranges.denied=127.0.0.1/32
  3. Salve as alterações.
  4. Verifique se o arquivo de propriedades pertence ao usuário "apigee":
    > chown apigee:apigee /<inst_root>/apigee/customer/application/message-processor.properties
  5. Reinicie o processador de mensagens:
    > /<inst_root>/apigee/apigee-service/bin/apigee-service edge-message-processor restart

Entender o suporte para os módulos http e https

Todos os aplicativos Node.js em execução no Apigee Edge precisam usar o módulo http ou https para detectar solicitações recebidas. Se você implantar um script que não detecta solicitações recebidas, ele simplesmente será executado e encerrado.

O método listen dos módulos http e https no Node.js usa um número de porta como parâmetro. Exemplo:

svr.listen(process.env.PORT || 9000, function() {
   console.log('The server is running.');
});

Esse argumento "port" é obrigatório no Node.js, mas o Apigee Edge ignora esse parâmetro. Em vez disso, o proxy de API em que o script do Node.js é executado especifica o "host virtual" em que ele fica em espera, e o aplicativo Node.js usa esses mesmos hosts virtuais, assim como qualquer outro proxy do Apigee Edge.

Cada ambiente na Apigee tem pelo menos um host virtual. O host virtual define as configurações HTTP para conexão com a organização da Apigee. Todos os proxies de API em um ambiente compartilham os mesmos hosts virtuais. Por padrão, dois hosts virtuais estão disponíveis para cada ambiente: default e secure. Para mais informações, consulte Receber host virtual e Ciclo de vida de desenvolvimento de API.

O comando apigeetool deploynodeapp gera um wrapper de proxy do Apigee Edge em torno do aplicativo Node.js. Quando implantado, o aplicativo Node.js detecta atividade no host virtual padrão definido para o ambiente. O URL de um aplicativo Node.js sempre será http://{org_name}-{env_name}.apigee.net.

Como processar as solicitações recebidas

Assim como outros aplicativos do Apigee Edge, se o aplicativo proxy estiver configurado para detectar o host virtual secure, ele vai aceitar solicitações recebidas usando HTTPS.

Como processar solicitações de saída

Além de receber tráfego de entrada, os aplicativos Node.js no Apigee Edge podem usar os módulos http e https para fazer solicitações de saída como qualquer outro aplicativo Node.js. Esses módulos funcionam como sempre no Node.js.

Entender o suporte para o módulo tls

O Apigee Edge é compatível com o módulo tls do Node.js. Esse módulo usa o OpenSSL para fornecer Transport Layer Security (TLS) e/ou comunicação de fluxo criptografado Secure Socket Layer (SSL). É possível usar o módulo tls para criar conexões seguras com serviços de back-end de aplicativos Node.js em execução no Edge.

Para entender como o módulo tls funciona no Apigee Edge, é importante saber como os virtual hosts são usados no Apigee Edge. Cada ambiente na Apigee tem pelo menos um host virtual. O host virtual define as configurações HTTP para conexão com a organização da Apigee. Todos os proxies de API em um ambiente compartilham os mesmos hosts virtuais. Por padrão, dois hosts virtuais estão disponíveis para cada ambiente: default e secure. Para mais informações sobre hosts virtuais, consulte Receber host virtual e Ciclo de vida de desenvolvimento de API.

Agora, vamos ver como o Apigee Edge processa a comunicação TLS (SSL) para solicitações de entrada e saída em aplicativos Node.js:

Como processar as solicitações recebidas

Dependendo de como os hosts virtuais estão configurados para sua organização, o Edge oferece estas opções:

  • Se o proxy de API estiver configurado para escutar no host virtual default, ele aceitará solicitações via HTTP.
  • Se o proxy de API estiver configurado para detectar o host virtual secure, ele aceitará solicitações por HTTPS. O URL vai estar no domínio apigee.net, e um certificado SSL curinga para *.apigee.net será usado. Enquanto os apps fizerem solicitações ao domínio apigee.net, o certificado SSL será validado normalmente.

Como processar solicitações de saída

Você pode fazer solicitações de saída com o módulo tls da mesma forma que faria normalmente no Node.js. Basicamente, você precisa adicionar chaves e certificados do lado do cliente (arquivos .pem) ao diretório resources/node e carregá-los no seu script. Para informações sobre como usar o módulo tls e os métodos dele, consulte a documentação do módulo tls do Node.js.

Configuração avançada do ScriptTarget

Na definição <TargetEndpoint>, o elemento <ScriptTarget> usa outros parâmetros opcionais além de <ResourceURL>. Também é possível transmitir argumentos de linha de comando e variáveis de ambiente para um script do Node.js usando os parâmetros <EnvironmentVariables> e <Arguments>:
<TargetEndpoint name="default">
  <ScriptTarget>
     <ResourceURL>node://hello.js</ResourceURL>
     <EnvironmentVariables>
         <EnvironmentVariable name="NAME">VALUE</EnvironmentVariable> 
     </EnvironmentVariables>
     <Arguments>
         <Argument>ARG</Argument>
     </Arguments>
  </ScriptTarget>
</TargetEndpoint>