Desenvolvimento de uma função de evento
Introdução
Ao desenvolver uma função de evento usando uma imagem personalizada, implemente um servidor HTTP na imagem e ouça a porta 8000 para solicitações. Por padrão, o caminho de solicitação /init é a entrada de inicialização da função. Implemente-o conforme necessário. Para obter detalhes sobre a inicialização da função, consulte Inicializador. O caminho de solicitação /invoke é a entrada de execução da função onde os eventos de gatilho são processados. Para obter detalhes sobre os parâmetros de solicitação, consulte Fontes de eventos suportadas.
Passo 1: preparar o ambiente
Para executar as operações descritas nesta seção, verifique se você tem as permissões de FunctionGraph Administrator, ou seja, as permissões completas para o FunctionGraph. Para obter mais informações, consulte Gerenciamento de permissões.
Passo 2: criar uma imagem
Tome o sistema operacional Linux x86 de 64 bits como exemplo.
- Crie uma pasta.
mkdir custom_container_event_example && cd custom_container_event_example
- Implemente um servidor HTTP para processar init e invoke solicitações e dar uma resposta. Node.js é usado como exemplo.
Crie o arquivo main.js para introduzir o framework Express e implementar um manipulador de função (método POST e caminho /invoke e um inicializador (método POST e caminho /init).
const express = require('express'); const PORT = 8000; const app = express(); app.use(express.json()); app.post('/init', (req, res) => { console.log('receive', req.body); res.send('Hello init\n'); }); app.post('/invoke', (req, res) => { console.log('receive', req.body); res.send('Hello invoke\n'); }); app.listen(PORT, () => { console.log(`Listening on http://localhost:${PORT}`); });
- Crie o arquivo package.json para npm para que ele possa identificar as dependências do projeto e do projeto de processo.
{ "name": "custom-container-event-example", "version": "1.0.0", "description": "An example of a custom container event function", "main": "main.js", "scripts": {}, "keywords": [], "author": "", "license": "ISC", "dependencies": { "express": "^4.17.1" } }
- name: nome do projeto
- version: versão do projeto
- main: arquivo de entrada da aplicação
- dependencies: todas as dependências disponíveis do projeto em npm
- Crie um Dockerfile.
FROM node:12.10.0 ENV HOME=/home/custom_container ENV GROUP_ID=1003 ENV GROUP_NAME=custom_container ENV USER_ID=1003 ENV USER_NAME=custom_container RUN mkdir -m 550 ${HOME} && groupadd -g ${GROUP_ID} ${GROUP_NAME} && useradd -u ${USER_ID} -g ${GROUP_ID} ${USER_NAME} COPY --chown=${USER_ID}:${GROUP_ID} main.js ${HOME} COPY --chown=${USER_ID}:${GROUP_ID} package.json ${HOME} RUN cd ${HOME} && npm install RUN chown -R ${USER_ID}:${GROUP_ID} ${HOME} RUN find ${HOME} -type d | xargs chmod 500 RUN find ${HOME} -type f | xargs chmod 500 USER ${USER_NAME} WORKDIR ${HOME} EXPOSE 8000 ENTRYPOINT ["node", "main.js"]
- FROM: especificar a imagem de base node:12.10.0. A imagem de base é obrigatória e seu valor pode ser alterado.
- ENV: definir as variáveis de ambiente HOME (/home/custom_container), GROUP_NAME e USER_NAME (custom_container), USER_ID e GROUP_ID (1003). Essas variáveis de ambiente são obrigatórias e seus valores podem ser alterados.
- RUN: usar o formato RUN<Command>. Por exemplo, RUN mkdir -m 550 ${HOME}, que significa criar o diretório home para o usuário ${USER_NAME} durante a construção do contêiner.
- USER: alternar para o usuário ${USER_NAME}.
- WORKDIR: alternar o diretório de trabalho para o diretório home do usuário ${USER_NAME}.
- COPY: copiar main.js e package.json para o diretório home do usuário ${USER_NAME} no contêiner.
- EXPOSE: expor a porta 8000 do contêiner. Não altere este parâmetro.
- ENTRYPOINT: executar o comando node node /home/tester/main.js para iniciar o contêiner.
- Você pode usar qualquer imagem de base.
- No ambiente de nuvem, o UID 1003 e o GID 1003 são usados para iniciar o contêiner por padrão. Os dois IDs podem ser modificados escolhendo Configuration > Basic Settings > Container Image Override na página de detalhes da função. Eles não podem ser root ou um ID reservado.
- Crie uma imagem.
No exemplo a seguir, o nome da imagem é custom_container_event_example, a tag é latest e o ponto (.) indica o diretório em que o Dockerfile está localizado. Execute o comando de criação de imagem para empacotar todos os arquivos no diretório e enviar o pacote para um mecanismo de contêiner para criar uma imagem.
docker build -t custom_container_event_example:latest .
Passo 3: executar verificação local
- Inicie o contêiner do Docker.
docker run -u 1003:1003 -p 8000:8000 custom_container_event_example:latest
- Abra um novo prompt de comando e envie uma mensagem pela porta 8000 para acessar o diretório /init especificado no código do modelo.
curl -XPOST -H 'Content-Type: application/json' localhost:8000/init
As seguintes informações são retornadas com base no código do módulo:
Hello init
- Abra um novo prompt de comando e envie uma mensagem pela porta 8000 para acessar o diretório /invoke especificado no código do modelo.
curl -XPOST -H 'Content-Type: application/json' -d '{"message":"HelloWorld"}' localhost:8000/invoke
As seguintes informações são retornadas com base no código do módulo:
Hello invoke
- Verifique se as seguintes informações são exibidas:
Listening on http://localhost:8000 receive {} receive { message: 'HelloWorld' }
Como alternativa, execute o comando docker logs para obter logs de contêiner.
Passo 4: carregar a imagem
Passo 5: criar uma função
- Efetue logon no console do FunctionGraph. No painel de navegação, escolha Functions > Function List.
- Clique em Create Function no canto superior direito e escolha Select template.
- Defina as informações básicas.
- Function Type: selecione Event Function.
- Function Name: digite custom_container_event.
- Use container image: selecione a imagem carregada para SWR. Exemplo: swr.{ID de região}.myhuaweicloud.com/{nome da organização}/{nome da imagem}:{tag da imagem}
- Agency: selecione uma agência com a permissão SWR Admin. Se nenhuma agência estiver disponível, crie uma consultando Criação de uma agência.
- Após a conclusão da configuração, clique em Create Function.
- Na página de detalhes da função, escolha Configuration > Advanced Settings e ative Initialization. A API init será chamada para inicializar a função.
Passo 6: testar a função
- Na página de detalhes da função, clique em Test. Na caixa de diálogo exibida, crie um evento de teste.
- Selecione blank-template, defina o Event Name como helloworld, modifique o evento de teste da seguinte forma e clique em Create.
{ "message": "HelloWorld" }
Passo 7: ver o resultado da execução.
Clique em Test e visualize o resultado da execução à direita.
- Function Output: exibe o resultado do retorno da função.
- Log Output: exibe os logs de execução da função.
- Summary: exibe informações-chave dos logs.
Um máximo de 2 KB de logs podem ser exibidos. Para obter mais informações de log, consulte Consulta de logs de função.
Passo 8: exibir métricas de monitoramento
Na página de detalhes da função, clique na guia Monitoring.
- Na página de guia Monitoring, escolha Metrics e selecione um intervalo de tempo (como 5 minutos, 15 minutos ou 1 hora) para consultar a função.
- As seguintes métricas são exibidas: chamadas, erros, duração (incluindo as durações máxima, média e mínima) e aceleradores.
Passo 9: excluir a função
- Na página Detalhes da função, escolha Operation > Delete function no canto superior direito.
- Na caixa de diálogo exibida, clique em OK para liberar recursos.