Após a implementação e configuração dos hooks do ciclo de vida da instância, o Function Compute invoca o hook correspondente para eventos específicos do ciclo de vida. Este tópico descreve como implementar esses hooks em uma imagem personalizada.
Contexto
O ciclo de vida da instância envolve os hooks Initializer e PreStop. O hook Initializer possui dois tipos: invoke code e execute instruction. Atualmente, apenas funções aceleradas por GPU suportam o tipo execute instruction. Para mais informações, consulte Configurar ciclo de vida da instância.
Os hooks do ciclo de vida da instância seguem as mesmas regras de faturamento das solicitações de invocação normais. No entanto, seus logs de execução estão disponíveis apenas em Real-time Log, Function Logs ou Advanced Logs, e não aparecem na Invocation Request List. Para mais informações, consulte Visualizar logs dos hooks do ciclo de vida da instância.
Atualmente, não é possível gravar logs de hooks do tipo execute instruction no Function Log.
Implementar métodos de callback
O Function Compute invoca o hook correspondente para eventos específicos do ciclo de vida da instância. Esse ciclo envolve os hooks Initializer e PreStop. O hook Initializer suporta dois tipos: invoke code e execute instruction. Não configure ambos simultaneamente; apenas um pode estar ativo por vez.
Invoke code
Ao configurar um hook do tipo invoke code, o sistema envia uma solicitação HTTP para sua função (como POST /initialize ou GET /pre-stop) quando uma instância inicia ou está prestes a parar. Trate essa solicitação no código da aplicação.
Caminho | Solicitação | Resposta esperada |
(Opcional) POST |
| Response body: Valor de retorno do hook Initializer da função. StatusCode
Nota Se um hook Initializer falhar ou atingir o tempo limite, o servidor sempre retornará um código de status HTTP 200. Para confirmar a falha, verifique o cabeçalho de resposta |
(Opcional) GET |
| Response body: Valor de retorno do hook PreStop da função. |
Para usar o hook Initializer em uma imagem personalizada, implemente a lógica para o caminho /initialize e o método POST no servidor HTTP. O mesmo se aplica ao hook PreStop, que exige lógica para o caminho /pre-stop e o método GET. O código de exemplo a seguir mostra uma implementação para um runtime Python 3.10 personalizado.
Implemente a lógica de /initialize apenas se configurar um hook Initializer. Caso contrário, o servidor HTTP nunca invocará o código correspondente. A mesma regra vale para o hook PreStop e o caminho /pre-stop.
import os
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/initialize', methods=['POST'])
def init_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC Initialize Start RequestId: " + rid)
# do your things
print("FC Initialize End RequestId: " + rid)
return "OK"
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE'])
def hello_world(path):
rid = request.headers.get('x-fc-request-id')
print("FC invoke Start RequestId: " + rid)
# do your things
print("FC invoke End RequestId: " + rid)
return "Hello, World!", 200, [('Function-Name', os.getenv('FC_FUNCTION_NAME'))]
@app.route('/pre-stop', methods=['GET'])
def prestop_invoke():
rid = request.headers.get('x-fc-request-id')
print("FC PreStop Start RequestId: " + rid)
# do your things
print("FC PreStop End RequestId: " + rid)
return "OK"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=9000)
O exemplo anterior demonstra uma inicialização bem-sucedida. Os exemplos a seguir mostram como um hook /initialize pode falhar em Python.
@app.route('/initialize', methods=['POST'])
def init():
raise Exception("hahaha")
return "OK", 200, []
@app.route('/initialize', methods=['POST'])
def init():
return "OK", 404, []
Execute instruction
Um hook do tipo execute instruction executa um comando para inicializar a instância após a inicialização. Use qualquer shell compatível com o ambiente de runtime da função, como /bin/bash, /bin/sh, /bin/csh ou /bin/zsh.
O console do Function Compute oferece duas opções predefinidas: /bin/bash e /bin/sh. Este tópico usa /bin/sh como exemplo.
#!/bin/sh
URL="http://localhost:7860"
REQUEST_PATH="sdapi/v1/txt2img"
JSON_DATA='{
"prompt": "",
"steps": 1,
"height": 8,
"width": 8
}'
temp_file=$(mktemp)
trap 'rm -f "$temp_file"' EXIT
if ! http_code=$(curl -s -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
-o "$temp_file" \
-X POST "$URL"/"$REQUEST_PATH"); then
echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
exit 1
fi
response=$(<"$temp_file")
echo "http code $http_code"
if [ "$http_code" -eq 200 ]; then
echo "$response" | jq -r '.' || printf "%s\n" "$response"
exit 0
else
echo "$response_body" \
| jq -c 'if type == "object" then . else {raw: .} end' 2>/dev/null \
| jq -s '{status: "http_error", code: $code, response: .[0]}' \
--arg code "$http_code" \
>&2
exit 1
fi
Um código de saída 0 indica sucesso; qualquer outro valor indica falha. Para facilitar a solução de problemas, grave detalhes do erro no erro padrão (stderr) dentro do script. Por exemplo, o trecho abaixo mostra como exibir detalhes do erro e definir o código de saída como 1 quando uma solicitação curl falha.
if ! http_code=$(curl -s -w "%{http_code}" \
-H "Content-Type: application/json" \
-d "$JSON_DATA" \
-o "$temp_file" \
-X POST "$URL"/"$REQUEST_PATH"); then
echo "{\"status\": \"curl_error\", \"code\": $curl_exit_code}" \
| jq . >&2
exit 1
fi
Códigos de erro de callback
Invoke code
Código de erro | Descrição |
400 |
|
404 | |
500 | O Function Compute reinicia a instância. |
Execute instruction
Se o código de saída for diferente de 0, a instrução falhará e não será reexecutada. Em seguida, o sistema retorna um erro.
Configurar hooks do ciclo de vida da instância
Faça login no console do Function Compute. No painel de navegação à esquerda, escolha .
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função desejada.
Na página de detalhes da função, clique em na aba Configuration. Na seção Instance Configuration, clique em Modify.
-
No painel Instance Configuration, configure o hook Initializer e defina o Initializer Timeout.
-
Invoke code

-
Execute instruction
O console fornece dois shells predefinidos:
/bin/bashe/bin/sh.
-
-
Ainda no painel Instance Configuration, configure o hook PreStop e defina seu tempo limite. Em seguida, clique em Deploy.

Visualizar logs dos hooks do ciclo de vida da instância
Atualmente, não é possível gravar logs de hooks do tipo execute instruction no Function Log.
Visualize os logs dos hooks em Function Logs.
Faça login no console do Function Compute. No painel de navegação à esquerda, escolha .
Na barra de navegação superior, selecione uma região. Na página Functions, clique em na função desejada.
-
Na página de detalhes da função, clique em na aba Test, clique em Test Function e escolha .
Na aba Function Logs, visualize os logs de invocação da função e os logs do hook Initializer. Exemplo:
2024-06-26 10:59:23FC Initialize Start RequestId: 529eab23-9b3a-4ffc-88c8-9a686******* 2024-06-26 10:59:23FC Initialize End RequestId: 529eab23-9b3a-4ffc-88c8-9a686******* 2024-06-26 10:59:25FC Invoke Start RequestId: 1-667b840c-15c49df0-b7dc1******* 2024-06-26 10:59:25FC Invoke End RequestId: 1-667b840c-15c49df0-b7dc1*******As instâncias da função permanecem em cache por um período e não são destruídas imediatamente, portanto, os logs do hook PreStop podem não aparecer de imediato. Para acionar o hook PreStop mais rapidamente, atualize a configuração ou o código da função. Após a conclusão da atualização, visualize o Function Logs novamente para ver os logs do hook PreStop. Exemplo:
2024-06-26 11:04:33FC PreStop Start RequestId: c4385899-f071-490e-a8b7-e33c5******* 2024-06-26 11:04:33FC PreStop End RequestId: c4385899-f071-490e-a8b7-e33c5*******