Cómo comenzar con las funciones sin servidor de DigitalOcean

Gráfico que muestra el logotipo de DigitalOcean

Functions es una de las últimas incorporaciones a la plataforma en la nube de DigitalOcean. Proporciona un método de primera clase para desarrollar funciones sin servidor sin salir de DigitalOcean. Su código se ejecuta a pedido cuando se lo llama, lo que elimina el aprovisionamiento y el mantenimiento manuales del servidor.

En este artículo, explicaremos qué admite DigitalOcean Functions y realizaremos una demostración de cómo crear su propia función simple. Funciones tiene un nivel gratuito que proporciona 25 GiB-hora por mes, con un GiB-segundo calculado como el consumo de memoria multiplicado por el tiempo de ejecución de cada llamada de función.

Funciones admitidas

Lanzado en mayo 2022, Functions ofrece a los clientes de DigitalOcean una opción integrada para ejecutar cargas de trabajo sin servidor. Cada función obtiene su propio extremo de API que ejecuta el código que ha creado. No tiene que configurar sus propios servidores ni contener el proyecto antes de la implementación. Las funciones en vivo están alojadas en el backend de la plataforma de aplicaciones de DigitalOcean.

Las funciones pueden integrarse con las bases de datos administradas de DigitalOcean para facilitar el almacenamiento persistente de datos. También vienen con una CLI integral que le permite implementar y probar su código en su terminal.

La versión inicial de la plataforma admite cinco entornos de programación diferentes:

  • Ir 1.17
  • Node.js 14
  • Node.js 14 (compatible con las funciones de AWS Lambda)
  • PHP 8
  • Pitón 3.9

Deberá sentirse cómodo escribiendo su código en uno de estos lenguajes para implementarlo como una función. Se podrían admitir más tiempos de ejecución en el futuro.

Preparándose

Es posible lanzar nuevas funciones utilizando el panel de control web de DigitalOcean o Doctl, su CLI orientada al desarrollador. Nos estamos enfocando en el enfoque Doctl basado en terminal para los propósitos de este artículo. Esto expone todas las capacidades de Funciones y es el camino previsto para todos excepto los casos de uso más simples. Asegúrese de tener la última versión de Doctl instalada y autenticada en su cuenta de DigitalOcean antes de continuar.

imagen de las funciones de DigitalOcean

Deberá completar algunos pasos de configuración adicionales si es la primera vez que utiliza las funciones de DigitalOcean. Primero termine la instalación de Doctl’s serverless extensión. Esto agrega soporte completo para desarrollar e implementar funciones.

$ doctl serverless install
Downloading...Unpacking...Installing...Cleaning up...
Done

A continuación, conecte las funciones sin servidor a su cuenta de DigitalOcean:

$ doctl serverless connect
Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co'

Ahora debería estar listo para comenzar a escribir funciones. ejecutar el serverless status Comando para comprobar que todo funciona:

$ doctl serverless status
Connected to function namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a' on API host 'https://faas-lon1-917a94a7.doserverless.co'
Sandbox version is 3.1.1-1.2.1

El resultado que se muestra arriba confirma que el soporte de funciones está instalado y listo para usar.

los serverless comando es un alias de sandbox. Al momento de escribir, las dos palabras clave tienen una funcionalidad idéntica y se usan indistintamente en la documentación de DigitalOcean. Estamos estandarizando serverless para esta guía.

Crear una función

Use el siguiente comando para crear un nuevo proyecto de funciones:

$ doctl serverless init --language js demo-project
A local sandbox area 'demo-project' was created for you.
You may deploy it by running the command shown on the next line:
  doctl sandbox deploy demo-project

Este comando crea una nueva función de JavaScript dentro demo-project en su directorio de trabajo. Inspeccione el contenido de este directorio para ver qué ha preparado Doctl para usted:

$ tree demo-project
demo-project
├── packages
│   └── sample
│       └── hello
│           └── hello.js
└── project.yml

3 directories, 2 files

los project.yml El archivo es donde configura su proyecto de funciones y los puntos finales que proporciona.

targetNamespace: ''
parameters: {}
packages:
  - name: sample
    environment: {}
    parameters: {}
    annotations: {}
    actions:
      - name: hello
        binary: false
        main: ''
        runtime: 'nodejs:default'
        web: true
        parameters: {}
        environment: {}
        annotations: {}
        limits: {}

La plantilla de inicio configura un paquete llamado sample. Dentro de este paquete, hay una sola acción (punto final) llamada hello que se ejecuta usando el tiempo de ejecución de Node. El código fuente para esta acción se almacena en packages/sample/hello/hello.js. Veamos este archivo a continuación:

function main(args) {
    let name = args.name || 'stranger'
    let greeting = 'Hello ' + name + '!'
    console.log(greeting)
    return {"body": greeting}
}

Este es un código JavaScript normal. los main() La función se invocará cada vez que se llame a su función. Recibe un objeto que contiene argumentos enviados como datos HTTP GET y POST en la solicitud del usuario. También puede configurar argumentos estáticos, usando el parameters campo en acciones, paquetes y el proyecto de nivel superior en su project.yml expediente.

Las funciones deben devolver un objeto que describa la respuesta HTTP al problema. los body El campo se convierte en los datos incluidos en la respuesta.

Invocación y despliegue de funciones

Este proyecto está listo para ejecutarse. Use este comando para implementar su función:

$ doctl serverless deploy .
Deploying '/home/james/@scratch/demo-project'
  to namespace 'fn-3c1d9001-8e04-44e8-9375-c22b13c4a41a'
  on host 'https://faas-lon1-917a94a7.doserverless.co'
Deployment status recorded in '.nimbella'

Deployed functions ('doctl sbx fn get <funcName> --url' for URL):
  - sample/hello

los serverless deploy El comando toma un argumento, la ruta al directorio que contiene sus funciones. Usar . cuando la raíz de su proyecto ya es su directorio de trabajo.

Ahora puede probar su función usando la CLI:

$ doctl serverless functions invoke sample/hello -p name:howtogeek
{
    "body": "Hello howtogeek!"
}

los -p El parámetro establece un argumento que se pasa a través de su código. Este ejemplo demuestra cómo el valor de retorno de su función se convierte en el cuerpo de la respuesta HTTP.

A continuación, intente realizar una solicitud de API real a su función. Puede descubrir su URL con el siguiente comando:

$ URL=$(doctl serverless functions get sample/hello --url)

Usar curl o su propio cliente HTTP favorito para llegar a este punto final:

$ curl $URL?name=howtogeek
Hello howtogeek!

los name El parámetro de cadena de consulta se ha pasado correctamente a la función.

Modificando su función

Hasta ahora estamos usando el código de muestra de DigitalOcean sin ninguna modificación. ¡Esto no lo llevará muy lejos en su viaje sin servidor! Edita tu hello.js archivo para que se vea así:

function main(args) {
    return {
        body: {
            value: (args.value * 2),
            timestamp: Date.now()
        },
        headers: {
            "Content-Type": "application/json"
        }
    };
}

Vuelva a implementar su función:

$ doctl serverless deploy .

Esta función duplica ingenuamente el número dado por el value parámetro de solicitud. También incluye una marca de tiempo con cada cuerpo de respuesta. los headers El campo se usa en el objeto de respuesta para aplicar un JSON correcto. Content-Type.

Puede llamar a esta función usando Doctl o curl en el mismo estilo que antes:

$ curl $URL?value=2
{
  "timestamp": 1654784122966,
  "value": 4
}

Volver a implementar manualmente su función después de cada cambio es tedioso y requiere mucho tiempo. ejecutar el watch comando mientras trabaja para implementar cambios automáticamente después de modificar sus archivos:

$ doctl serverless watch .
Watching '.' [use Control-C to terminate]

Mantenga la ventana de la terminal abierta mientras desarrolla su función. Cada nueva implementación registrará un mensaje para que sepa cuándo puede probar sus cambios. Esto facilita la iteración eficiente a medida que desarrolla sus funciones.

También puede transmitir registros desde sus funciones. Esto es invaluable cuando una función falla o no se comporta como esperaba. Ejecute este comando para acceder a los registros asociados con su función de demostración:

$ doctl serverless activations logs --follow --function sample/hello

Se imprimirá una nueva línea cada vez que llame a su función. Los registros también incluyen mensajes que su código emite a los flujos de error y de salida estándar del entorno.

Implementación en producción

los serverless deploy el comando es actualmente diseñado para uso de desarrollo solamente. Puede implementar en producción creando un repositorio de Git para su proyecto de funciones y ejecutándolo mediante la plataforma de aplicaciones de DigitalOcean.

Crea un nuevo proyecto en GitHub o GitLab y sube tu código:

$ git init
$ git remote add origin [email protected]:user/repo.git
$ git add .
$ git commit -m "initial commit"
$ git push -u origin master

imagen de la creación de una aplicación en DigitalOcean App Platform

A continuación, diríjase a su panel de control de DigitalOcean y haga clic en el enlace “Aplicaciones” en la barra lateral izquierda. Haga clic en el botón “Crear aplicación” que aparece. En la siguiente pantalla, siga las indicaciones para conectarse a su cuenta de GitHub y seleccione su nuevo repositorio. Presione el botón azul “Siguiente”.

imagen de la creación de una aplicación en DigitalOcean App Platform

DigitalOcean detectará automáticamente su repositorio como un proyecto de Functions si tiene un project.yml en su raíz. Haga clic en el botón “Saltar para revisar” para continuar.

imagen de una aplicación de funciones en DigitalOcean App Platform

La siguiente pantalla debería confirmar que se le facturará con el plan Functions.

imagen de una aplicación de funciones en DigitalOcean App Platform

Presione “Crear recursos” para aprovisionar su aplicación y comenzar su primera implementación. El progreso se mostrará en el tablero.

imagen de una aplicación de Functions que se implementa en DigitalOcean App Platform

Los puntos finales de su función estarán accesibles públicamente una vez que se complete la implementación. Puede encontrar el valor predeterminado de su aplicación ondigitalocean.app dominio desplazándose hacia abajo en la página Configuración de la aplicación en su tablero. En nuestro ejemplo, el dominio de la aplicación es sea-lion-app.7ougx.ondigitalocean.app.

imagen de encontrar el dominio de una aplicación en DigitalOcean App Platform

Las funciones se exponen automáticamente como URI que tienen el siguiente formato:

<app>.ondigitalocean.app/<function-package>/<function-action>

Puede invocar la función de muestra creada anteriormente realizando la siguiente solicitud:

$ curl https://sea-lion-app.7ougx.ondigitalocean.app/sample/hello?value=2
{
  "timestamp": 1654786505969,
  "value": 4
}

¡La función se ha implementado con éxito! Ahora puede usar la pestaña Dominios en la configuración de su aplicación para adjuntar un dominio personalizado en lugar del predeterminado.

Resumen

DigitalOcean Functions es el competidor más nuevo en el campo cada vez más concurrido de funciones sin servidor. La plataforma le permite desarrollar la funcionalidad del lado del servidor sin administrar máquinas virtuales o contener manualmente su código.

Functions proporciona una CLI integral para crear y probar sus terminales. Luego puede implementar sus funciones en la solución de plataforma de aplicaciones existente de DigitalOcean, ya sea como un proyecto independiente o como parte de una aplicación más grande.

Una vez que tenga una función básica operativa, puede consultar Documentación de DigitalOcean para empezar a configurar comportamientos más avanzados. Puede configurar variables de entorno, acciones múltiples y límites de recursos usando los campos en su project.yml archivo, que le brinda una ruta rápida y fácil para crear puntos finales bajo demanda relativamente complejos.