Uma função de evento responde a vários eventos de services em cloud, como um upload de arquivo no Object Storage Service (OSS) ou um alerta disparado por um service de monitoramento. Ao usar uma função de evento, escreva apenas a lógica de processamento. Não é necessário gerenciar a integração de eventos nem os recursos computacionais subjacentes. O Function Compute executa uma instância somente quando necessário, dimensiona automaticamente e encerra a instância após o processamento do evento. A cobrança ocorre apenas pelos recursos utilizados.
Caso de uso
Suponha que você precise armazenar arquivos no OSS. Para acelerar os uploads, compacte os arquivos no formato ZIP antes do envio. No entanto, para usar os arquivos diretamente, e não os arquivos ZIP, é necessário um processo automatizado para descompactá-los e salvá-los novamente no OSS.
Uma abordagem tradicional exige criar e integrar vários programas para monitorar e lidar com alterações de arquivos no OSS, além de implantar e manter esses programas. Com uma função de evento, foque exclusivamente na lógica de processamento de arquivos. Cada vez que um arquivo é enviado ao OSS, um evento é gerado. Se o evento atender às condições especificadas, ele acionará automaticamente a função para executar seu handler. Após a conclusão da tarefa, o Function Compute libera automaticamente os recursos computacionais para reduzir custos.
Como talvez você não tenha um bucket do OSS, este tutorial usa um exemplo prático para orientar a implementação de uma função de evento.
Crie um evento simulado de upload de arquivo do OSS. Esse evento invocará uma função de evento para processar o arquivo e exibir informações, como o nome do arquivo e o nome do bucket, no console.
Neste tutorial, você aprenderá a:
Usar o console para criar uma função de evento, escrever um handler e testar a função de ponta a ponta.
Compreender conceitos essenciais, como o runtime do Function Compute e o runtime integrado.
Entender os parâmetros do handler event e context.
Pré-requisitos
Registre uma conta Alibaba Cloud
Registre uma conta Alibaba Cloud e conclua a autenticação de nome real.
Ative o Function Compute
Se sua conta Alibaba Cloud foi registrada e verificada em ou após 27 de agosto de 2024, use o Function Compute diretamente, sem ativação prévia. Ao fazer logon no console do Function Compute pela primeira vez, solicite um teste gratuito seguindo as instruções na tela. Para mais informações, consulte Teste Gratuito.
Caso sua conta Alibaba Cloud tenha sido registrada antes de 27 de agosto de 2024, siga estas etapas para ativar o service.
Acesse a página do product Function Compute.
-
Clique em Console para abrir a página de ativação. Clique em Buy Now para ativar o service e acesse o console do Function Compute.
-
(Opcional) Ao fazer logon no console do Function Compute pela primeira vez, clique em OK na caixa de diálogo Alibaba Cloud Service Authorization para criar uma função vinculada ao service. Isso permite que o Function Compute acesse outros services em cloud.
Após a criação da função, o Function Compute poderá acessar seus recursos em cloud, como VPC, ECS, Simple Log Service (SLS) e Container Registry. Para mais informações sobre a função vinculada ao service, consulte Função vinculada ao service.
Procedimento
Etapa 1: Selecione o tipo de função
Faça logon no console do Function Compute. No painel de navegação à esquerda, escolha . Na barra de navegação superior, selecione a região onde deseja criar a função, clique em Create Function e, em seguida, selecione e crie uma Event Function conforme solicitado.
Etapa 2: Selecione um runtime
Python
Em Runtime, selecione Built-in Runtimes > Python > Python 3.10.
Recomendamos o uso de um runtime integrado para funções de evento. Os runtimes integrados incluem as dependências necessárias para responder a eventos de outros services em cloud (por exemplo, o módulo oss2 do Python). Para mais informações, consulte Visão geral do ambiente . Caso utilize um runtime personalizado ou um Custom Container runtime , instale as dependências manualmente. Para obter uma comparação detalhada dos runtimes, consulte Selecionar um runtime .
Node.js
Em Runtime, selecione Built-in Runtimes > Node.js > Node.js 20.
Recomendamos o uso de um runtime integrado para funções de evento. Os runtimes integrados incluem as dependências necessárias para responder a eventos de outros services em cloud (por exemplo, o módulo ali-oss do Node.js). Para mais informações, consulte Visão geral do ambiente . Caso utilize um runtime personalizado ou um Custom Container runtime , instale as dependências manualmente. Para obter uma comparação detalhada dos runtimes, consulte Selecionar um runtime .
Etapa 3: Crie a função
Selecione o modelo Hello, world! para criar a função. Mantenha os valores padrão em Advanced Settings e clique em Create.
Após a criação da função, visualize o código de exemplo gerado no WebIDE, na aba Code. Abaixo está o código de exemplo para Python.
# -*- coding: utf-8 -*-
import logging
import json
# To enable the initializer feature (https://www.alibabacloud.com/help/document_detail/2513452.html)
# please implement the initializer function as below:
# def initializer(context):
# logger = logging.getLogger()
# logger.info('initializing')
def handler(event, context):
# evt = json.loads(event)
logger = logging.getLogger()
logger.info('hello world')
return 'hello world'
O código de exemplo Hello, world! gera automaticamente um modelo de função com um ponto de entrada. Desenvolva seu código de negócios com base neste modelo nas etapas subsequentes.
Etapa 4: Modifique e implante o código de exemplo
Linguagens compiladas, como Java, não suportam o WebIDE; elas exigem compilação local e upload do pacote de código.
Python
No WebIDE do console, abra index.py, substitua o código existente pelo código abaixo e clique em Deploy.
index.py
# -*- coding: utf-8 -*-
import logging
import json
# import oss2 # Uncomment this line if you need to create an OSS client.
logger = logging.getLogger()
def handler(event, context): # The handler is the entry point for code execution.
logger.info("Parsing event information...")
input_events = json.loads(event)
if not input_events.get('events'): # Check the format of the input event.
raise Exception("Invalid event format: The events array does not exist or is empty.")
event_obj = input_events['events'][0]
bucket_name = event_obj['oss']['bucket']['name'] # Parse the OSS bucket name.
object_name = event_obj['oss']['object']['key'] # Parse the file name.
region = context.region # Parse the function region.
logger.info(f"OSS bucket name: {bucket_name}, File name: {object_name}, Region: {region}")
# If you have an OSS bucket, you can uncomment the following line to create an OSS client instance.
# bucket = get_bucket(region, bucket_name, context)
bucket = None
result = process_event(bucket, object_name) # Call a helper function to execute the event processing logic.
return result
def process_event(bucket, object_name):
logger.info("Starting event processing...")
# You can write your event processing logic here.
# zip_file = download_file(bucket, object_name)
# result = extract_and_upload(bucket, zip_file)
logger.info("Event processing completed.")
result = 0
return result # A return value of 0 indicates that the event is successfully processed.
# def get_bucket(region, bucket_name, context):
# # Create an OSS bucket client instance here. The required identity authentication information can be obtained from the context.
# creds = context.credentials # Obtain the temporary key.
# auth = oss2.StsAuth(
# creds.access_key_id,
# creds.access_key_secret,
# creds.security_token)
# endpoint = f'oss-{region}-internal.aliyuncs.com'
# bucket = oss2.Bucket(auth, endpoint, bucket_name)
# return bucket
# def download_file(bucket, object_name):
# # This is the sample code for downloading a file from OSS.
# try:
# file_obj = bucket.get_object(object_name)
# return file_obj
# except oss2.exceptions.OssError as e:
# logger.error(f"Failed to download the file: {e}")
# def extract_and_upload(bucket, file_obj):
# # You can define the logic for decompressing and uploading files to OSS here.
# return 0;
Detalhes do código
-
def handler(event, context):
-
handler: Esta função Python é o handler. Seu código pode incluir várias funções Python, mas o handler é sempre o ponto de entrada. Mantenha o nome do handler inalterado para que o Function Compute possa localizá-lo corretamente. Para mais informações, consulte O que é um handler?.
No console do Function Compute, na página de detalhes da função, clique na aba Function Details, selecione a subaba Configuration para visualizar ou editar o campo Request Handler. O formato do campo é [filename].[function_name], por exemplo index.handler.
event: Quando um evento aciona a função, informações sobre o evento, como o nome do bucket e o nome do arquivo para um evento de upload de arquivo do OSS, são passadas através do parâmetro event. Este parâmetro é um objeto JSON. Para mais informações sobre o conteúdo do parâmetro event para diferentes tipos de gatilhos, consulte Formato de evento de gatilho.
context: O objeto context é passado para sua função através do parâmetro context. Ele contém informações sobre a invocação, configuração da função e autenticação. As informações de autenticação derivam das permissões da função configurada para a função. Após configurar uma função, o Function Compute (FC) obtém uma chave temporária (token STS) chamando a operação AssumeRole e passa a chave para sua função no campo credentials do objeto context. Para mais informações, consulte Conceder permissões ao Function Compute para acessar outros services em cloud usando uma função. Para saber quais informações o objeto context contém, consulte Contexto.
logger.info(): Use os recursos padrão de log de uma linguagem de programação para gerar logs. Em Python, por exemplo, use métodos do módulo logging para gravar informações nos logs. Este exemplo usa uma instrução para imprimir o nome do Bucket, o nome do arquivo e o nome da Região. Após a chamada da função, visualize a saída de log no console. Para mais informações, consulte Logs.
Node.js
No WebIDE do console, abra index.mjs, substitua o código existente pelo código abaixo e clique em Deploy.
index.mjs
'use strict';
// import OSSClient from 'ali-oss'; // Uncomment this line if you need to create an OSS client.
export const handler = async (event, context) => { // The handler is the entry point for code execution.
console.log("Parsing event information...");
const inputEvents = JSON.parse(event);
if (!Array.isArray(inputEvents.events) || inputEvents.events.length === 0) { // Check the format of the input event.
throw new Error("Invalid event format: The events array does not exist or is empty.");
}
const eventObj = inputEvents.events[0];
const bucketName = eventObj.oss.bucket.name; // Parse the OSS bucket name.
const objectName = eventObj.oss.object.key; // Parse the file name.
const region = context.region; // Parse the function region.
console.log(`OSS bucket name: ${bucketName}, File name: ${objectName}, Region: ${region}`);
// If you have an OSS bucket, you can uncomment the following line to create an OSS client instance.
// const bucket = getBucket(region, context)
const bucket = null;
const result = processEvent(bucket, objectName); // Call a helper function to execute the event processing logic.
return result;
};
async function processEvent (bucket, objectName) {
console.log("Starting event processing...");
// You can write your event processing logic here.
// const zipFile = downloadFile(bucket, objectName);
// const result = extractAndUpload(bucket, zipFile);
console.log("Event processing completed.");
const result = 0;
return result;
}
// function getBucket (region, context) {
// // Create an OSS bucket client instance here. The required identity authentication information can be obtained from the context.
// const bucket = new OSSClient({
// region: region,
// accessKeyId: context.credentials.accessKeyId,
// accessKeySecret: context.credentials.accessKeySecret,
// securityToken: context.credentials.securityToken
// });
// return bucket;
// }
// async function downloadFile (bucket, objectName) {
// try {
// // This is the sample code for downloading a file from OSS.
// const result = await bucket.get(objectName, objectName);
// console.log(result);
// return result;
// } catch (e) {
// console.log(e);
// }
// }
// async function extractAndUpload (bucket, zipFile) {
// // You can define the logic for decompressing and uploading files to OSS here.
// return 0;
// }
Detalhes do código
-
export const handler = async (event, context)
-
handler: Esta função Node.js é o handler. Seu código pode incluir várias funções Node.js, mas o handler é sempre o ponto de entrada. Mantenha o nome do handler inalterado para que o Function Compute possa localizá-lo corretamente. Para mais informações, consulte O que é um handler?.

event: Quando um evento aciona uma função, o parâmetro event transmite informações sobre o evento, como o nome do bucket e o nome do arquivo para um evento de upload de arquivo do OSS. Este parâmetro é um objeto JSON. Para saber quais informações estão incluídas no event para diferentes tipos de eventos, consulte Formato de evento de gatilho.
context: O objeto de contexto de runtime de uma função. Ele é passado para sua função através do parâmetro context e contém informações como invocação, configuração da função e autenticação de identidade. As informações de autenticação de identidade derivam das permissões da função configurada para a função. Após configurar uma função para a função, o FC obtém uma chave temporária (Token STS) chamando a operação AssumeRole. Em seguida, o FC passa a chave temporária para sua função através do campo credentials no objeto context. Para mais informações, consulte Usar uma função para conceder permissões ao Function Compute para acessar outros services em cloud. Para saber quais informações o objeto context contém, consulte Contexto.
console.log(): Use os recursos padrão de log de uma linguagem de programação, como o módulo console no Node.js, para imprimir informações em um log. O exemplo neste tópico usa uma instrução para imprimir o nome do bucket, o nome do arquivo e o nome da região. Após a invocação da função, visualize a saída de log no console. Para mais informações, consulte Logs.
Etapa 5: Teste a função
Para simular um upload de arquivo do OSS acionando uma função, defina um evento simulado e use-o para acionar a função.
Além de usar um evento simulado, use um evento real do OSS para acionar a função durante os testes. Para mais informações, consulte Próximas etapas .
-
Crie um evento simulado: Na página Function Details, clique na aba Code. Clique na seta suspensa à direita de Test Function e selecione Configure Test Parameters. Na lista Event Template, selecione OSS. O console gera automaticamente um evento simulado no mesmo formato de um evento real do OSS.
Personalize o Event Name e os valores dos parâmetros no objeto de evento, como o nome do bucket do OSS e o nome do arquivo. Ao terminar, clique em OK.
Exemplo de evento OSS simulado
Cole o seguinte conteúdo de evento de exemplo na caixa de texto de parâmetros de teste e prossiga com as operações subsequentes.
{
"events": [
{
"eventName": "ObjectCreated:PutObject",
"eventSource": "acs:oss",
"eventTime": "2024-08-13T06:45:43.000Z",
"eventVersion": "1.0",
"oss": {
"bucket": {
"arn": "acs:oss:cn-hangzhou:164901546557****:test-bucket",
"name": "test-bucket",
"ownerIdentity": "164901546557****"
},
"object": {
"deltaSize": 122539,
"eTag": "688A7BF4F233DC9C88A80BF985AB****",
"key": "source/example.zip",
"size": 122539
},
"ossSchemaVersion": "1.0",
"ruleId": "9adac8e253828f4f7c0466d941fa3db81161****"
},
"region": "cn-hangzhou",
"requestParameters": {
"sourceIPAddress": "140.205.XX.XX"
},
"responseElements": {
"requestId": "58F9FF2D3DF792092E12044C"
},
"userIdentity": {
"principalId": "164901546557****"
}
}
]
}
-
Na aba Code, clique em Test Function para acionar a função. Após a execução bem-sucedida, visualize a Response. Um valor de retorno 0 indica que o evento foi processado com sucesso. Clique em Log Output para ver os logs gerados durante a execução da função.
Ao testar uma função, o Function Compute passa o conteúdo do evento simulado para o handler handler através do parâmetro event e executa o código definido na etapa anterior para analisar o parâmetro event e processar o arquivo.
A saída de log exibe as seguintes informações principais: FunctionCompute python3 runtime inited, seguido por quatro entradas de log de nível [INFO]: Parsing event information..., OSS bucket name is test-bucket, file name is source/example.zip, Region is cn-hangzhou, Starting event processing..., Event processing completed..., indicando que a função analisou com sucesso as informações do evento OSS simulado e concluiu o processamento do arquivo.
Etapa 6: (Opcional) Limpe os recursos
O Function Compute cobra com base no uso real de recursos. Funções não invocadas não geram cobranças. No entanto, fique atento a outros products ou recursos em cloud associados à função, como dados armazenados no OSS e File Storage NAS (NAS).
Para excluir uma função, faça logon no console do Function Compute, escolha e selecione uma região. Na coluna Actions da função alvo, clique em Delete. Na caixa de diálogo, confirme que a função não possui recursos associados, como gatilhos, e então confirme a exclusão.
Próximas etapas
Agora você criou uma função de evento no console, modificou o handler e testou a função com um event simulado. Consulte as operações avançadas abaixo conforme suas necessidades de negócio:
-
Adicione um gatilho:
Como talvez você não tenha um bucket do OSS, este exemplo usa um evento de upload simulado do OSS para testes. Para cargas de trabalho reais, adicione um gatilho do OSS à função. Para mais informações, consulte Configurar um gatilho nativo do OSS.
Além do armazenamento de objetos, eventos de muitos services da Alibaba Cloud (como várias filas de mensagens, Tablestore e SLS) também podem acionar o Function Compute. Para obter uma lista de gatilhos suportados, consulte Visão geral de gatilhos.
Adicione dependências: Runtimes integrados incluem dependências comuns para processamento de eventos, mas podem não atender às suas necessidades em produção. A abordagem mais simples é empacotar seu código e dependências em um arquivo ZIP (um pacote de código) e implantá-lo no Function Compute. Para mais informações, consulte Implantar um pacote de código. Para reduzir o tamanho de um pacote de código e acelerar o cold start de uma função, use uma camada para gerenciar dependências. Para mais informações, consulte Criar uma camada personalizada.
Configure logs: Para facilitar a depuração, solução de problemas ou auditoria de segurança das funções, recomendamos configurar logs para suas funções. Para mais informações, consulte Configurar o recurso de log.
Referências
Além de usar o console, use a ferramenta de linha de comando Serverless Devs para realizar as operações anteriores. Para mais informações, consulte Início rápido.
-
Recomendamos os seguintes tutoriais para aprender mais sobre funções de evento: