Um trigger do Simple Log Service (SLS) integra o SLS ao Function Compute invocando automaticamente uma função quando novos logs são gerados. Use um trigger do SLS para consumir incrementalmente os dados em um Logstore do SLS e executar tarefas de processamento personalizadas.
Casos de uso
-
Limpeza e processamento de dados
Use o SLS para coletar, processar, consultar e analisar logs rapidamente.
-
Envio de dados
Entregue dados de log para destinos, como produtos de big data na cloud ou services de terceiros, e crie pipelines de dados entre eles.
Como funciona
Um trigger do SLS corresponde a um job de ETL do SLS no Function Compute. Após a criação de um job de ETL do SLS, o SLS inicia um temporizador com base na configuração do job. Esse temporizador consulta as informações de shard no Logstore. Quando novos dados são gravados, o SLS gera uma tríade <shard_id, begin_cursor, end_cursor> como evento da função e a invoca.
Durante atualizações do sistema de armazenamento, pode ocorrer uma alteração de cursor mesmo sem gravação de novos dados. Nesse cenário, cada shard é acionado uma vez adicionalmente sem dados. Use o cursor na função para tentar obter os dados do shard. Se nenhum dado for retornado, a invocação será considerada um trigger vazio e poderá ser ignorada. Para mais informações, consulte Custom function development guide.
O mecanismo de trigger é baseado em tempo. Por exemplo, se você definir o intervalo de trigger do job de ETL como 60 segundos e houver gravação contínua de dados no Shard0 do Logstore, o shard acionará uma invocação de função a cada 60 segundos. Caso não haja gravação de novos dados no shard, nenhuma invocação será acionada. A entrada de cada invocação corresponde ao intervalo de cursores dos últimos 60 segundos. Na função, leia os dados do Shard0 com base no cursor para processamento subsequente.
A frequência de trigger apresenta as seguintes características:
Cada shard é acionado separadamente. O número total de invocações exibido para um Logstore pode ser elevado, mas o tempo real de trigger de cada shard ainda respeita o intervalo configurado. Por exemplo, se um Logstore possuir 10 shards, o processamento de dados em tempo real sem atraso de trigger resultará em 10 invocações de função a cada 60 segundos.
-
O intervalo de trigger de um único shard equivale ao intervalo de tempo dos dados processados em cada execução. Suponha que o intervalo de trigger seja de 60 segundos. Durante a execução da função, o intervalo de trigger se enquadra em dois casos:
Sem atraso de trigger: a função é acionada a cada 60 segundos conforme programado, e o intervalo de dados processados é
[now -60s, now).Com atraso de trigger: ocorre quando a posição atual de processamento do shard do SLS fica mais de 10 segundos atrás dos dados gravados mais recentemente. O trigger tenta compensar o atraso e pode ser disparado uma vez a cada 2 segundos. Cada invocação ainda processa uma janela de 60 segundos.
Funções de processamento de dados
A função invocada por um trigger do SLS pode ser de um dos seguintes tipos:
-
Funções de modelo
Para mais informações, consulte aliyun-log-fc-functions.
-
Funções personalizadas
O formato de configuração depende da implementação da função. Para mais informações, consulte ETL function development guide.
Pré-requisitos
-
Function Compute
-
Simple Log Service (SLS)
Crie um Project e dois Logstores. Um Logstore armazena os logs coletados. Como o Function Compute é acionado por logs incrementais, garanta que os logs possam ser coletados continuamente neste Logstore. O outro Logstore armazena os logs gerados pelo trigger do SLS.
O Project deve estar na mesma região do service Function Compute.
Etapa 1: Criar um trigger do SLS
Configure um trigger do SLS para obter periodicamente dados atualizados e invocar uma função que consuma incrementalmente os dados em um Logstore do SLS. Na função, execute tarefas de processamento personalizadas, como limpeza e processamento de dados, e entregue os dados a services de terceiros. Este exemplo demonstra apenas como obter dados de log e imprimi-los. A função usada para processamento de dados pode ser um modelo fornecido pelo SLS ou uma função personalizada. As etapas a seguir usam uma função personalizada.
Faça login no console do Function Compute. No painel de navegação à esquerda, escolha Functions > Functions.
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função que deseja gerenciar.
Na página Function Details, clique em na aba Trigger e em Create Trigger. No painel Create Trigger, defina Trigger Type como Log Service, configure os demais parâmetros e clique em OK.
| Parameter | Description | Example |
| Name | Nome personalizado para o trigger. Se este parâmetro for deixado em branco, o Function Compute gerará um nome de trigger automaticamente. | log_trigger |
| Version or Alias | Valor padrão: LATEST. Para criar um trigger para outra versão ou alias, primeiro mude para essa versão ou alias no canto superior direito da página Function Details. Para uma introdução sobre versões e aliases, consulte Manage versions e Manage aliases. | LATEST |
| Log Service Project | O Project do SLS a ser consumido. | aliyun-fc-cn-hangzhou-2238f0df-a742-524f-9f90-976ba457**** |
| Logstore | O Logstore a ser consumido. O trigger assina periodicamente os dados neste Logstore e os entrega à função para processamento personalizado. | function-log |
| Trigger Interval | Intervalo no qual o SLS invoca a função. Valores válidos: [3.600]. Unidade: segundos. Valor padrão: 60. | 60 |
| Retries | Número máximo de tentativas permitidas para um único trigger. Valores válidos: [0.100]. Valor padrão: 3. Nota Uma invocação é bem-sucedida quando | 3 |
| Trigger Log | Selecione um Logstore existente. Os logs gerados quando o SLS invoca a função são registrados neste Logstore. | function-log2 |
| Invocation Parameters | Para passar parâmetros personalizados, configure-os aqui. O valor é passado para a função como o campo parameter do evento. O valor deve ser uma string formatada em JSON. Valor padrão: vazio. | Nenhum |
| Role Name | Selecione AliyunLogETLRole. Nota Se esta for a primeira vez que você cria um trigger deste tipo, clique em OK e selecione Authorize Now na caixa de diálogo exibida. | AliyunLogETLRole |
Após a criação, o trigger aparece na aba Triggers. Para modificar ou excluir o trigger, consulte "Manage Triggers" no Guia do Usuário do Function Compute.
Etapa 2: Configurar permissões
A função (role) fornece as permissões do SLS necessárias para a execução da sua função.
-
Na página Function Details, clique em na aba Configuration. Na seção Advanced Settings, clique em Modify. No painel Advanced Settings, selecione uma Function Role.
Se sua função apenas ler dados de log, use a role padrão AliyunFCServerlessDevsRole, que possui permissões de somente leitura no SLS por padrão.
-
Caso sua função necessite de permissões além do acesso de somente leitura ao SLS, crie uma role personalizada do RAM que atenda aos dois requisitos abaixo:
a. Ao criar a role do RAM, defina Trusted entity como Cloud Service e Trusted service como Function Compute. Para mais informações, consulte Create a RAM role for a trusted Alibaba Cloud service.
b. Conceda à role do RAM as permissões do SLS exigidas pela sua função. Para mais informações, consulte Examples of custom RAM policies.
Clique em Deploy.
Etapa 3: Implantar a função e visualizar logs impressos
-
Na aba Code da página Function Details, escreva seu código no editor de código e clique em Deploy.
Este exemplo implanta uma função Python que executa as seguintes ações:
Obtém informações do evento do SLS, como
endpoint,projectName,logstoreNameebeginCursor, a partir deevent.Obtém as informações de credencial
accessKeyId,accessKeySecretesecurityTokendecontext.Inicializa o cliente do SLS com base nas informações obtidas.
Obtém os dados de log na posição de cursor especificada do Logstore de source. Use o código de exemplo a seguir como modelo inicial para a maioria dos cenários de processamento de logs.
""" This sample code is mainly doing the following things: * Get SLS processing related information from event * Initiate SLS client * Pull logs from source log store """ import logging import json from aliyun.log import LogClient logger = logging.getLogger() def handler(event, context): # Access keys can be fetched through context.credentials print("The content in context entity is: ", context) creds = context.credentials access_key_id = creds.access_key_id access_key_secret = creds.access_key_secret security_token = creds.security_token # parse event in object event_obj = json.loads(event.decode()) print("The content in event entity is: ", event_obj) # Get the name of log project, the name of log store, the endpoint of sls, begin cursor, end cursor and shardId from event.source source = event_obj['source'] log_project = source['projectName'] log_store = source['logstoreName'] endpoint = source['endpoint'] begin_cursor = source['beginCursor'] end_cursor = source['endCursor'] shard_id = source['shardId'] # Initialize client of sls client = LogClient(endpoint=endpoint, accessKeyId=access_key_id, accessKey=access_key_secret, securityToken=security_token) # Read data from source logstore within cursor: [begin_cursor, end_cursor) in the example, which contains all the logs trigger the invocation while True: response = client.pull_logs(project_name=log_project, logstore_name=log_store, shard_id=shard_id, cursor=begin_cursor, count=100, end_cursor=end_cursor, compress=False) log_group_cnt = response.get_loggroup_count() if log_group_cnt == 0: break logger.info("get %d log group from %s" % (log_group_cnt, log_store)) logger.info(response.get_loggroup_list()) begin_cursor = response.get_next_cursor() return 'success' Na página Function Details, escolha Logs > Function Logs para visualizar os dados mais recentes obtidos durante a execução da função. Se a mensagem The logging feature is not enabled for the current function. for exibida, clique em Enable. Você concluiu a configuração do trigger do SLS. Após o término do intervalo de trigger e a gravação de novos dados no Logstore de source, o trigger invocará a função e os logs da função aparecerão na página Function Logs. Verifique também o Logstore especificado no parâmetro Trigger Log na Etapa 1 para confirmar o disparo do trigger. Para depurar o código no console, siga as etapas abaixo.
(Opcional) Etapa 4: Testar a função com um evento simulado
Na aba Code da página Function Details, clique em no ícone
à direita de Test Function e selecione Configure Test Parameters na lista suspensa.No painel Configure Test Parameters, selecione Create New Test Event ou Modify Existing Test Event, insira um nome de evento e o conteúdo do evento e clique em OK. Ao criar um novo evento de teste, recomenda-se selecionar o modelo de evento Log Service. Para mais informações sobre os dados de teste, consulte event parameter.
Após configurar o evento simulado, clique em Test Function. Após a conclusão da invocação, visualize o resultado acima da aba Code.
Limites
A quantidade de triggers do SLS associados a um único Project não pode exceder cinco vezes o número de Logstores existentes nesse Project.
Não configure mais de cinco triggers do SLS para cada Logstore. Caso contrário, a eficiência da entrega de dados ao Function Compute pode ser afetada.
Parâmetros de entrada
context
Quando o Function Compute executa sua função, ele passa um objeto de contexto para o parâmetro de entrada context da função. Esse objeto contém informações sobre a invocação, o service, a função e o ambiente de execução.
Este tópico usa context.credentials para obter informações de credencial. Para mais informações sobre os campos disponíveis, consulte Context.
event
Após o disparo do trigger do SLS, os dados do evento são passados para o runtime. O runtime converte o evento em um objeto JSON e o transmite para o parâmetro de entrada event da função. O formato é o seguinte:
{
"parameter": {},
"source": {
"endpoint": "http://cn-hangzhou-intranet.log.aliyuncs.com",
"projectName": "fc-test-project",
"logstoreName": "fc-test-logstore",
"shardId": 0,
"beginCursor": "MTUyOTQ4MDIwOTY1NTk3ODQ2Mw==",
"endCursor": "MTUyOTQ4MDIwOTY1NTk3ODQ2NA=="
},
"jobName": "1f7043ced683de1a4e3d8d70b5a412843d81****",
"taskId": "c2691505-38da-4d1b-998a-f1d4bb8c****",
"cursorTime": 1529486425
}
| Parameter | Description |
parameter | Valor dos parâmetros de invocação especificados durante a criação do trigger. |
source | Informações sobre o bloco de logs lido pela função. Nota
|
jobName | Nome do job de ETL do SLS. Um trigger do SLS configurado para uma função corresponde a um job de ETL do SLS. Este parâmetro é gerado automaticamente pelo Function Compute. Não é necessário configurá-lo. |
taskId | Para um job de ETL, taskId é um identificador determinístico de uma invocação de função. Este parâmetro é gerado automaticamente pelo Function Compute. Não é necessário configurá-lo. |
cursorTime | Timestamp Unix no qual o último log chegou ao servidor do SLS. Unidade: segundos. |
Perguntas frequentes
Por que a frequência com que o trigger do SLS invoca a função às vezes é maior que o esperado?
Como cada shard é acionado separadamente, o número total de invocações para um Logstore pode parecer superior ao intervalo configurado. A frequência real de trigger de cada shard ainda corresponde ao intervalo definido. Para detalhes sobre o comportamento da frequência de trigger, consulte How it works.
denied by sts or ram, action: log:GetCursorOrData, resource: ****
Se este erro aparecer nos logs da função, as permissões podem não estar configuradas corretamente ou a política de acesso pode estar incorreta. Consulte Step 2: Configure permissions.
O trigger do SLS não invoca a função quando novos logs são gerados. O que devo fazer?
Verifique os seguintes itens:
Confirme se existem alterações incrementais de dados no Logstore configurado para a tarefa de trigger do Function Compute. A função é invocada quando há mudança nos dados do shard.
Analise os logs do trigger e os logs de execução da função em busca de exceções. Os logs do trigger são armazenados no Logstore especificado no parâmetro Trigger Log na Etapa 1.