Funciones HTTP
Usa funciones de HTTP cuando desees invocar tu función mediante solicitudes HTTP(s). Para permitir la semántica de HTTP, las firmas de las funciones de HTTP aceptan argumentos específicos de HTTP.
Puedes configurar las funciones de HTTP para controlar si solo se pueden activar mediante HTTPS y HTTP, o solo HTTPS. Consulta Niveles de seguridad para obtener más información.
Ejecuta las muestras
Para ejecutar las muestras en este documento, asegúrate de haber configurado el entorno de ejecución como se describe en esta guía de inicio rápido. En especial, asegúrate de clonar el repositorio de muestra en tu máquina local para asegurarte de que todos los archivos necesarios estén presentes en tu entorno.
Ejemplo de uso
En el siguiente ejemplo, se muestra cómo procesar una solicitud HTTP POST que contiene un parámetro name
:
Node.js
Python
Go
Java
C#
Ruby
PHP
Con el siguiente comando, se muestra cómo llamar a la función y pasarle un parámetro mediante curl
:
curl -X POST HTTP_TRIGGER_ENDPOINT -H "Content-Type:application/json" -d '{"name":"Jane"}'
En el comando anterior, HTTP_TRIGGER_ENDPOINT
es la URL de la función, que se obtiene cuando esta se implementa. Para obtener más información, consulta Activadores de HTTP.
Pruébalo tú mismo
Si es la primera vez que usas Google Cloud, crea una cuenta para evaluar el rendimiento de Cloud Functions en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
Probar Cloud Functions gratisNiveles de seguridad
La función de nivel de seguridad controla si la URL de una función de HTTP es compatible solo con HTTPS o con HTTP y HTTPS. La asistencia solo para HTTPS es la predeterminada.
Cuando se configura una función de HTTP para que solo se pueda activar con HTTPS, se redireccionará a los usuarios que intenten usar el protocolo HTTP.
Especifica el nivel de seguridad de una función de HTTP durante la implementación de la siguiente forma:
Si usas Google Cloud CLI para implementar tu función, puedes configurar el nivel de seguridad de la función con la marca
--security-level
. Sus valores posibles sonsecure-optional
osecure-always
, que es el valor predeterminado. Por ejemplo:gcloud functions deploy
FUNCTION_NAME
--trigger-http --security-level=secure-optional...Si implementas tu función desde Cloud Console, usa la casilla de verificación Exigir HTTPS para activar o desactivar la función si requiere HTTPS.
Si la función se puede activar con HTTP o HTTPS, el código de la función puede examinar el valor del encabezado de la solicitud X-Forwarded-Proto para determinar el protocolo que se utilizó. Una solicitud segura tendrá el valor https para ese encabezado, mientras que otras solicitudes tendrán el valor http.
Frameworks de HTTP
Para controlar HTTP, Cloud Functions utiliza una versión del framework de HTTP particular en cada entorno de ejecución:
Entorno de ejecución | Framework de HTTP |
---|---|
Node.js | Express 4.17.1 |
Python | Flask 1.0.2 |
Go | Interfaz http.HandlerFunc estándar |
Java | API de Functions Framework para Java |
.NET | API de Functions Framework para .NET |
Ruby | Functions Framework para Ruby |
PHP | Functions Framework for PHP |
Finaliza funciones de HTTP
Si una función crea tareas en segundo plano (como subprocesos, futuros,
objetos Promise
de Node.js, devoluciones de llamada o procesos del sistema), debes finalizar
o resolver estas tareas antes de que se muestre una respuesta HTTP. Cualquier tarea
que no se finalice antes de una respuesta HTTP podría no completarse y también puede
causar un comportamiento indefinido.
Analiza solicitudes HTTP
En el siguiente ejemplo, se muestra cómo leer las solicitudes HTTP en varios formatos:Node.js
En Node.js, el cuerpo de la solicitud se analiza de forma automática según el encabezado content-type
y se encuentra disponible mediante los argumentos de la función de HTTP.
Python
Go
Java
C#
Ruby
PHP
Administra solicitudes de CORS
El uso compartido de recursos multiorigen (CORS) es una forma de permitir que las aplicaciones que se ejecutan en un dominio accedan al contenido de otro dominio, por ejemplo, cuando yourdomain.com
realiza solicitudes a region-project.cloudfunctions.net/yourfunction
.
Si CORS no está configurado correctamente, es probable que recibas errores similares a los siguientes:
XMLHttpRequest cannot load https://region-project.cloudfunctions.net/function. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://yourdomain.com' is therefore not allowed access.
Solicitud de comprobación previa
CORS consiste en dos solicitudes:
- Una solicitud de comprobación previa de
OPTIONS
- Una solicitud principal que sigue a la solicitud de
OPTIONS
La solicitud de comprobación previa contiene encabezados que indican qué método (Access-Control-Request-Method
) y qué encabezados adicionales (Access-Control-Request-Headers
) se enviarán en la solicitud principal, así como el origen de la solicitud principal (Origin
).
Para administrar una solicitud de comprobación previa, debes establecer los encabezados Access-Control-Allow-*
apropiados a fin de que coincidan con las solicitudes que deseas aceptar:
Node.js
Python
Go
Java
C#
Ruby
PHP
De manera alternativa, puedes usar una biblioteca de terceros para que administre CORS por ti.
Limitaciones
Las solicitudes de comprobación previa de CORS se envían sin un encabezado de Authorization
, por lo que se rechazarán en todas las funciones de HTTP no públicas. Como las solicitudes de verificación previa fallan, la solicitud principal también lo hará.
Las funciones de HTTP requieren autenticación de forma predeterminada, por lo que estas son las opciones para evitar esta limitación:
- Haz que tu función sea pública.
- Para que tu función sea pública, puedes implementarla con la marca
--allow-unauthenticated
o usar Console para otorgar la función de Invocador de Cloud Functions aallUsers
. Luego, administra CORS y la autenticación en el código de la función.
- Para que tu función sea pública, puedes implementarla con la marca
- Aloja tu app web y las funciones en el mismo dominio para evitar solicitudes de comprobación previa de CORS.
- Implementa un proxy de Cloud Endpoints y habilita CORS.
Aloja en el mismo dominio
En lugar de implementar CORS, podrías alojar tu sitio web y tus funciones en el mismo dominio. Puesto que las solicitudes ahora provendrían del mismo origen, CORS no se aplicará. Esta acción simplifica tu código de manera considerable.
La manera más sencilla de hacerlo es integrar Firebase Hosting a Google Cloud Functions.
Cómo usar Cloud Endpoints para controlar CORS
Puedes implementar un proxy de Cloud Endpoints y habilitar CORS.
Si deseas contar con capacidades de autenticación, también puedes habilitar la validación del token de ID de Google, lo que validará estos mismos tokens de autenticación.
Cómo controlar métodos de HTTP
Las funciones de HTTP aceptan todos los métodos de HTTP. En el siguiente ejemplo, se muestra cómo realizar diferentes acciones según el método de HTTP recibido (por ejemplo, GET
y PUT
):
Node.js
Python
Go
Java
C#
Ruby
PHP
Administra tipos de contenido
Para Node.js, Cloud Functions analiza los tipos de contenido del cuerpo de la solicitud de application/json
y application/x-www-form-urlencoded
como se muestra arriba. Los tipos de contenido de texto sin formato (text/plain
) se pasan como strings con UTF-8 como codificación predeterminada (o una codificación personalizada proporcionada en el encabezado content-type
).
Se puede acceder a otros tipos de contenido mediante la inspección del argumento de tu función de HTTP. Los métodos para hacerlo varían según el lenguaje.
En el siguiente ejemplo, se maneja una solicitud con un tipo de contenido de text/xml
:
Node.js
La propiedadrawBody
contiene bytes sin analizar del cuerpo de la solicitud.
Python
Go
Java
Datos multiparte
En el siguiente ejemplo, se muestra cómo procesar datos con un tipo de contenido multipart/form-data
. Según el lenguaje que hayas elegido, es posible que debas usar una biblioteca de análisis.
Node.js
Python
Go
Java
C#
Ruby
PHP
Sube archivos a través de Cloud Storage
Un caso práctico común de Cloud Functions es el procesamiento de archivos. Para archivos grandes o aquellos que requieren un almacenamiento continuo más allá del alcance de una sola solicitud, puedes usar Cloud Storage como un punto de entrada para tus cargas de archivos. Para lograrlo, debes generar una URL firmada que proporcione acceso de escritura temporal al bucket de Cloud Storage.
Si usas Cloud Functions directamente, genera una URL firmada con la biblioteca de cliente de Cloud Storage.El proceso para subir archivos a una función de Cloud Functions con Cloud Storage consta de tres pasos que se describen a continuación:
Los clientes llaman a una función de Cloud Functions directamente para recuperar la URL firmada.
Luego, los clientes envían los datos del archivo a la URL firmada a través de la solicitud HTTP PUT.
Se activa una segunda función de Cloud Functions mediante la mutación en el bucket de Storage para procesar aún más el archivo.
Puedes ver el siguiente ejemplo de uso de la biblioteca cliente de Cloud Storage para generar una URL firmada.
Cloud Functions tiene una “credencial de aplicación predeterminada” que, por lo general, no incluye el permiso iam.serviceAccounts.signBlob
. Para habilitar este permiso, primero será necesario que te asegures de que la cuenta de servicio de tu función tiene la función apropiada. Puedes hacer esto con Cloud Console o la herramienta de línea de comandos de gcloud
:
Console
Para asegurarte de que la cuenta de servicio de tu función tiene el rol apropiado, puedes modificar directamente los roles de IAM de una cuenta con los siguientes pasos:
- Ve a Google Cloud Console:
- Selecciona la cuenta correcta y elige Editor > Cuentas de servicio > Creador de token de cuenta de servicio.
gcloud
Para asegurarte de que la cuenta de servicio de la función tiene la función apropiada, ejecuta el siguiente comando. La función predefinida serviceAccountTokenCreator
tiene el permiso iam.serviceAccounts.signBlob
que necesitas:
gcloud projects add-iam-policy-binding YOUR_PROJECT \ --member serviceAccount:YOUR_SERVICE_ACCOUNT --role roles/iam.serviceAccountTokenCreator
Puedes determinar qué cuenta de servicio usan tus funciones mediante Cloud Console o la herramienta de línea de comandos de gcloud
:
Console
Sigue estos pasos para determinar la cuenta de servicio que usan tus funciones con Cloud Console:
Ve a Google Cloud Console:
En la lista, selecciona la función que quieres inspeccionar.
Puedes ver la cuenta de servicio en la página de detalles de la función.
gcloud
Para determinar la cuenta de servicio que usan tus funciones, ejecuta el siguiente comando y busca la propiedad serviceAccountEmail
:
gcloud beta functions describe YOUR_FUNCTION_NAME
A continuación, se muestra un ejemplo de cómo generar una URL firmada:
Node.js
Python
Go
Java
C#
Cuando el cliente sube un archivo a la URL firmada, puedes activar una segunda función desde esta mutación si quieres tomar medidas adicionales para la carga. Consulta el instructivo de Cloud Storage para obtener más información sobre cómo activar una función de Cloud Functions después de los cambios a un bucket de Cloud Storage.
Pasos siguientes
- Cómo implementar Cloud Functions.
- Cómo llamar a funciones de HTTP.
- Instructivo de funciones de HTTP de Cloud Functions