Cómo trabajar con funciones
Una función es un fragmento de código sin estado que realiza tareas tal como las invocan las solicitudes HTTP. Con las funciones de IBM Code Engine, puede ejecutar la lógica empresarial de una forma escalable y sin servidor. Las funciones de IBM Code Engine proporcionan un entorno de ejecución optimizado para dar soporte a escenarios de baja latencia y escalado rápido. El código de función se puede escribir en un tiempo de ejecución gestionado que incluya versiones específicas de Node.js o Python.
Un paquete de códigos es una colección de archivos que representa el código de función. Este paquete de código se inyecta en el contenedor de tiempo de ejecución. El paquete de código lo crea Code Engine y se almacena en el registro de contenedor o en línea con la función. Un paquete de códigos no es una imagen de contenedor estándar de Open Container Initiative (OCI).
Antes de empezar
- Si desea utilizar la consola ' Code Engine ', vaya a ' resumen Code Engine.
- Si desea utilizar la CLI, configure el entorno de la CLI de Code Engine.
- Planifique y elija su enfoque para hacer que su código se ejecute como un componente de función Code Engine.
¿No está seguro de qué tipo de carga de trabajo de Code Engine crear? Consulte Planificación de Code Engine.
Limitaciones de función
- No hay soporte para suscribirse a productores de sucesos.
- No hay soporte para Terraform.
¿Cómo puedo hacer que mi código se ejecute como un componente de función Code Engine?
Tanto si su código existe como fuente en un archivo local o en un repositorio Git, como si su código es un paquete de código existente que se encuentra en un registro público o privado, Code Engine le proporciona una forma simplificada de ejecutar su código como una función.
-
Si estás empezando con código fuente que se encuentra en un repositorio Git, puedes elegir apuntar a la ubicación de tu fuente, y Code Engine se encarga de construir el paquete de código desde tu fuente y crear la función con una sola operación. En este caso, " Code Engine carga su código en " IBM Cloud® Container Registry. Para obtener más información, consulte Creación de una función a partir del código fuente del repositorio.
-
Si usted está comenzando con el código fuente en una estación de trabajo local, puede optar por apuntar a la ubicación de su fuente, y Code Engine se encarga de la construcción de la imagen de su fuente y la creación de la función con un solo comando CLI. En este caso, " Code Engine carga su código en " IBM Cloud® Container Registry. Para obtener más información, consulte Creación de la función a partir del código fuente local con la CLI.
-
Si está empezando con el código fuente, también puede ejecutar el código fuente en línea. En este escenario, pegue el código fuente al crear la función. Para obtener más información, consulte Creación de la función con código en línea.
Después de crear y ejecutar su función, también puede actualizar su función utilizando cualquiera de las formas anteriores, independientemente de cómo haya creado o actualizado previamente su función.
¿Qué sucede cuando invoco mi función?
Cuando se invoca (inicia) una función, la instancia de función correspondiente se inicializa con el contenedor de tiempo de ejecución y los parámetros de recurso configurados. El proceso de la primera inicialización se conoce como inicio en frío.
Para reducir la latencia de inicio en frío, Code Engine optimiza la invocación precalentando determinados tiempos de ejecución con configuraciones de CPU y memoria específicas. Las combinaciones precalentadas para las funciones incluyen las versiones Node.js 18 y Python 3.11, así como la combinación de CPU y memoria predeterminada para las funciones, que es 0.25 vCPU x 1 GB de memoria. Además, el sistema está diseñado para mejorar la reutilización de instancias de función que ya están inicializadas. Por lo tanto, una instancia de función se mantiene activa una vez finalizada la invocación para permitir invocaciones posteriores reutilizando la misma instancia y reutilizando el estado de la instancia cuando se completó la última invocación. No se garantiza la reutilización de una instancia de función.
¿Puedo mantener mi instancia de función activa durante más tiempo?
Con Code Engine, la función se escala hacia arriba y hacia abajo automáticamente, en función de la carga de trabajo. Cuando se crea la función con la combinación de CPU y memoria predeterminada, la función se inyecta en un contenedor "precalentado", que se optimiza para su uso. Cuando crea una función con una combinación de CPU y memoria distinta de la combinación predeterminada, la función se inyecta en un nuevo contenedor. De forma predeterminada, este contenedor se mantiene activo sólo durante un breve periodo de tiempo después de que se complete la función. Para obtener más información, consulte Combinaciones soportadas de CPU y memoria para funciones.
Puede cambiar la cantidad de tiempo que el contenedor se mantiene activo con la opción --scale-down-delay
en la CLI o la opción Retardo de escalado en la consola. Tenga en cuenta que si bien mantener activo el contenedor
reduce las horas de inicio en frío para cualquier ejecución posterior de la función, también se le facturará el tiempo que existe el contenedor de función personalizada.
Solicitudes y respuestas
Las funciones se invocan con el protocolo HTTP. Al invocar la función, puede especificar los parámetros de solicitud personalizada, el cuerpo de solicitud personalizada y las cabeceras, así como el método HTTP. Los parámetros de solicitud se ponen a disposición del código de función como parámetros de entrada. El código de función puede establecer el cuerpo de respuesta, las cabeceras de respuesta y el código de respuesta, que se devuelven al interlocutor desde el punto final de funciones.
Ejemplo 1: Generación de una respuesta HTML a partir de una función
El ejemplo siguiente ilustra cómo generar una respuesta HTML a partir de una función.
function main(params) {
var msg = 'You did not tell me who you are.';
if (params.name) {
msg = `Hello, ${params.name}!`
} else {
msg = `Hello, FaaS on CodeEngine!`
}
return {
headers: { 'Content-Type': 'text/html; charset=utf-8' },
body: `<html><body><h3>${msg}</h3></body></html>`
}
}
module.exports.main = main;
Ejemplo 2: Establecimiento de un código de respuesta y una cabecera de respuesta
La función puede establecer un código de respuesta específico y distintivos de cabecera. El ejemplo siguiente ilustra cómo puede establecer un código de respuesta y una cabecera de respuesta para añadir una redirección a un URL diferente.
function main(params) {
return {
headers: { location: 'https://cloud.ibm.com/docs/codeengine' },
statusCode: 302
}
}
Ejemplo 3: Generación de una respuesta de texto sin formato a partir de una función
El ejemplo siguiente ilustra cómo generar una respuesta de texto sin formato a partir de una función.
function main(params) {
var msg = 'You did not tell me who you are.';
if (params.name !== "") {
msg = `Hello, ${params.name}!`
}
return {
headers: { 'Content-Type': 'text/plain;charset=utf-8' },
body: `${msg}`
}
}
Manejo y depuración de errores
Las invocaciones de función pueden devolver errores del sistema o de la aplicación. Por ejemplo, los errores del sistema indican que el código de función no se ha ejecutado correctamente, mientras que los errores de aplicación indican un problema en el propio código de función.
Cuando se produce un error del sistema, se devuelve un código de respuesta HTTP similar a los códigos siguientes.
Código | Descripción |
---|---|
409 | Los recursos necesarios para la función no se han satisfecho. |
413 | La carga útil de solicitud supera el máximo definido. |
414 | El URI de invocación es demasiado largo. |
416 | La función ha generado una respuesta que supera el máximo definido. |
422 | El código de función no es válido y no puede procesarse. Consulte los registros de la plataforma para más detalles. |
424 | No se ha podido ejecutar el código de la función. Vuelva a intentarlo más tarde. |
429 | Ha superado la cuota de recursos, no ha podido planificar la función. |
431 | Las cabeceras de solicitud superan el máximo definido. |
500 | Error de servidor interno. |
502 | Pasarela errónea. |
503 | La función no está disponible actualmente; inténtelo de nuevo más tarde. |
507 | Almacenamiento insuficiente para cargar la función. |
Si Code Engine puede ejecutar el código de funciones, responde a la invocación con uno de los siguientes códigos de estado.
Código | Descripción |
---|---|
200 | Se ha aceptado la invocación de función, la función se ejecutará con retardo. |
202 | Invocación de función aceptada, la función se ejecutará de forma asíncrona. |
299 | La función ha superado el límite de tiempo de ejecución especificado o máximo y ha terminado anormalmente. |
Como desarrollador de una función, puede generar cualquier código de estado HTTP arbitrario, incluso los listados anteriormente. Por lo tanto, una cabecera de respuesta indica que el código de función ha generado el código de estado.
Las funciones Code Engine añaden las siguientes cabeceras de respuesta a la respuesta de invocación de función.
Código | Descripción |
---|---|
x-faas-actionstatus |
El código de estado HTTP establecido por la lógica del programa de función. |
x-faas-activation-id |
ID exclusivo para identificar la invocación de función. |
x-faas-result |
Un mensaje de success o un mensaje de error corto que devuelve el contenedor de tiempo de ejecución. |
x-faas-errormessage |
Un mensaje de error largo con detalles adicionales. |
x-faas-prewarmed |
Un mensaje que indica si la invocación era fría o si la función se ejecutaba en un contenedor existente (precalentado. Los valores posibles son false o true . |
Características de entrada/salida de datos de función
Para ejecutar la función en Code Engine, el código debe implementar un contrato de tiempo de ejecución con las características siguientes.
- Debe poder invocarse desde un punto final de aplicación web pública, para que pueda incrustarse en páginas web y luego invocarse desde cualquier Code Engine Fuente de eventos, un navegador web o cualquier otro cliente compatible con HTTPS.
- Debe implementar un procedimiento
main
como punto de entrada. El procedimientomain
puede recibir parámetros de entrada en forma de una estructura de datos con formato JSON y puede devolver parámetros de salida, también en forma de una estructura de datos con formato JSON. - Puede recibir una subvía de acceso opcional, para que la función pueda implementar diferentes tipos, basándose en la vía de acceso especificada. El procedimiento
main
de la función recibe la vía de acceso como un parámetro de entrada__ce_path
. - Puede recibir parámetros de consulta opcionales, que se pueden utilizar para configurar la función en tiempo de ejecución. El procedimiento
main
de la función recibe los parámetros como pares de clave-valor dentro de la estructura de datos de entrada con formato JSON. - Puede recibir cabeceras de solicitud, para que el código de cliente pueda especificar codificaciones aceptadas.
- Puede recibir una cabecera de solicitud de tipo de contenido opcional.
- Puede recibir una carga útil de solicitud opcional (cuerpo), que la función procesa en tiempo de ejecución. En función del tipo de contenido de solicitud seleccionado, la carga útil de datos se pasa al punto de entrada principal de la función,
ya sea en formato codificado en base 64 o "desplegado" como parte de la estructura de datos de entrada JSON. Los caracteres especiales en los pares de valores de claves de
application/x-www-form-urlencoded
entrada son valorespercent-encoded
. - Puede definir un código de estado HTTP arbitrario (opcional) que se devuelve al cliente que lo invoca.
- Puede establecer cabeceras de respuesta arbitrarias, como por ejemplo una ubicación de redirección, una codificación de respuesta o valores de cookie.
- Puede devolver un cuerpo de respuesta arbitrario con una codificación binaria o no binaria seleccionada; por ejemplo,
application/octet-stream
,application/json
,text/*
,image/*
oaudio/*
. Si no se establece ninguna cabecera de respuestacontent-type
, el valor predeterminado estext/plain
. - Da soporte a los siguientes tipos de contenido de solicitud:
application/x-www-form-urlencoded
(predeterminado),text/plain
,application/json
,application/octet-stream
,image/*
,audio/*
- No da soporte a la cabecera de solicitud
multipart/form-data
.
Opciones de visibilidad para una función Code Engine
Con Code Engine, puede determinar el nivel adecuado de visibilidad para su función mediante la definición de los puntos finales, o mapeos de dominio del sistema que están disponibles para recibir solicitudes.
Cada función tiene un mapeo interno del dominio del sistema que es visible para todos los componentes dentro del mismo proyecto Code Engine, pero no fuera del proyecto. Además de la correlación interna del dominio del sistema, puede optar por hacer que la función sea visible para la red pública de Internet o para la red privada de IBM Cloud.
Para una visibilidad pública o privada, la función se expone en un extremo HTTPS. Para obtener más información sobre el certificado TLS que se utiliza, consulte Certificados TLS para proyectos Code Engine.
Puede desplegar la función con los siguientes niveles de visibilidad:
Valor | Descripción |
---|---|
interno(proyecto) | Una función con este valor puede recibir solicitudes de componentes en el mismo proyecto Code Engine. Establecer un punto final interno (del proyecto) significa que su función no es accesible desde la Internet pública y que el acceso a la red sólo es posible desde otros componentes ' Code Engine ' que se estén ejecutando dentro del mismo proyecto ' Code Engine. Este punto final siempre está habilitado. Importante: Una función no puede invocar otro trabajo o aplicación utilizando las rutas internas. |
public | Una función con esta configuración está expuesta a Internet y a su proyecto Code Engine. Establecer un punto final público significa que su función puede recibir solicitudes de la Internet pública o de componentes dentro de su proyecto Code Engine. Este es el valor predeterminado. |
private | Una función con esta configuración se expone a la red privada ' IBM Cloud ' y a su proyecto ' Code Engine '. Establecer un punto final privado significa que su función no es accesible desde la Internet pública y que el acceso a la red sólo es posible desde otros servicios de ' IBM Cloud ' utilizando Puntos Finales Privados Virtuales (VPE) o componentes de ' Code Engine ' que se ejecuten en el mismo proyecto. |
Puede establecer la configuración del punto final para la visibilidad de una función desde la consola o con la CLI cuando cree y despliegue, o actualice su función.
Despliegue de la función con un punto final interno
Puede establecer la visibilidad de punto final para que la función se despliegue con un punto final interno (proyecto). Cuando establece un punto final interno (proyecto), no se puede acceder a la función desde Internet público y el acceso a la red sólo es posible desde otros componentes de Code Engine que se ejecutan en el mismo proyecto de Code Engine. Este punto final siempre está habilitado. Las funciones siguen siendo accesibles a través de componentes compartidos y, por tanto, deben estar protegidas.
Por ejemplo, si su solución consta de varias funciones dentro de un proyecto, podría configurar su solución de modo que sólo una de esas funciones sea visible desde Internet para que gestione el tráfico entrante. Esta función de cara al público puede delegar trabajo a otras funciones de su solución para que no tengan que ser visibles desde Internet.
Con la CLI, establezca la visibilidad de punto final para la función de modo que se despliegue con un punto final de proyecto utilizando la opción --visibility=project
en el mandato function create
o function update
. Puede obtener los URL disponibles para la función que reflejan la definición de punto final utilizando el mandato
function get
.
En la consola, establezca la visibilidad de los puntos finales para la función utilizando el valor Puntos finales al crear la función. Una vez desplegada la función, puede ver y modificar estos valores de correlación de dominio del sistema en el separador Correlaciones de dominio de la página Funciones.
Una función con este valor puede recibir solicitudes de componentes en el mismo proyecto Code Engine. Sin embargo, una función no puede invocar otro trabajo o aplicación utilizando las rutas internas.
Despliegue de la función con un endpoint público
Cuando despliega una función, de forma predeterminada, la función puede recibir solicitudes de Internet público o de componentes dentro del mismo proyecto Code Engine. En este caso, la función se despliega con un endpoint público.
Despliegue de su función con un endpoint privado
Puede establecer la visibilidad de punto final para que la función se despliegue con un punto final privado. Cuando establece un punto final privado para su función, no es accesible desde la Internet pública y el acceso a la red sólo es posible desde otros servicios " IBM Cloud " de puntos finales privados virtuales (VPE) o componentes " Code Engine " que se ejecutan en el mismo proyecto (cluster-local).
Por ejemplo, si su solución consiste en un componente que se ejecuta en un clúster IBM Cloud Kubernetes Service Clúster Kubernetes dentro de su propio punto final privado virtual y desea acceder a la función {{site {{site.data.keyword.codeengineshort}} desde la red privada IBM Cloud, puede establecer la visibilidad de la función en privada. Cuando la visibilidad de la función se establece en privada, la función no es accesible a través de la Internet pública. La función sigue siendo accesible desde otras funciones del proyecto.
Puede crear la función con un punto final privado para que la función sólo se exponga a través de la red privada IBM Cloud y no se exponga a la Internet externa. La función sigue siendo accesible a través de componentes compartidos desde dentro de la red interna y el punto final de la función debe estar protegido.
Con la CLI, establezca la visibilidad de punto final para la función de modo que se despliegue con un punto final privado utilizando la opción --visibility=private
en el mandato function create
o function update
. Puede obtener los URL disponibles para la función que reflejan la definición de punto final utilizando el mandato
function get
.
En la consola, establezca la visibilidad de los puntos finales para la función utilizando el valor Puntos finales al crear la función. Una vez desplegada la función, puede ver y modificar estos valores de correlación de dominio del sistema en el separador Correlaciones de dominio de la página Funciones.
Para obtener más información sobre la conexión a través de redes privadas, consulte Utilización de puntos finales privados virtuales con Code Engine.
Opciones para crear funciones
Conozca las opciones que puede especificar al crear su función. Tenga en cuenta que las opciones pueden variar entre la consola y la CLI.
Memoria y CPU
Cuando despliegas tu función, puedes especificar la cantidad de memoria y CPU que tu función puede consumir. Estas cantidades pueden variar, dependiendo de si tu función es intensiva en computación, intensiva en memoria o equilibrada.
Por defecto, a su función se le asignan 4 G de memoria y 1.0 vCPU. Para obtener más información sobre otras combinaciones de memoria y CPU soportadas, consulte Combinaciones de memoria y CPU soportadas para funciones.
Creación y ejecución de la función con variables de entorno
Puede definir y establecer variables de entorno como pares clave-valor que pueden ser utilizados por su función en tiempo de ejecución.
Puede definir variables de entorno cuando cree su función o cuando actualice una función existente con la CLI.
Para obtener más información sobre la definición de variables de entorno, consulte Cómo trabajar con variables de entorno.
Code Engine inyecta automáticamente ciertas variables de entorno en la función. Para obtener información adicional sobre las variables de entorno inyectadas automáticamente, consulte Variables de entorno inyectadas automáticamente.
Creación y ejecución de la función cuando se utilizan secretos y configmaps
En Code Engine, los secretos y configmaps pueden ser consumidos por tu función usando variables de entorno.
Tanto los secretos como los mapas de configuración son pares de clave-valor. Cuando se correlacionan con variables de entorno, las relaciones NAME=VALUE
se establecen de tal forma que el nombre de la variable de entorno corresponde
a la "clave" de cada entrada de esos mapas, y el valor de la variable de entorno es el "valor" de esa clave.
Su función puede utilizar variables de entorno para referenciar completamente un configmap (o secreto) o referenciar claves individuales en un configmap (o secreto).
Para obtener más información, consulte cómo hacer referencia a secretos utilizando variables de entorno y cómo hacer referencia a mapas de configuración utilizando variables de entorno.
Consideraciones sobre las cuotas de funciones
Cuando trabaja con aplicaciones, funciones y trabajos por lotes, estos recursos se ejecutan en el contexto de un proyecto Code Engine. Las cuotas de recursos se definen por proyecto y se aplican límites para aplicaciones, funciones y trabajos por lotes.
Para obtener más información sobre los límites de Code Engine, consulte Límites y cuotas de Code Engine.
Próximos pasos
Ahora que está familiarizado con los conceptos clave de trabajar con las funciones de Code Engine, ¿está preparado para crear y trabajar con funciones? Consulte los temas siguientes.
- Creación de cargas de trabajo de función con código en línea.
- Creación de cargas de trabajo de función con código fuente de repositorio.
- Creación de cargas de trabajo de función a partir del código fuente local.
Para más información sobre cómo trabajar con funciones, consulte los siguientes temas.