Ao executar uma função, o Function Compute passa um objeto context.Context para o handler. Esse contexto permite que seu código acesse metadados de tempo de execução — como IDs de solicitação, credenciais temporárias, configurações da função e informações de prazo — sem chamadas adicionais à API.
Use o objeto de contexto quando precisar:
Ler metadados de invocação, como o ID da solicitação ou o ID da conta.
Acessar credenciais temporárias para chamar outros serviços da Alibaba Cloud (por exemplo, Object Storage Service (OSS)) sem codificar permanentemente um par de AccessKey.
Monitorar o tempo de execução restante antes que a função atinja o tempo limite.
Variáveis de contexto
As variáveis abaixo estão disponíveis no objeto fccontext. Para acessá-las, importe github.com/aliyun/fc-runtime-go-sdk/fccontext e chame fccontext.FromContext(ctx).
|
Variável |
Descrição |
|
|
ID exclusivo da invocação atual. Registre esse valor nos logs para facilitar a solução de problemas. |
|
|
Par de AccessKey temporário que o Function Compute gera ao assumir sua função vinculada ao serviço. O par tem validade de 36 horas. Use-o para chamar serviços como OSS diretamente do código da função, eliminando a necessidade de armazenar credenciais no próprio código. Para mais detalhes, consulte Conceder permissões ao Function Compute para acessar outros serviços da Alibaba Cloud. |
|
|
Metadados básicos da função invocada: nome, handler, limite de memória e período de tempo limite. |
|
|
Metadados do serviço ao qual a função pertence: nome, projeto e Logstore associados ao Simple Log Service (SLS), versão e alias. O campo |
|
|
ID da região onde a função é executada. Por exemplo, |
|
|
ID da conta Alibaba Cloud proprietária da função. |
Método de contexto
|
Método |
Descrição |
|
|
Prazo de execução da função como um timestamp UNIX em milissegundos. Chame |
Para consultar a estrutura de dados completa, acesse o repositório fc-runtime-go-sdk no GitHub.
Ler informações de contexto
Adicione context.Context como parâmetro no seu handler. Em seguida, chame fccontext.FromContext para extrair os campos específicos do Function Compute.
package main
import (
"context"
"encoding/json"
"log"
"github.com/aliyun/fc-runtime-go-sdk/fc"
"github.com/aliyun/fc-runtime-go-sdk/fccontext"
)
func main() {
fc.Start(echoContext)
}
func echoContext(ctx context.Context) (string, error) {
fctx, _ := fccontext.FromContext(ctx)
log.Println(fctx.AccountId)
log.Printf("%#v\n", fctx)
res, _ := json.Marshal(fctx)
return string(res), nil
}
Monitorar o tempo de execução restante
Use ctx.Deadline() para obter o prazo absoluto da invocação atual e calcular quanto tempo resta para sua função. O exemplo abaixo subtrai uma margem de 100 ms do prazo e interrompe o loop de trabalho antes que o tempo limite seja atingido.
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/aliyun/fc-runtime-go-sdk/fc"
)
func LongRunningHandler(ctx context.Context) (string, error) {
deadline, _ := ctx.Deadline()
fmt.Printf("now: %s\ndeadline: %s\n", time.Now().String(), deadline.String())
deadline = deadline.Add(-100 * time.Millisecond)
timeoutChannel := time.After(time.Until(deadline))
for {
select {
case <-timeoutChannel:
return "Finished before timing out.", nil
default:
log.Print("hello!")
time.Sleep(50 * time.Millisecond)
}
}
}
func main() {
fc.Start(LongRunningHandler)
}