Cómo trabajar con Edge Functions
IBM Cloud® Internet Services Edge Functions le permite crear o modificar aplicaciones existentes, sin tener que configurar ni mantener la infraestructura, utilizando un entorno de ejecución sin servidor. Edge Functions se puede definir y cargar en el extremo de la nube para procesar solicitudes antes de que accedan al origen. CIS Edge Functions solo se puede utilizar para modificar solicitudes HTTP y respuestas, realizar solicitudes en paralelo o generar respuestas desde el extremo de la nube.
Funcionamiento de Edge Functions
Edge Functions asocia acciones a URI en base a un dominio definido. Esta asociación se denomina desencadenante. Las solicitudes de entrada a su sitio se interceptan en la nube y se comparan con los desencadenantes de su cuenta o dominio. Si el URL de la solicitud coincide con el URI del desencadenante, se ejecuta la acción asociada al desencadenante.
Las funciones de Edge se basan en la API de Service Worker disponible en los navegadores web modernos y utilizan la misma API siempre que es posible.
La API de nodo trabajador de servicio permite interceptar cualquier solicitud que se realice en el sitio. Cuando el JavaScript está manejando la solicitud, puede realizar el número de subsolicitudes que desee a su sitio o a otros sitios y, finalmente, devolver una respuesta al visitante.
A diferencia de los nodos trabajadores de servicio estándar, Edge Functions se ejecuta en servidores Edge de CIS, no en el navegador del usuario. Esto significa que puede confiar en que su código se ejecuta en un entorno seguro en el que no puede ser eludido por clientes malintencionados. También significa que el usuario no necesita utilizar un navegador moderno que admita nodos trabajadores de servicio; incluso puede interceptar solicitudes de clientes de API que no sean navegadores.
Internamente, Edge Functions utiliza el mismo motor de JavaScript V8 que se utiliza en el navegador Chrome para ejecutar los trabajadores en nuestra infraestructura. La V8 compila dinámicamente el código JavaScript en código de máquina ultra rápido, lo que mejora el rendimiento. Esto permite que el código se ejecute en microsegundos y que el servidor de edge ejecute miles de scripts por segundo.
Aunque Edge Functions utiliza V8, no utiliza Node.js. Las API de JavaScript que tiene a su disposición dentro de los nodos trabajadores han sido implementadas directamente por nosotros. Trabajar directamente con V8 permite que el código se ejecute de forma más eficiente y con los controles de seguridad necesarios para mantener seguros los clientes y la infraestructura.
Cómo trabajar con las propiedades de solicitud de Edge Functions
En este apartado se describen las API de tiempo de ejecución de Cloudflare para CIS Edge Functions. El tiempo de ejecución de Edge Functions proporciona las siguientes API de Cloudflare para que las utilicen los scripts que se ejecutan en el extremo de la nube.
Sintaxis del constructor
new Request(input [, init])
Parámetros del constructor
-
input
: puede ser una USVString que contiene el URL o un objetoRequest
existente. Tenga en cuenta que la propiedadurl
es inmutable, por lo que significa que si se modifica una solicitud y se cambia el URL, debe pasar el nuevo URL en este parámetro. -
init
(opcional): un objeto de opciones que contiene varios valores que aplicar a la solicitud. Las opciones válidas son:method
: el método de solicitud, como por ejemploGET
oPOST
headers
: un objetoHeaders
-
body
: el texto que desee añadir a la solicitud. Las solicitudes que utilizan los métodosGET
oHEAD
no pueden tener cuerpo. -
redirect
: la modalidad que se respeta cuando se capta la solicitud. El valor predeterminado para las solicitudes generadas desdefetchEvent
entrante del manejador de sucesos esmanual
. El valor predeterminado para solicitudes recién construidas (es decir,new Request (url)
) esfollow
. Opciones válidas:follow
: si se devuelve una respuesta de redirección a la captura, se activa otra captura en función de la cabeceraLocation
en la respuesta hasta que se devuelve un código que no sea de redirección. Por ejemplo,await fetch(..)
nunca podría devolver una redirección de301
.manual
: redirigir las respuestas devueltas de una captación.
-
Propiedades
Todas las propiedades de un objeto Request
de entrada (event.request
) son de solo lectura. Para modificar una solicitud, debe crear un objeto Request
y pasar las opciones que se deben modificar a su constructor.
body
: un objeto getter simple que exponeReadableStream
del contenido.bodyUsed
: un valor booleano que declara si se ha utilizado el cuerpo en una respuesta.cf
: un objeto que contiene los datos proporcionados por nuestros asociados en Cloudflare.headers
: contiene el objetoHeaders
asociado correspondiente a la solicitud.method
: el método de solicitud, como por ejemploGET
oPOST
, asociado a la solicitud.redirect
: la modalidad de redirección que se va a utilizar (follow
omanual
).url
: contiene el URL de la solicitud.
El objeto cf
Además de las propiedades del objeto Request
estándar, puede utilizar un objeto request.cf
para controlar la forma en que se aplican las características, así como otra información personalizada proporcionada por Cloudflare.
Por ejemplo:
if (request.cf.asn == 64512) {
return new Response('Block the ASN 64512 response')
}
Si utiliza https://cloudflareworkers.com para escribir y probar sus scripts, el contenido de request.cf
no está disponible en el modo de vista previa.
Debe estar en modalidad de producción para poder ejecutar dicho contenido.
Estas propiedades contienen información especial procedente de una solicitud de entrada para ayudarle con la lógica de la app. Todos los planes tienen acceso a:
asn
: ASN de la solicitud de entrada (por ejemplo,395747
).colo
: el código del aeropuerto de tres letras del centro de datos que ha alcanzado la solicitud (por ejemplo,"DFW"
).weight:
el peso solicitado por el navegador para la priorización de HTTP/2.exclusive:
el distintivo exclusivo HTTP/2 solicitado por el navegador (1 para navegadores basados en Chromium, 0 para otros).group:
ID de secuencia de HTTP/2 para el grupo de solicitud (distinto de cero solo para Firefox).group-weight
: peso de HTTP/2 para el grupo de solicitud (distinto de cero solo para Firefox).tlsCipher
: el cifrado correspondiente a la conexión con CIS (por ejemplo,"AEAD-AES128-GCM-SHA256"
).country
: el código de dos letras del país de la solicitud de entrada. El mismo valor se proporciona en la cabeceraCF-IPCountry
(por ejemplo,"US"
).tlsClientAuth
: defina este valor solo cuando esté habilitado para mTLS. El objeto tiene las siguientes propiedades:certIssuerDNLegacy
,certIssuerDN
,certIssuerDNRFC2253
,certSubjectDNLegacy
,certVerified
,certNotAfter
,certSubjectDN
,certFingerprintSHA1
,certNotBefore
,certSerial
,certPresented
,certSubjectDNRFC2253
tlsVersion
: la versión TLS de la conexión con CIS (por ejemplo,TLSv1.3
).
Los planes Estándar y Empresa tienen acceso a:
requestPriority
: la información de priorización solicitada por el navegador en el objeto de solicitud (por ejemplo,“weight=192;exclusive=0;group=3;group-weight=127”
).city
: ciudad de la solicitud de entrada (por ejemplo,"Austin"
).continent
: continente de la solicitud de entrada (por ejemplo,"NA"
).httpProtocol
: protocolo HTTP (por ejemplo,"HTTP/2"
).latitude
: latitud de la solicitud de entrada (por ejemplo,"30.27130"
).longitude
: longitud de la solicitud de entrada (por ejemplo,"-97.74260"
).postalCode
: código postal de la solicitud de entrada (por ejemplo,"78701"
).region
: Si se conoce, el nombre ISO 3166-2 de la región de primer nivel asociada a la dirección IP de la solicitud entrante. Si no se conoce, es una serie vacía (por ejemplo,"Texas"
).regionCode
: Si se conoce, el código ISO 3166-2 de la región de primer nivel asociada a la dirección IP de la solicitud entrante. Si no se conoce, es una serie vacía (por ejemplo,"TX"
).timezone
: huso horario de la solicitud de entrada (por ejemplo,"America/Chicago"
).
Todos los planes pueden establecer estas características en las solicitudes de salida.
-
cacheEverything
: esta opción obliga a CIS a almacenar en memoria caché la respuesta a esta solicitud, independientemente de las cabeceras que se ven en la respuesta. Esto equivale a establecer la regla de página "Cache Level" en "Cache Everything" (por ejemplo,true
). -
scrapeShield
: conmuta ScrapeShield (por ejemplo,false
). -
polish
: establecer la modalidad Polish de Cloudflare. Los valores posibles son "lossy", "lossless" u "off" (por ejemplo,lossless
). -
minify
: optimización del sitio web para habilitar/inhabilitar Cloudflare Autominify para varios tipos de archivo. El valor es un objeto que contiene campos booleanos correspondientes ajavascript
,css
yhtml
(por ejemplo,{ javascript: true, css: true, html: false }
). -
mirage
: optimización de imagen para habilitar/inhabilitar la duplicación de Cloudflare. Si especifica esta opción, el valor siempre debe serfalse
(por ejemplo,false
). -
cacheTtl
: esta opción obliga a CIS a almacenar en memoria caché la respuesta a esta solicitud, independientemente de las cabeceras que se ven en la respuesta. Esto equivale a establecer dos reglas de página: "Edge Cache TTL" y "Cache Level" (en "Cache Everything"; por ejemplo,300
). -
resolveOverride
: redirige la solicitud a un servidor de origen alternativo. Puede utilizar este valor para implementar el equilibrio de carga en varios orígenes (por ejemplo,us-east.example.com
).Por motivos de seguridad, el nombre de host establecido en
resolveOverride
se debe enviar por proxy en la misma zona de CIS de la solicitud de entrada. De lo contrario, el valor se pasa por alto. Los hosts CNAME están permitidos, por lo que, para resolver un host bajo un dominio diferente o un dominio de solo DNS, primero declare un registro CNAME dentro de la correlación de DNS de su propia zona con el nombre de host externo, establezca el proxy en CIS y luego establezca resolveOverride de modo que apunte a dicho registro CNAME.
Solo Empresa
cacheKey
: una clave de memoria caché de solicitud es lo que determina si dos solicitudes son "iguales" a efectos de almacenamiento en memoria caché. Si una solicitud tiene la misma clave de memoria caché que una solicitud anterior, se puede ofrecer la misma respuesta en memoria caché para ambas (por ejemplo,'some-key'
).cacheTtlByStatus
: esta opción es una versión de la característicacacheTtl
que elige un TTL en función del código de estado de la respuesta. Si la respuesta a esta solicitud tiene un código de estado que coincide, CIS se almacena en memoria caché durante el tiempo indicado y sustituye las instrucciones de memoria caché enviadas por el origen (por ejemplo,{ "200-299": 86400, 404: 1, "500-599": 0 }
). CIS sigue cumpliendo con los niveles de memoria caché estándar, por lo que, de forma predeterminada, esto modifica el comportamiento de la memoria caché para archivos estáticos. Si desea almacenar en caché activos no estáticos, debe establecer un nivel de caché de todo en caché utilizando una regla de página.
Un script de Edge Functions se ejecuta después de las características de seguridad de CIS, pero antes de todo lo demás. Por lo tanto, una secuencia de comandos de funciones de borde no puede afectar al funcionamiento de las funciones de seguridad (ya que ya están terminadas), pero puede afectar a otras funciones, como la optimización del tamaño de la imagen, o la forma en que la respuesta se almacena en caché en el borde.
La actualización del objeto cf
se parece a la modificación de una solicitud. Puede añadir el objeto cf
a una Request
pasando un objeto personalizado a fetch
.
// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })
Los valores no válidos o con nombres incorrectos en el objeto cf
se pasan por alto de forma silenciosa. Tenga cuidado cuando pruebe que está obteniendo el comportamiento que desea.
Casos prácticos de Edge Function
Estos ejemplos son sólo para fines de demostración y no están pensados para utilizarlos en producción.
- Pruebas A/B
- Añadir una cabecera de respuesta
- Agregar varias solicitudes
- Direccionamiento condicional
- Protección de enlaces dinámicos
- Respuestas sin origen
- Solicitudes POST
- Establecer una cookie
- Solicitudes firmadas
- Respuestas en streaming
- Equilibrador de carga personalizado con Edge Functions
- Almacenamiento en memoria caché utilizando la captación
- API de memoria caché