Este tópico descreve os métodos de invocação, as limitações e os exemplos de código para funções em um custom runtime.
Informações básicas
Um custom runtime pode hospedar seu servidor HTTP. O Function Compute converte as solicitações de invocação de função em solicitações HTTP e as envia ao seu servidor HTTP. Em seguida, o Function Compute converte as respostas do seu servidor HTTP em respostas de invocação de função e as retorna ao cliente. A figura a seguir ilustra esse processo.
Você pode invocar uma função das seguintes maneiras:
Chamada HTTP (recomendado): invoque a função por meio de HTTP, utilizando, por exemplo, um gatilho HTTP ou um nome de domínio personalizado.
Chamada de API: invoque a função chamando a API InvokeFunction, como ao usar um SDK para invocar a função ou ao acioná-la por meio de uma source de evento.
Cada método de invocação resulta em formatos diferentes de solicitação e resposta no seu servidor HTTP.
Limites
É possível criar apenas um gatilho HTTP para cada versão ou alias de uma função. Para obter mais informações, consulte Gerencie versions e Gerencie aliases.
-
Limites de solicitação HTTP
-
Os cabeçalhos de solicitação não aceitam campos personalizados que começam com
x-fc-nem os seguintes campos personalizados:connection
keep-alive
-
Se uma solicitação exceder os limites abaixo, o sistema retornará um código de status
400e um código de erroInvalidArgument.Tamanho do cabeçalho: o tamanho total de todas as chaves e valores nos cabeçalhos não pode exceder 8 KB.
Tamanho do caminho: o tamanho total do caminho, incluindo todos os parâmetros de consulta, não pode exceder 4 KB.
Tamanho do corpo: o tamanho total do corpo da solicitação para uma invocação síncrona não pode exceder 32 MB. Para uma invocação assíncrona, o limite é de 128 KB.
-
-
Limites de resposta HTTP
-
Os cabeçalhos de resposta não aceitam campos personalizados que começam com
x-fc-nem os seguintes campos personalizados:connection
content-length
date
keep-alive
server
-
content-disposition:attachment
NotaPor motivos de segurança, ao usar o domínio padrão aliyuncs.com do Function Compute, o servidor adiciona obrigatoriamente o cabeçalho
content-disposition: attachmentaos cabeçalhos de resposta. Esse cabeçalho faz com que o navegador baixe a resposta como um anexo. Para remover essa restrição, configure a custom domain name.
-
Se uma resposta exceder os limites abaixo, o sistema retornará um código de status
502e um código de erroBadResponse.Tamanho do cabeçalho: o tamanho total de todas as chaves e valores nos cabeçalhos não pode exceder 8 KB.
-
-
Outras observações de uso
Para mapear diferentes caminhos de acesso HTTP para sua função, vincule um nome de domínio personalizado. Para obter mais informações, consulte Configure a custom domain name.
Chamada HTTP (recomendado)
Nas invocações HTTP, o Function Compute utiliza o modo de passagem direta. Ele encaminha a solicitação HTTP do cliente diretamente ao seu servidor HTTP e repassa a resposta do servidor HTTP de volta ao cliente. Alguns campos reservados pelo sistema não são repassados. Para obter mais informações, consulte Limits.
Cabeçalhos de solicitação
Ao invocar uma função usando um gatilho HTTP ou um nome de domínio personalizado, o Function Compute permite configurar cabeçalhos de solicitação para controlar o comportamento da requisição. A tabela a seguir descreve os cabeçalhos de solicitação suportados.
|
Name |
Type |
Required |
Example |
Description |
|
X-Fc-Invocation-Type |
String |
No |
Sync |
O método de invocação. Para obter mais informações, consulte Invocation methods. Valores válidos:
|
|
X-Fc-Log-Type |
String |
No |
Tail |
Os logs a serem retornados na resposta. Valores válidos:
|
Cabeçalhos de resposta
Quando você invoca uma função usando um gatilho HTTP ou um nome de domínio personalizado, a resposta contém alguns cabeçalhos que o Function Compute adiciona por padrão. A tabela a seguir descreve esses cabeçalhos de resposta.
|
Name |
Description |
Example |
|
X-Fc-Request-Id |
O ID da solicitação de invocação da função. |
dab25e58-9356-4e3f-97d6-f044c4**** |
Chamada de API
Para invocações realizadas por meio da API InvokeFunction, o Function Compute converte a solicitação InvokeFunction em uma solicitação HTTP e a envia ao seu servidor HTTP. As regras de conversão são as seguintes:
O parâmetro
eventdo InvokeFunction é convertido no corpo da mensagem da solicitação HTTP.O
pathé/invoke.O
methodéPOST.O cabeçalho de mensagem
Content-Typeéapplication/octet-stream.
O Function Compute converte a resposta do seu servidor HTTP na resposta do InvokeFunction e a retorna ao cliente. As regras de conversão são as seguintes:
O corpo da resposta HTTP é convertido no corpo da resposta do InvokeFunction.
Os cabeçalhos de resposta HTTP e o código de status são perdidos durante a conversão.
Exemplo de conversão de solicitação da API Invoke
|
Invoke request |
HTTP request (the request received by the HTTP server) |
|
Conteúdo da solicitação da API Invoke:
|
|
Exemplo de saída de resposta da API Invoke
|
HTTP response |
Invoke response |
|
|
|
|
Códigos de resposta e cabeçalhos de resposta do Function Compute
Um custom runtime é, essencialmente, um servidor HTTP implementado por você. Portanto, cada invocação de função corresponde a uma solicitação HTTP, e cada resposta inclui um código de resposta e cabeçalhos de resposta.
-
Código de resposta
StatusCode200: sucesso.404: falha.
-
Cabeçalho de resposta
x-fc-status200: sucesso.404: falha.
Utilize o cabeçalho de resposta x-fc-status para informar ao Function Compute se a função foi executada com sucesso.
-
Se você não definir
x-fc-status: o Function Compute assume, por padrão, que a invocação foi executada com sucesso. No entanto, sua função pode ter encontrado uma exceção que não foi reportada ao Function Compute. Nesse caso, o Function Compute considera a execução livre de erros. Isso pode não afetar sua lógica de negócios, mas impacta o monitoramento e a observabilidade. O código a seguir mostra um exemplo:print("FC Invoke Start RequestId: " + rid) data = request.stream.read() print("Path: " + path) print("Data: " + str(data)) # Simulate an exception to trigger a runtime error raise Exception("mock exception") print("FC Invoke End RequestId: " + rid) return "Hello, World!" if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
Se você definir
x-fc-status: caso sua função encontre uma exceção, use o cabeçalho de respostax-fc-statuspara reportar a falha de execução ao Function Compute. As informações da pilha de erros serão impressas nos logs. Conforme mostrado no exemplo a seguir, após definir o cabeçalho de respostax-fc-statuscomo404, o Function Compute identifica a invocação como uma execução com falha. O tipo de erro éInvocationError, e o resultado retornado émock exception. O código de exemplo em app.py é o seguinte:@app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): rid = request.headers.get(REQUEST_ID_HEADER) print("FC Invoke Start RequestId: " + rid) try: raise Exception("mock exception") except Exception as e: print("FC Invoke End RequestId: " + rid + ", Error: Unhandled Exception") print(str(e)) return str(e), 404, [{"x-fc-status", "404"}]
Na resposta HTTP retornada, recomendamos definir tanto StatusCode quanto x-fc-status.
Exemplo de código
Se houver um gatilho configurado para a função, você poderá implementar um servidor HTTP em qualquer linguagem. Este tópico usa Python como exemplo. O código de amostra é apresentado a seguir.
O código de exemplo depende de um ambiente Python e da biblioteca Flask. Recomendamos selecionar Web Function como método de criação da função e Python 3.10 como runtime.
import os
from flask import Flask
from flask import request
REQUEST_ID_HEADER = 'x-fc-request-id'
app = Flask(__name__)
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get(REQUEST_ID_HEADER)
data = request.stream.read()
print("Path: " + path)
print("Data: " + str(data))
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
A explicação do código de amostra é a seguinte:
@app.route('/', defaults={'path': ''}): a rota padrão, que corresponde ao caminho raiz.@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']): uma rota dinâmica com um parâmetro de caminho. Ela lida com solicitações GET, POST, PUT e DELETE. O valor do parâmetro de caminho é passado para a função hello_world como o argumento path.rid = request.headers.get(REQUEST_ID_HEADER): obtém o valor do campox-fc-request-idnos cabeçalhos da solicitação.data = request.stream.read(): lê o conteúdo da solicitação e o atribui à variável data.return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]: retorna um corpo de resposta contendo "Hello, World!", define o código de status como 200 e inclui um cabeçalhoFunction-Name.