Beispiel – Mithilfe von App-Spezifikationen auf externe Endpunkte zugreifen¶
In diesem Thema wird beschrieben, wie Sie eine Snowflake Native App konfigurieren, um eine Verbindung zu einem Endpunkt herzustellen, der nicht zu Snowflake gehört. Das Beispiel zeigt, wie Sie die Manifest-Datei und das Setup-Skript einer App so konfigurieren, um Folgendes zu tun:
Verwenden Sie Automatisiertes Gewähren von Berechtigungen, um Berechtigungen vom Verbraucher anzufordern, um eine Integration für den externen Zugriff zu erstellen.
Fügen Sie eine Integration für den externen Zugriff zu einer App hinzu.
Verwenden Sie Anwendungsspezifikationen, um beim Verbraucher die Berechtigung anzufordern, eine Verbindung zu einem externen Endpunkt herzustellen.
Die Version der Manifest-Datei festlegen¶
Um das automatisierte Gewähren von Berechtigungen für eine App zu aktivieren, legen Sie die Version am Anfang der Manifest-Datei fest, wie im folgenden Beispiel gezeigt:
manifest_version: 2
Die Berechtigung CREATE EXTERNAL ACCESS INTEGRATION in der Manifest-Datei anfordern¶
Mit der Berechtigung CREATE EXTERNAL ACCESS INTEGRATION kann die App während der Installation oder eines Upgrades eine Integration für den externen Zugriff erstellen. Um diese Berechtigung vom Verbraucher anzufordern, fügen Sie den folgenden Eintrag zur Manifest-Datei hinzu:
privileges:
- CREATE EXTERNAL ACCESS INTEGRATION:
description: "Required to create eai integrations so we can simplify your life"
Die Berechtigung CREATE EXTERNAL ACCESS INTEGRATION wird der App automatisch vor der Installation oder dem Upgrade gewährt und hat die folgenden Vorteile:
Verbraucher müssen die von der App benötigte Integration für den externen Zugriff nicht manuell erstellen und den Zugriff mithilfe von Referenzen genehmigen.
Anbieter müssen keinen Code schreiben, der vor der Erstellung des Objekts während der Installation oder des Upgrades das Bestehen der Berechtigung CREATE EXTERNAL ACCESS INTEGRATION prüft.
Eine Netzwerkregel für die Integration für den externen Zugriff erstellen¶
Eine Integration für den externen Zugriff erfordert eine Netzwerkregel, die die externen Endpunkte definiert. Um zum Beispiel eine Netzwerkregel zu erstellen, fügen Sie dem Setup-Skript der App den Befehl CREATE NETWORK RULE hinzu:
CREATE OR REPLACE NETWORK RULE setup.my_network_rule
TYPE = HOST_PORT
VALUE_LIST = ( 'example.com' )
MODE = EGRESS;
Dieser Befehl erstellt eine Netzwerkregel, die eine ausgehende Anforderung (Ausgang) an den Host-Port example.com
definiert.
Erstellen Sie eine Integration für den externen Zugriff¶
Nachdem Sie im Setup-Skript eine Netzwerkregel erstellt haben, verwenden Sie den Befehl CREATE EXTERNAL ACCESS INTEGRATION, um eine Integration für den externen Zugriff zu erstellen, wie im folgenden Beispiel gezeigt:
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION my_app_prefix_eai_rule
ALLOWED_NETWORK_RULES = (setup.my_network_rule)
ENABLED = TRUE;
Bemerkung
Dieser Befehl erstellt eine Integration für den externen Zugriff im Verbraucherkonto. Die Integration für den externen Zugriff kann jedoch erst verwendet werden, wenn der Verbraucher die App-Spezifikationen genehmigt hat, die den externen Zugriff für die angefragten Host-Ports gestatten. Weitere Informationen dazu finden Sie unter Verbindungen zu externen Ressourcen mit App-Spezifikationen genehmigen.
Eine benutzerdefinierte Funktion für den Zugriff auf den externen Endpunkt erstellen¶
Nach dem Erstellen der Integration für den externen Zugriff kann das Setup-Skript benutzerdefinierte Funktionen und gespeicherte Prozeduren erstellen, die damit eine Verbindung zu den in der Netzwerkregel definierten Endpunkten herstellen.
Das folgende Beispiel zeigt eine benutzerdefinierte Funktion, die die Integration für den externen Zugriff my_app_prefix_eai_rule
verwendet.
CREATE OR REPLACE FUNCTION setup.EXTERNAL_ACCESS_UDF(hostname STRING)
RETURNS STRING
LANGUAGE JAVA
HANDLER='TestHostNameLookup.compute'
EXTERNAL_ACCESS_INTEGRATIONS = (my_app_prefix_eai_rule)
AS
'
import java.net.InetAddress;
import java.net.UnknownHostException;
class TestHostNameLookup {{
public static String compute(String hostname) throws Exception {{
InetAddress addr = null;
try {
addr = InetAddress.getByName(hostname);
} catch(UnknownHostException ex) {
return "Hostname lookup failed";
}
return "Hostname lookup successful";
}
}
';
GRANT USAGE ON FUNCTION setup.EXTERNAL_ACCESS_UDF(STRING)
TO APPLICATION ROLE app_public;
Diese Funktion setzt den Wert von EXTERNAL_ACCESS_INTEGRATIONS auf die zuvor erstellte Integration für den externen Zugriff.
Diese Funktion verwendet das InetAddress
-Java-Paket, um den an die Prozedur gegebenen Hostnamen zu ermitteln. Der angegebene Hostname muss mit einem der Werte übereinstimmen, die in der Eigenschaft VALUE_LIST
der Netzwerkregeln angegeben sind, die von der Integration für den externen Zugriff verwendet werden.
Die App-Spezifikation erstellen¶
Eine App kann eine App-Spezifikation während der Installation oder eines Upgrades oder zur Laufzeit über eine gespeicherte Prozedur erstellen. Im folgenden Beispiel wird die Verwendung des Befehls ALTER APPLICATION SET SPECIFICATIONS zum Erstellen einer App-Spezifikation gezeigt:
ALTER APPLICATION SET SPECIFICATION my_app_specification
TYPE = EXTERNAL_ACCESS
LABEL = 'An external api'
DESCRIPTION = 'Used to connect to an external API'
HOST_PORTS = 'example.com';