Funktionsweise von Edge-Funktionen

Mit den Edge-Funktionen von IBM Cloud® Internet Services können Sie in einer serverlosen Ausführungsumgebung Anwendungen erstellen oder vorhandene Anwendungen ändern, ohne Konfigurations- oder Wartungstasks für die Infrastruktur auszuführen. Edge-Funktionen können definiert und in die Cloud-Edge hochgeladen werden, um Anforderungen zu verarbeiten, bevor sie den Ursprung erreichen. CIS Edge-Funktionen können verwendet werden, um HTTP-Anforderungen und -Antworten zu ändern, parallele Anforderungen zu stellen oder Antworten von Cloud Edge zu generieren.

Edge-Funktionen verknüpfen Aktionen auf der Grundlage einer definierten Domäne mit URIs. Diese Zuordnung wird als _Auslöser_bezeichnet. Eingehende Anforderungen für Ihre Site werden am Cloud-Edge abgefangen und mit Auslösern in Ihrem Konto oder Ihrer Domäne abgeglichen. Wenn die Anforderungs-URL mit dem URI des Auslösers übereinstimmt, wird die mit dem Auslöser verknüpfte Aktion ausgeführt.

Edge-Funktionen basieren auf der Service Worker API, die in modernen Webbrowsern verfügbar ist, und verwenden nach Möglichkeit dieselbe API.

Die Service-Worker-API ermöglicht das Abfangen von Anforderungen, die an Ihre Site gerichtet sind. Sobald JavaScript die Anforderung bearbeitet, können Sie angeben, dass beliebig viele Unteranforderungen an Ihre Site oder andere Sites abgesetzt und schließlich eine Antwort an den Besucher Ihrer Site zurückgegeben wird.

Im Unterschied zu standardmäßigen Service-Worker-Instanzen werden Edge-Funktionen auf CIS-Edge-Servern ausgeführt und nicht im Browser des Benutzers. Das bedeutet, dass Sie darauf vertrauen können, dass Ihr Code in einer vertrauenswürdigen Umgebung ausgeführt wird, in der er nicht von böswilligen Clients umgangen werden kann. Darüber hinaus muss der Benutzer nicht unbedingt einen modernen Browser verwenden, der Service-Worker unterstützt. Es können sogar Anforderungen von API-Clients abgefangen werden, die keine Browser sind.

Intern arbeiten die Edge-Funktionen mit derselben JavaScript-Engine Version 8 wie der Chrome-Browser, um Worker in Ihrer Infrastruktur auszuführen. Version 8 kompiliert Ihren JavaScript-Code dynamisch in ultraschnellen Maschinencode und erhöht so die Leistung. Dadurch kann Ihr Code in Mikrosekunden ausgeführt werden und unsere Edge-Server können viele Tausend Scripts pro Sekunde ausführen.

Edge-Funktionen verwenden zwar V8, aber nicht Node.js. Die JavaScript-APIs, die Ihnen innerhalb der Mitarbeiter zur Verfügung stehen, werden von uns direkt implementiert. Die direkte Arbeit mit Version 8 ermöglicht eine effizientere Ausführung des Codes unter Einhaltung der erforderlichen Maßnahmen für die Sicherheit der Kunden und der Infrastruktur.

Mit Anforderungseigenschaften für Edge-Funktionen arbeiten

Im Folgenden werden die Cloudflare-Laufzeit-APIs für CIS-Edge-Funktionen erläutert. Die Laufzeit der Edge-Funktionen bietet die folgenden Cloudflare-APIs für die Verwendung durch Scripts im Cloud-Edge.

Konstruktorsyntax

new Request(input [, init])

Konstruktorparameter

  • input: Dies kann entweder ein Objekt 'USVString' sein, das die URL enthält, oder ein vorhandenes Objekt Request. Beachten Sie, dass die Eigenschaft url nicht veränderbar ist, d. h. wenn Sie eine Anforderung modifizieren und die URL ändern, müssen Sie die neue URL in diesem Parameter übergeben.

  • init (optional): Ein Optionsobjekt, das angepasste Einstellungen enthält, die auf die Anforderung angewendet werden sollen. Gültige Optionen sind:

    • method: Die Anforderungsmethode (z. B. GET oder POST).
    • headers: Ein Objekt Headers.
      • body: Beliebiger Text, der zur Anforderung hinzugefügt werden soll.

        Anfragen, die die Methoden GET HEAD oder verwenden, dürfen keinen Body haben.

      • redirect: Der Modus, der beim Abrufen der Anforderung beachtet wird. Die Standardeinstellung für Anforderungen, die aus dem eingehenden Ereignis fetchEvent aus dem Ereignishandler generiert werden, ist manual. Die Standardeinstellung für neu erstellte Anforderungen (new Request (url) ) ist follow. Gültige Optionen sind:

        • follow: Wenn eine Umleitungsantwort an den Abruf (fetch) zurückgegeben wird, wird ein weiterer Abruf ausgelöst (basierend auf dem Header Location in der Antwort), bis ein Code ohne Umleitungselement zurückgegeben wird. Beispielsweise könnte await fetch(..) nie eine 301 -Umleitung zurückgeben.
        • manual: Umleitungsantworten werden von einem Abruf (fetch) zurückgegeben.

Eigenschaften

Alle Eigenschaften eines eingehenden Objekts Request (event.request) sind schreibgeschützt. Um eine Anforderung zu ändern, müssen Sie ein Objekt Request erstellen und die Option zum Ändern des zugehörigen Konstruktors übergeben.

  • body: Eine einfache Abruffunktion, die ein Objekt ReadableStream für den Inhalt bereitstellt.
  • bodyUsed: Ein boolescher Wert, der angibt, ob der Hauptteil in einer Antwort verwendet wurde.
  • cf: Ein Objekt, das Daten enthält, die von unseren Partnern bei Cloudflare bereitgestellt werden.
  • headers: Enthalten das zugeordnete Objekt Headers für die Anforderung.
  • method: Die der Anforderung zugeordnete Methode (z. B. GET oder POST).
  • redirect: Der Umleitungsmodus, der verwendet werden soll (follow oder manual).
  • url: Enthält die URL der Anforderung.

Das Objekt cf

Zusätzlich zu den Eigenschaften des Standardobjekts Request können Sie mit einem Objekt request.cf steuern, wie Funktionen angewendet werden, sowie andere angepasste Informationen, die von Cloudflare bereitgestellt werden. Beispiel:

  if (request.cf.asn == 64512) {
    return new Response('Block the ASN 64512 response')
  }

Wenn Sie zum Schreiben und https://cloudflareworkers.com Testen Ihrer Skripte verwenden, ist der request.cf Inhalt im Vorschaumodus nicht verfügbar. Dieser Inhalt kann nur im Produktionsmodus ausgeführt werden.

Diese Eigenschaften enthalten spezielle Informationen aus einer eingehenden Anforderung, die für die Logik Ihrer App hilfreich sind. Alle Pläne bieten Zugriff auf Folgendes:

  • asn: ASN der eingehenden Anforderung (z. B. 395747).
  • colo: Der dreibuchstabige Flughafencode des Rechenzentrums, das die Anforderung erreicht hat (z. B. "DFW").
  • weight: Die vom Browser angeforderte Gewichtung für die HTTP/2-Priorisierung.
  • exclusive: Das vom Browser angeforderte exklusive HTTP/2-Flag (1 für Chromium-basierte Browser, 0 für andere Browser).
  • group: Die HTTP/2-Stream-ID für die Anforderungsgruppe (nur für Firefox ungleich null).
  • group-weight: Die HTTP/2-Gewichtung für die Anforderungsgruppe (nur für Firefox ungleich null).
  • tlsCipher: Die Verschlüsselung für die Verbindung zu CIS (z. B. "AEAD-AES128-GCM-SHA256").
  • country: Der zweistellige Landescode der eingehenden Anforderung. Der gleiche Wert wird im Header CF-IPCountry bereitgestellt (z. B. "US").
  • tlsClientAuth: Wird nur festgelegt, wenn mTLS aktiviert ist. Das Objekt weist die folgenden Eigenschaften auf: certIssuerDNLegacy, certIssuerDN, certIssuerDNRFC2253, certSubjectDNLegacy, certVerified, certNotAfter, certSubjectDN, certFingerprintSHA1, certNotBefore, certSerial, certPresented, certSubjectDNRFC2253.
  • tlsVersion: Die TLS-Version für die Verbindung zu CIS (z. B. TLSv1.3).

Die Pläne Standard und Enterprise bieten Zugriff auf Folgendes:

  • requestPriority: Die vom Browser angeforderten Priorisierungsinformationen im Anforderungsobjekt (z. B. “weight=192;exclusive=0;group=3;group-weight=127”).
  • city: Der Ort der eingehenden Anforderung (z. B. "Austin").
  • continent: Der Kontinent der eingehenden Anforderung (z. B. "NA").
  • httpProtocol: Das HTTP-Protokoll (z. B. "HTTP/2").
  • latitude: Der Breitengrad der eingehenden Anforderung (z. B. "30.27130").
  • longitude: Der Längengrad der eingehenden Anforderung (z. B. "-97.74260").
  • postalCode: Die Postleitzahl der eingehenden Anforderung (z. B. "78701").
  • region: Falls bekannt, der ISO 3166-2-Name für die Region der ersten Ebene, die mit der IP-Adresse der eingehenden Anfrage verbunden ist. Falls diese Region nicht bekannt ist, bleibt die Angabe leer (Beispiel: "Texas").
  • regionCode: Falls bekannt, der ISO 3166-2-Code für die Region der ersten Ebene, die mit der IP-Adresse der eingehenden Anfrage verbunden ist. Falls diese Region nicht bekannt ist, bleibt die Angabe leer (Beispiel: "TX").
  • timezone: Die Zeitzone für die eingehende Anforderung (z. B. "America/Chicago").

In allen Plänen können die folgenden Funktionen für abgehende Anforderungen festgelegt werden.

  • cacheEverything: Diese Option erzwingt das Zwischenspeichern der Antwort für diese Anforderung in CIS, unabhängig davon, welche Header in der Antwort vorkommen. Dies entspricht dem Festlegen der Seitenregel "Cachestufe" auf "Alles Zwischenspeichern" (z. B. true).

  • scrapeShield: Ermöglicht das Umschalten von "ScrapeShield" (z. B. false).

  • polish: Legt den Modus "Optimieren" für Cloudflare fest. Gültige Werte sind "lossy", "lossless" oder "off" (z. B. lossless).

  • minify: Website-Optimierung zum Aktivieren/Inaktivieren der Cloudflare-Funktion für automatische Minimierung für verschiedene Dateitypen. Der Wert ist ein Objekt mit booleschen Feldern für javascript, css und html (z. B. { javascript: true, css: true, html: false }).

  • mirage: Image-Optimierung zum Aktivieren/Inaktivieren der Cloudflare.Funktion Mirage. Für diese Option sollte immer der Wert false angegeben werden (z. B. false).

  • cacheTtl: Diese Option erzwingt das Zwischenspeichern der Antwort für diese Anforderung in CIS, unabhängig davon, welche Header in der Antwort vorkommen. Dies entspricht dem Festlegen von zwei Seitenregeln ("Edge-Cache-TTL" und "Cachestufe") auf "Alles Zwischenspeichern" (z. B. 300).

  • resolveOverride: Leitet die Anforderung zu einem anderen Ursprungsserver um. Mithilfe dieser Funktion können Sie den Lastausgleich auf mehrere Ursprünge verteilen (z. B. us-east.example.com).

    Aus Sicherheitsgründen muss der in resolveOverride festgelegte Hostname in derselben CIS-Zone wie die eingehende Anforderung weitergeleitet werden. Andernfalls wird die Einstellung ignoriert. Da CNAME-Hosts zulässig sind, können Sie einen Host in einer anderen Domäne (oder in einer reinen DNS-Domäne) ansteuern, indem Sie zuerst einen CNAME-Datensatz in der DNS-Zuordnung Ihrer eigenen Zone für den externen Hostnamen deklarieren und den Proxy in CIS festlegen. Geben Sie anschließend in "resolveOverride" einen Verweis auf diesen CNAME-Datensatz an.

Nur für Unternehmen

  • cacheKey: Der Cacheschlüssel einer Anforderung gibt an, ob zwei Anforderungen im Cache als "identisch" gelten. Wenn eine Anforderung denselben Cacheschlüssel aufweist wie eine vorherige Anforderung, kann dieselbe Antwort aus dem Cache für beide Anforderungen bereitgestellt werden (z. B. 'some-key').

  • cacheTtlByStatus: Diese Option ist eine Variante der Funktion cacheTtl, bei der anhand des Statuscodes der Antwort ein TTL-Wert ausgewählt wird. Wenn die Antwort auf diese Anforderung einen entsprechenden Statuscode aufweist, wird sie von CIS für den angegebenen Zeitraum zwischengespeichert und die vom Ursprung gesendeten Anweisungen werden überschrieben (Beispiel: { "200-299": 86400, 404: 1, "500-599": 0 }).

    Da in CIS weiterhin die Standardcachestufen eingehalten werden, wird das Caching-Verhalten für statische Dateien standardmäßig entsprechend geändert. Wenn Sie nicht-statische Assets zwischenspeichern möchten, müssen Sie mithilfe einer Seitenregel die Cache-Stufe „Alles zwischenspeichern“ festlegen.

Ein Script für Edge-Funktionen wird im Anschluss an CIS-Sicherheitsfunktionen vor allen weiteren Funktionen ausgeführt. Daher kann ein Edge-Funktionsskript keinen Einfluss auf die Funktionsweise von Sicherheitsfunktionen haben (da diese bereits abgeschlossen sind), aber es kann andere Funktionen beeinflussen, wie z. B. die Bildgrößenoptimierung oder die Art und Weise, wie die Antwort am Rand zwischengespeichert wird.

Das Aktualisieren des Objekts cf ist mit dem Ändern einer Anforderung vergleichbar. Sie können das Objekt cf zu einer Anforderung (Request) hinzufügen, indem Sie ein angepasstes Objekt an fetch übergeben.

// Disable ScrapeShield for this request.
fetch(event.request, { cf: { scrapeShield: false } })

Ungültige oder falsch benannte Einstellungen im Objekt cf werden stillschweigend ignoriert. Testen Sie sorgfältig, dass das Ausführungsverhalten Ihren Vorstellungen entspricht.

Anwendungsfälle für Edge-Funktionen

Diese Beispiele dienen nur zu Demonstrationszwecken und sind nicht für die Produktion vorgesehen: