Cuando Function Compute ejecuta una función, pasa un objeto context.Context al handler. Este contexto le da a su código acceso a los metadatos del entorno de ejecución, como los identificadores de solicitud, las credenciales temporales, la configuración de la función y la información de tiempo límite, sin llamadas adicionales a la API.
Use el objeto de contexto cuando necesite:
Leer metadatos de invocación, como el identificador de solicitud o el identificador de cuenta.
Acceder a credenciales temporales para llamar a otros servicios de Alibaba Cloud (por ejemplo, Object Storage Service (OSS)) sin codificar de forma fija un par de AccessKey.
Controlar cuánto tiempo de ejecución queda antes de que la función alcance el tiempo de espera.
Variables de contexto
A continuación se muestran las variables disponibles en el objeto fccontext. Para obtenerlas, importe github.com/aliyun/fc-runtime-go-sdk/fccontext y llame a fccontext.FromContext(ctx).
|
Variable |
Descripción |
|
|
El identificador único de la invocación actual. Registre este valor en sus registros para simplificar la resolución de problemas. |
|
|
Un par de AccessKey temporal que Function Compute genera al asumir su rol vinculado al servicio. Este par tiene una validez de 36 horas. Úselo para llamar a servicios como OSS desde el código de su función; así no tendrá que almacenar credenciales en el propio código. Para más detalles, consulte Grant Function Compute permissions to access other Alibaba Cloud services. |
|
|
Metadatos básicos de la función invocada: nombre, handler, límite de memoria y periodo de tiempo de espera. |
|
|
Metadatos del servicio al que pertenece la función: nombre, proyecto y logstore de Simple Log Service (SLS) asociados, versión y alias. El campo |
|
|
El identificador de la región donde se ejecuta la función. Por ejemplo, |
|
|
El identificador de la cuenta de Alibaba Cloud propietaria de la función. |
Método de contexto
|
Método |
Descripción |
|
|
El tiempo límite de ejecución de la función como una marca de tiempo UNIX en milisegundos. Llame a |
Para consultar la estructura de datos completa, visite fc-runtime-go-sdk en GitHub.
Leer la información de contexto
Agregue context.Context como parámetro de su handler. Luego, llame a fccontext.FromContext para extraer los campos específicos de 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
}
Controlar el tiempo de ejecución restante
Use ctx.Deadline() para obtener el tiempo límite absoluto de la invocación actual y calcule cuánto tiempo le queda a su función. En el siguiente ejemplo se resta un margen de 100 ms al tiempo límite y se detiene el ciclo de trabajo antes de alcanzar el tiempo de espera.
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)
}