Einführung in externe Funktionen

Unter diesem Thema werden externe Funktionen beschrieben, die ausführbaren Code aufrufen, der außerhalb von Snowflake entwickelt, verwaltet, gespeichert und ausgeführt wird.

Unter diesem Thema werden folgende Fragen geklärt:

  • Was ist eine externe Funktion?

  • Wann sind externe Funktionen der beste Weg, um eine UDF (benutzerdefinierte Funktion) zu implementieren?

  • Welche Cloudplattform eignet sich am besten für die externe Funktion?

Unter diesem Thema:

Was ist eine externe Funktion?

Eine externe Funktion ruft Code auf, der außerhalb von Snowflake ausgeführt wird.

Der extern ausgeführte Code wird als Remotedienst bezeichnet.

Informationen, die an einen Remotedienst gesendet werden, werden normalerweise über einen Proxydienst weitergeleitet.

Snowflake speichert sicherheitsrelevante Informationen von externen Funktionen in einer API-Integration.

In der folgenden Abbildung wird der grundlegende Informationsfluss von einem Clientprogramm über Snowflake bis zum Remotedienst gezeigt:

../_images/external-functions-overview-07.png

Jede der Hauptkomponenten wird im Folgenden ausführlicher beschrieben.

Externe Funktion:

Eine externe Funktion ist ein Typ von UDF. Im Gegensatz zu anderen UDFs enthält eine externe Funktion keinen eigenen Code. Stattdessen ruft die externe Funktion Code auf, der außerhalb von Snowflake gespeichert und ausgeführt wird.

Innerhalb von Snowflake wird die externe Funktion als Datenbankobjekt gespeichert, das Informationen enthält, die Snowflake zum Aufrufen des Remotedienstes verwendet. Zu diesen Informationen gehört die URL des Proxydienstes, der Informationen zum und vom Remotedienst weiterleitet. Diese Informationen werden als Teil des Befehls CREATE EXTERNAL FUNCTION angegeben.

Das Datenbankobjekt, das die externe Funktion darstellt, wird in einer bestimmten Datenbank und einem bestimmten Schema erstellt. Die externe Funktion kann in Punktschreibweise aufgerufen werden, um den vollqualifizierten Namen darzustellen. Beispiel:

select my_database.my_schema.my_external_function(col1) from table1;
Copy
Remotedienst:

Der extern ausgeführte Code wird als Remotedienst bezeichnet.

Der Remotedienst muss sich wie eine Funktion verhalten. So muss er zum Beispiel einen Wert zurückgeben.

Snowflake unterstützt skalare externe Funktionen. Der Remotedienst muss dann für jede empfangene Zeile genau eine Zeile zurückgeben.

Um von der externen Snowflake-Funktion aufgerufen zu werden, muss der Remotedienst Folgendes bieten:

Beispielsweise können Remotedienste wie folgt implementiert werden als:

  • AWS Lambda-Funktion

  • Microsoft Azure-Funktion

  • HTTPS-Server (z. B. Node.js), der auf einer EC2-Instanz ausgeführt wird

Proxydienst:

Snowflake ruft einen Remotedienst nicht direkt auf. Stattdessen ruft Snowflake einen Proxydienst auf, der die Daten an den Remotedienst weiterleitet.

Der Proxydienst kann die Sicherheit erhöhen, indem er Anforderungen an den Remotedienst authentifiziert.

Der Proxydienst kann eine abonnementbasierte Abrechnung für einen Remotedienst unterstützen. So kann der Proxydienst beispielsweise überprüfen, ob ein Aufrufer des Remotedienstes ein zahlender Abonnent ist.

Der Proxydienst leitet auch die Antwort des Remotedienstes zurück an Snowflake.

Beispiele für Proxydienste sind:

  • Amazon API Gateway

  • Microsoft Azure API Management-Dienst

API-Integration:

Eine Integration ist ein Snowflake-Objekt, das eine Schnittstelle zwischen Snowflake und Services von Drittanbietern bereitstellt. Eine API-Integration speichert Informationen, wie z. B. Sicherheitsinformationen, die für die Arbeit mit einem Proxydienst oder einem Remotedienst benötigt werden.

Die API-Integration wird mit dem CREATE API INTEGRATION-Befehl erstellt.

Benutzer können ihre eigenen Remotedienste schreiben und aufrufen oder Remotedienste aufrufen, die von Dritten geschrieben wurden. Diese Remotedienste können mit jedem HTTP-Server-Stack geschrieben werden, einschließlich serverlosen Cloud-Computediensten wie AWS Lambda.

Aus der Sicht eines Benutzers, der eine SQL-Anweisung ausführt, verhält sich eine externe Funktion wie jede andere UDF. Beispielsweise unterliegen externe Funktionen folgenden Regeln:

  • Externe Funktionen geben einen Wert zurück.

  • Externe Funktionen können Parameter akzeptieren.

  • Eine externe Funktion kann in jeder Klausel einer SQL-Anweisung eingesetzt werden, in der auch andere Typen von UDFs vorkommen können. Beispiel:

    select my_external_function_2(column_1, column_2)
        from table_1;
    
    select col1
        from table_1
        where my_external_function_3(col2) < 0;
    
    create view view1 (col1) as
        select my_external_function_5(col1)
            from table9;
    
    Copy
  • Eine externe Funktion kann Teil eines komplexeren Ausdrucks sein:

    select upper(zipcode_to_city_external_function(zipcode))
      from address_table;
    
    Copy
  • Der zurückgegebene Wert kann ein zusammengesetzter Wert sein, z. B. ein VARIANT-Wert, der JSON-Werte enthält.

  • Externe Funktionen können überladen sein, d. h. zwei verschiedene Funktionen können denselben Namen, aber unterschiedliche Signaturen haben (unterschiedliche Zahlen oder Datentypen von Eingabeparametern).

Funktionsweise externer Funktionen

Snowflake ruft Remotedienst nicht direkt auf. Stattdessen ruft Snowflake den Remotedienst über den nativen HTTPS-Proxydienst eines Cloudanbieters auf, z. B. API Gateway auf AWS.

Hauptschritte zum Aufrufen einer externen Funktion:

  1. Das Clientprogramm eines Benutzers übergibt Snowflake eine SQL-Anweisung, die eine externe Funktion aufruft.

  2. Wenn die externe Funktion als Teil der Abfrageausführung ausgewertet wird, liest Snowflake die Definition der externen Funktion und die Informationen der zugehörigen API-Integration.

    • Zu den Informationen aus der Definition der externen Funktion gehören:

      • URL des Proxydienstes

      • Name der zugehörigen API-Integration

    • Zu den Informationen aus der API-Integration gehören:

      • Die zu verwendende Ressource des Proxydienstes. Die Ressource enthält Informationen zum Remotedienst, z. B. den Standort dieses Dienstes.

      • Authentifizierungsinformationen für diese Proxydienst-Ressource.

    Snowflake setzt dann einen HTTP-POST-Befehl zusammen, der Folgendes enthält:

    • Die zu verarbeitenden Daten. Diese Daten sind im JSON-Format.

    • HTTP-Header-Informationen. (Details sind unter CREATE EXTERNAL FUNCTION dokumentiert.)

    • Authentifizierungsinformationen aus der API-Integration.

    Snowflake sendet dann die POST-Anforderung an den Proxydienst.

  3. Der Proxydienst empfängt die POST-Anforderung, verarbeitet diese und leitet sie an den eigentlichen Remotedienst weiter. Sie können sich Proxydienst und Proxyressource vereinfacht als Relais- oder Vermittlungsfunktion vorstellen, die den Remotedienst aufruft.

  4. Der Remotedienst verarbeitet die Daten und gibt das Ergebnis zurück, das über die Verarbeitungsfolge an die ursprüngliche SQL-Anweisung zurückgegeben wird.

  5. Wenn der Remotedienst mit einem HTTP-Code antwortet, um die asynchrone Verarbeitung zu signalisieren, sendet Snowflake eine oder mehrere HTTP-GET-Anforderungen, um das Ergebnis vom Remotedienst abzurufen. Snowflake sendet so lange GET-Anforderungen, bis der Antwortcode eingeht, sodass mit weiteren Anforderungen fortgefahren werden kann, oder bis die externe Funktion ein Timeout hat oder einen Fehler zurückgibt.

Wenn eine Abfrage eine große Anzahl von Zeilen an einen Remotedienst senden muss, werden die Zeilen in der Regel in Batches aufgeteilt. Batches ermöglichen in der Regel mehr Parallelität und schnellere Abfragen. In einigen Fällen verringern Batches die Überlastung des Remotedienstes.

Ein Remotedienst gibt 1 Batch von Zeilen für jeden empfangenen Batch zurück. Bei einer skalaren externen Funktion ist die Anzahl der Zeilen in dem zurückgegebenen Batch gleich der Anzahl der Zeilen in dem empfangenen Batch.

Jeder Batch hat eine eindeutige Stapel-ID, die in jeder von Snowflake an den Remotedienst gesendeten Anforderung enthalten ist.

Wiederholungsoperationen (z. B. aufgrund von Timeouts) werden normalerweise auf Batchebene durchgeführt.

Vorteile externer Funktionen

Externe Funktionen haben gegenüber anderen UDFs (benutzerdefinierten Funktionen) folgende Vorteile:

  • Der Code für den Remotedienst kann in Sprachen geschrieben werden, in denen andere UDFs nicht geschrieben werden können, einschließlich:

    • Go

    • C#

  • Remotedienste können Funktionen und Bibliotheken verwenden, auf die interne UDFs nicht zugreifen können. Remotedienste können mit kommerziell erhältlichen Bibliotheken von Drittanbietern verbunden werden, z. B. Scoring-Bibliotheken für maschinelles Lernen.

  • Entwickler können Remotedienste schreiben, die sowohl von Snowflake als auch von anderer Software aufgerufen werden können, die für dieselbe Schnittstelle geschrieben wurde.

Einschränkungen für externe Funktionen

Externe Funktionen haben die folgenden Einschränkungen, die grob in Einschränkungen bezüglich Erstellungszeit und Einschränkungen bezüglich Ausführungszeit gruppiert werden können.

Erstellungszeitbeschränkungen und Voraussetzungen

  • Bevor eine externe Funktion zum ersten Mal aufgerufen werden kann, muss ein Administrator einige Konfigurationen vornehmen. Diese Aufgabe erfordert Kenntnisse über die Cloudplattform (z. B. AWS oder Microsoft Azure), insbesondere hinsichtlich Sicherheitsfunktionen.

  • Snowflake ruft Remotedienste indirekt über einen Cloud-HTTP-Proxydienst (z. B. das Amazon API Gateway) auf. Daher muss der Remotedienst für eine externe Funktion von einem Proxydienst aus aufgerufen werden können. Glücklicherweise kann auf fast jede Funktion, die als HTTPS-Endpunkt fungieren kann, als externe Funktion über einen Proxydienst zugegriffen werden. Der Proxydienst muss so programmiert sein, dass er den Remotedienst aufruft (z. B. eine Funktion, die auf AWS Lambda ausgeführt wird).

  • Einige Cloudplattformen haben möglicherweise spezielle Anforderungen. Unter AWS sind für externe Funktionen beispielsweise regionale Endpunkte oder private Endpunkte erforderlich. Weitere Details dazu finden Sie unter Unterstützte Plattformen. Weitere Informationen zu regionalen und privaten Endpunkten auf Amazon API Gateway finden Sie unter Wählen Sie Ihren Endpunkttyp aus: Regionaler Endpunkt vs. Privater Endpunkt.

  • Externe Funktionen können nur für Funktionen und nicht für gespeicherte Prozeduren geschrieben werden.

  • Zukünftige Berechtigungszuweisungen zu externen Funktionen werden nicht unterstützt.

Ausführungszeiteinschränkungen und Probleme

  • Da der Remotedienst für Snowflake nicht transparent ist, kann das Optimierungsprogramm möglicherweise einige Optimierungen nicht ausführen, die für äquivalente interne Funktionen ausgeführt werden könnten.

  • Externe Funktionen haben mehr Overhead als interne Funktionen (sowohl integrierte als auch UDFs) und werden normalerweise langsamer ausgeführt.

  • Derzeit müssen externe Funktionen Skalarfunktionen sein. Eine skalare externe Funktion gibt für jede Eingabezeile einen einzelnen Wert zurück.

  • Derzeit können externe Funktionen nicht über Secure Data Sharing für Datenverbraucher freigegeben werden.

  • Die maximale Antwortgröße pro Batch ist 10 MB.

  • Externe Funktionen können in folgenden Situationen nicht verwendet werden:

    • Als Teil eines Datenbankobjekts (z. B. Tabelle, Ansicht, UDF oder Maskierungsrichtlinie), das über Secure Data Sharing freigegeben wird. Sie können z. B. keine gemeinsame Ansicht erstellen, die eine externe Funktion verwendet. Folgendes wird beispielsweise nicht unterstützt:

      CREATE VIEW my_shared_view AS SELECT my_external_function(x) ...;
      CREATE SHARE things_to_share;
      ...
      GRANT SELECT ON VIEW my_shared_view TO SHARE things_to_share;
      ...
      
      Copy
    • In der DEFAULT-Klausel einer CREATE TABLE-Anweisung. Mit anderen Worten, der Standardwert für eine Spalte kann kein Ausdruck sein, der eine externe Funktion aufruft. Wenn Sie versuchen, eine externe Funktion in eine DEFAULT-Klausel einzufügen, schlägt die CREATE TABLE-Anweisung fehl.

    • In COPY-Transformationen.

  • Externe Funktionen können zusätzliche Sicherheitsprobleme aufwerfen. Wenn Sie beispielsweise die Funktion eines Drittanbieters aufrufen, kann dieser Kopien der an die Funktion übergebenen Daten aufbewahren.

Abrechnung der Nutzung externer Funktionen

Bei Verwendung externer Funktionen entstehen die folgenden üblichen Kosten:

Darüber hinaus müssen Sie möglicherweise indirekte oder von Dritten erhobene Gebühren zahlen, einschließlich Gebühren an den Anbieter des Remotedienstes. Gebühren können von Anbieter zu Anbieter variieren.

Bemerkung

Für Daten, die über private Amazon API Gateway-Endpunkte gesendet werden, fallen AWSPrivateLink-Gebühren sowohl für den Dateneingang als auch für den Datenausgang an.

Unterstützte Plattformen

Plattformen, die das Aufrufen einer externen Funktion unterstützen

Im Allgemeinen kann eine externe Funktion von einem Snowflake-Konto auf jeder Cloudplattform aufgerufen werden, die Snowflake unterstützt:

  • Amazon Web Services (AWS)

  • Microsoft Azure

  • Google Cloud Platform (GCP)

Ausnahmen sind unten aufgeführt:

Die SQL-Syntax für den Aufruf einer externen Funktion ist auf allen Plattformen gleich.

Die SQL-Anweisungen (CREATE EXTERNAL FUNCTION und CREATE API INTEGRATION), die zur Konfiguration des Zugriffs auf diese Dienste erforderlich sind, sind für alle Plattformen gleich. Die Klauseln innerhalb dieser Anweisungen variieren jedoch je nach den Plattformen, die den Proxydienst und den Remotedienst hosten.

Plattformen, die das Erstellen von Remotedienst und Proxydienst für eine externe Funktion unterstützen

Obwohl eine externe Funktion von jeder Plattform aus aufgerufen werden kann, müssen der Remotedienst und der Proxydienst der externen Funktion jeweils auf bestimmten unterstützten Plattformen erstellt werden.

In vielen Fällen sind Plattform und Konto des Remotedienstes identisch mit Plattform und Konto des Proxydienstes. Dies ist jedoch nicht erforderlich. Zum Beispiel könnte eine SQL-Abfrage eine Azure Function (Remotedienst) über ein AWS API Gateway (Proxydienst) aufrufen. Die SQL-Abfrage selbst könnte auf einer Snowflake-Instanz ausgeführt werden, die auf GCP ausgeführt wird.

Plattformen, die einen Remotedienst unterstützen

Sie benötigen einen HTTP-Server-Stack, um den Remotedienst zu hosten. Jeder HTTP-Server-Stack, der den Remotedienst unterstützen kann, sollte mit externen Funktionen kompatibel sein.

Um Ihren Remotedienst zu erstellen, benötigen Sie normalerweise:

  • Ein Konto beim Anbieter einer Cloudplattform (z. B. ein Microsoft Azure-Konto zum Erstellen einer Azure-Funktion). Dieses Konto stellt Speicher- und Computeressourcen für den Remotedienst zur Verfügung. Dieses Konto ist von Ihrem Snowflake-Konto getrennt.

Snowflake bietet eine Anleitung zum Erstellen eines Remotedienstes als:

  • AWS Lambda-Funktion

  • Microsoft Azure-Funktion

  • Google Cloud-Funktion

Plattformen, die einen Proxydienst unterstützen

Sie benötigen eine Instanz eines nativen HTTP-Proxydienstes auf einer Cloudplattform.

Um Ihren Proxydienst zu konfigurieren, benötigen Sie normalerweise Folgendes:

  • Ein Konto beim Anbieter einer Cloudplattform (z. B. ein Amazon-Konto zur Verwendung von AWS). Dieses Konto stellt Speicher- und Computeressourcen für den Proxydienst zur Verfügung. Dieses Konto ist von Ihrem Snowflake-Konto getrennt.

  • Eine Cloudplattformrolle, die über die zum Konfigurieren eines Proxydienstes erforderlichen Berechtigungen verfügt. Diese Cloudplattformrolle ist von Ihren Snowflake-Rollen getrennt.

Die folgenden HTTPS-Proxydienste werden unterstützt:

  • Amazon API Gateway

  • Microsoft Azure API Management-Dienst

  • Google Cloud API Gateway

Die folgenden Abschnitte enthalten plattformspezifische Informationen, die Benutzer kennen sollten, bevor sie eine Plattform auswählen.

Plattform-spezifische Einschränkungen

AWS

  • Dieses Feature unterstützt nur regionale und private Endpunkte für das Amazon API Gateway. (Eine Beschreibung der verschiedenen Typen von Endpunkten finden Sie unter Endpunkten.)

  • Externe Funktionen und API-Integrationen in Snowflake unterstützen keine kundenspezifischen AWS-Domänen. Verwenden Sie für den Zugriff auf ein Amazon API Gateway von Snowflake aus die von AWS generierte Standard-URL, die wie folgt aussieht:

    https://api-id.execute-api.region.amazonaws.com/stage
    
    Copy