Erstellen und Verwenden einer Integration für den externen Zugriff¶
Um den Zugriff auf bestimmte externe Netzwerkstandorte zu ermöglichen, erstellen Sie eine Integration für den externen Zugriff, die eine Liste von Netzwerkregeln angibt, die externe Standorte und eine Liste von Geheimnissen enthält, die Sie verwenden dürfen. Indem Sie die EXTERNAL_ACCESS_INTEGRATIONS-Klausel verwenden, um bei der Erstellung der UDF oder Prozedur mit CREATE FUNCTION oder CREATE PROCEDURE auf diese Integration zu verweisen, erlauben Sie dem Handler-Code, das Geheimnis zur Authentifizierung mit dem externen Standort zu verwenden.
Ein Administrator kann mithilfe der Ansicht EXTERNAL_ACCESS_HISTORY Anfragen an externe Netzwerkstandorte überwachen.
Eine durchgängige Sequenz von Codebeispielen für die Einrichtung und Verwendung des externen Zugriffs finden Sie unter Beispiele für externen Netzwerkzugriff.
Gehen Sie wie folgt vor, um den Zugriff auf einen externen Netzwerkstandort von einer UDF oder Prozedur aus einzurichten.
Erstellen Sie eine Netzwerkregel, um den externen Netzwerkstandort darzustellen.
Erstellen Sie ein Geheimnis für die Anmeldeinformationen zu speichern.
Erstellen Sie eine Integration für den externen Zugriff, die das Geheimnis und die Netzwerkregel zusammenfasst, damit sie vom Handler beim Zugriff auf den externen Standort verwendet werden können.
Erstellen Sie die UDF oder Prozedur, wobei der Parameter EXTERNAL_ACCESS_INTEGRATIONS den Namen der Integration als Wert enthält. Damit erhält die Funktion oder Prozedur die Erlaubnis, auf die externen Netzwerkstandorte zuzugreifen und die durch Netzwerkregeln und Geheimnisse in der Integration festgelegten Anmeldeinformationen zu verwenden.
Sie setzen den Parameter SECRET separat auf den Namen eines in der Integration enthaltenen Geheimnisses, damit Sie vom Handler-Code aus Zugriff auf den Inhalt des Geheimnisses haben.
Greifen Sie in Funktions- oder Prozedur-Handler-Code auf den externen Netzwerkstandort zu, der in einer in der Integration enthaltenen Netzwerkregel angegeben ist. Der Versuch, auf einen Netzwerkstandort zuzugreifen, der nicht durch eine zulässige Netzwerkregel angegeben ist, wird verweigert.
Erstellen einer Netzwerkregel zur Darstellung des externen Netzwerkstandorts¶
Mit dem Befehl CREATE NETWORK RULE können Sie eine Netzwerkregel erstellen, die den Standort des externen Netzwerks und die Zugriffsbeschränkungen darstellt. Eine Netzwerkregel gibt beispielsweise Netzwerkbezeichner wie einen Hostnamen und die Richtung der Kommunikation mit dem Netzwerk (Eingang oder Ausgang) an.
Um den Zugriff auf ein externes Netzwerk zu unterstützen, wird ein Administrator die Regel bei der Erstellung einer Integration für den externen Zugriff einbeziehen. Jede in der Integration enthaltene Regel gibt einen externen Netzwerkstandort an, auf den die Funktion oder Prozedur zugreifen darf.
Beim Erstellen einer Netzwerkregel zur Verwendung in einer Integration für den externen Zugriff geben Sie Folgendes an:
EGRESS als Wert des Parameters MODE.
HOST_PORT als Wert des Parameters TYPE.
Der Endpunkt des externen Standorts im Parameter VALUE_LIST.
(Optional) Eine Portnummer mit dem Namen des Endpunkts des externen Standorts. Wenn Sie keine Portnummer angeben, verwendet Snowflake die Standardportnummer für den externen Zugriff, 443.
Wenn der Endpunkt beispielsweise Port 80 benötigt, könnte der Parameter VALUE_LIST wie folgt lauten:
VALUE_LIST = ('example.com:80')
Zugriffssteuerung¶
Aus Sicherheitsgründen verlangt Snowflake, dass Sie beim Erstellen einer Netzwerkregel eine Rolle mit den folgenden Eigenschaften verwenden:
Die Berechtigung CREATE NETWORK RULE für das Schema, das die Regel enthalten wird.
Beispiel¶
Der Code im folgenden Beispiel erstellt eine Netzwerkregel namens google_apis_network_rule
für ausgehende Anfragen an die Google-Übersetzung API.
CREATE OR REPLACE NETWORK RULE google_apis_network_rule
MODE = EGRESS
TYPE = HOST_PORT
VALUE_LIST = ('translation.googleapis.com');
Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen¶
Sie können CREATE SECRET verwenden, um ein Geheimnis zu erstellen, das die Anmeldeinformationen repräsentiert, die für die Authentifizierung beim externen Netzwerkstandort erforderlich sind. Das Geheimnis kann zum Beispiel Anmeldeinformationen wie einen Benutzernamen und ein Kennwort enthalten.
Für den Zugriff auf einen externen Netzwerkstandort, der OAuth unterstützt, empfiehlt es sich, dass Ihr Geheimnis eine Referenz auf eine Sicherheitsintegration enthält mit Werten, die für den OAuth Datenfluss benötigt werden, z. B. einen Client ID, ein Client-Geheimnis, einen Token-Endpunkt usw.
Das Geheimnis wird auf folgende Weise verwendet:
Von einem Administrator bei der Erstellung der Integration für den externen Zugriff.
Bei der Erstellung der Integration gibt der Administrator die Geheimnisse an, die Entwickler im Handler-Code verwenden dürfen, wenn sie eine Funktion oder Prozedur erstellen, die die Integration nutzt.
Von einem Entwickler bei der Erstellung einer UDF oder eines Prozedur-Handlers.
Der Entwickler gibt das zulässige Geheimnis an, das die Anmeldeinformationen enthält, die der Handler-Code zur Authentifizierung bei einer Anfrage an den externen Standort verwenden kann. Beim Schreiben eines Handlers kann ein Entwickler eine Snowflake-API verwenden, um die im Geheimnis enthaltenen Anmeldeinformationen abzurufen, anstatt die Anmeldeinformationen als Literalwerte in den Handler-Code aufzunehmen.
Bemerkung
Bei einem OAuth-Geheimnis, das ein Aktualisierungstoken erfordert, können Sie das Token auf verschiedene Weise erhalten, u. a. über die in Snowflake verfügbaren Systemfunktionen. Ein Beispiel dazu finden Sie unter Zugriff auf die Google Translate-API.
Zugriffssteuerung¶
Aus Sicherheitsgründen verlangt Snowflake, dass Sie beim Erstellen eines Geheimnisses eine Rolle mit den folgenden Eigenschaften verwenden:
Die Berechtigung CREATE SECRET für das Schema, das das Geheimnis enthalten wird.
Beispiel¶
Der Code im folgenden Beispiel erstellt ein Geheimnis namens oauth_token
, das eine Sicherheitsintegration (dargestellt durch google_translate_oauth
) angibt, die Werte enthält, die für die Authentifizierung mit OAuth erforderlich sind.
Ein ausführlicheres Beispiel, einschließlich des Codes für die Erstellung der Sicherheitsintegration, finden Sie unter Beispiele für externen Netzwerkzugriff.
CREATE OR REPLACE SECRET oauth_token
TYPE = OAUTH2
API_AUTHENTICATION = google_translate_oauth
OAUTH_REFRESH_TOKEN = 'my-refresh-token';
Tipp
In dieser Vorschau können Sie den TYPE
als GENERIC_STRING
angeben, wenn Sie einen API-Schlüssel nur als Anmeldeinformationen verwenden möchten.
CREATE OR REPLACE SECRET bp_maps_api
TYPE = GENERIC_STRING
SECRET_STRING = 'replace-with-your-api-key';
Erstellen einer Integration für den externen Zugriff¶
Mit dem Befehl CREATE EXTERNAL ACCESS INTEGRATION können Sie eine Integration für den externen Zugriff erstellen, die zulässige Netzwerkregeln (die externe Netzwerkstandorte darstellen) und zulässige Geheimnisse (die Anmeldeinformationen für die Authentifizierung darstellen) für die Verwendung mit UDFs und Prozeduren zusammenfasst.
Insbesondere legt die Integration für den externen Zugriff die Netzwerkregeln und Geheimnisse fest, die UDFs und Prozeduren, die auf die Integration verweisen, verwenden dürfen.
Die Integration für den externen Zugriff wird von einem Administrator verwendet, um den Zugriff auf externe Netzwerkstandorte von UDFs und Prozeduren aus zu verwalten. Die Integration gibt nur die Standorte und Anmeldeinformationen an, die von UDFs und Prozeduren, die auf die Integration verweisen, verwendet werden dürfen. Ein Administrator kann die Integration auch aktivieren oder deaktivieren, um den Zugriff auf externe Standorte zu verwalten.
Zugriffssteuerung¶
Aus Sicherheitsgründen verlangt Snowflake, dass Sie beim Erstellen einer Integration für den externen Zugriff eine Rolle mit den folgenden Eigenschaften verwenden:
Die Berechtigung CREATE INTEGRATION für das Konto.
Die Berechtigung USAGE für jedes Geheimnis, das die Integration verwendet, sowie die Berechtigung USAGE für das Schema des Geheimnisses.
Beispiel¶
Der Code im folgenden Beispiel erstellt eine Integration für den externen Zugriff namens google_apis_access_integration
. Die Integration gibt die Netzwerkregel google_apis_network_rule
(die den Netzwerkstandort darstellt) und das Geheimnis oauth_token
(das die Anmeldeinformationen darstellt) an.
Weitere Informationen zu dieser Regel und zu Geheimnissen finden Sie unter Erstellen einer Netzwerkregel zur Darstellung des externen Netzwerkstandorts und Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen.
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION google_apis_access_integration
ALLOWED_NETWORK_RULES = (google_apis_network_rule)
ALLOWED_AUTHENTICATION_SECRETS = (oauth_token)
ENABLED = true;
Verwendung der Integration für den externen Zugriff in einer Funktion oder Prozedur¶
Wenn Sie den Befehl CREATE FUNCTION oder CREATE PROCEDURE verwenden, um eine UDF oder Prozedur zu erstellen, können Sie den Zugriff auf externe Netzwerkstandorte wie folgt aktivieren:
Fügen Sie den Parameter EXTERNAL_ACCESS_INTEGRATIONS ein und setzen Sie seinen Wert auf eine oder mehrere Integrationen.
Jede von Ihnen angegebene Integration ermöglicht den Zugriff auf die externen Netzwerkstandorte und Geheimnisse, die die Integration angibt.
Fügen Sie den Parameter SECRETS ein und setzen Sie seinen Wert auf ein oder mehrere Geheimnisse und die Namen, mit denen Sie vom Handler-Code aus auf sie zugreifen werden.
Die Geheimnisse, die Sie als Werte angeben, müssen auch in der Integration für den externen Zugriff angegeben werden.
Greifen Sie im Handler-Code auf das Geheimnis zu, um die Anmeldeinformationen für die Authentifizierung beim externen Netzwerkstandort abzurufen.
Bemerkung
Verwenden Sie immer ein Snowflake-Geheimnis, um Anmeldeinformationen darzustellen, anstatt die Anmeldeinformationen als literale Werte in den Code einzufügen. Neben dem Schutz von Anmeldeinformationen ermöglicht die Verwendung eines Geheimnisses die Prüfung und Verwaltung der Verwendung von Anmeldeinformationen, da nur diejenigen, denen die Berechtigung READ am Geheimnis gewährt wurde, eine Integration verwenden dürfen, die das Geheimnis in einer UDF oder einer Prozedur enthält.
Snowflake begrenzt die Gesamtzahl der Verbindungen, die von einer bestimmten UDF aus hergestellt werden können. Um Probleme mit der Ressourcenerschöpfung zu vermeiden, sollten Sie Verbindungen so oft wie möglich wiederverwenden. Sie können dies erreichen, indem Sie den TCP-Client oder die Sitzung einmal während der UDF-Initialisierung erstellen und ihn/sie dann im UDF-Handler für den Rest der Abfrage verwenden.
Zugriffssteuerung¶
Aus Sicherheitsgründen verlangt Snowflake, dass Sie beim Erstellen einer UDF oder einer Prozedur eine Rolle mit den folgenden Eigenschaften verwenden:
Die Berechtigung READ für jedes Geheimnis, auf das verwiesen wird, sowie die Berechtigung USAGE für das Schema des Geheimnisses.
Die Berechtigung USAGE für jede Integration, auf die verwiesen wird.
Mit diesen Berechtigungen kann ein Administrator den Kreis der Benutzer verwalten, die den externen Zugriff aktivieren können. Weitere Informationen dazu finden Sie unter GRANT <Berechtigungen> und Zugriffssteuerungsrechte.
Beispiel¶
Der Code im folgenden Beispiel erstellt eine UDF mit dem Namen google_translate_python
und gibt eine Integration für den externen Zugriff mit dem Namen google_apis_access_integration
an (siehe Erstellen einer Integration für den externen Zugriff für Details). Die Integration gibt eine Netzwerkregel (die einen externen Netzwerkstandort darstellt) und ein Geheimnis (das die Anmeldeinformationen darstellt) an, das eine UDF, die die Integration referenziert, verwenden darf. Weitere Informationen zu dieser Regel und zu Geheimnissen finden Sie unter Erstellen einer Netzwerkregel zur Darstellung des externen Netzwerkstandorts und Erstellen eines Geheimnisses zur Darstellung von Anmeldeinformationen.
Der Python-Handler-Code verwendet die Funktion _snowflake.get_oauth_access_token
, um das Token OAuth aus dem Geheimnis abzurufen, und verwendet dann das Token zur Authentifizierung beim externen Standort. Der Handler-Code kann eine Anfrage an die angegebene URL stellen, weil der Host der URL in der von der Integration angegebenen Netzwerkregel aufgeführt ist.
CREATE OR REPLACE FUNCTION google_translate_python(sentence STRING, language STRING)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = 3.8
HANDLER = 'get_translation'
EXTERNAL_ACCESS_INTEGRATIONS = (google_apis_access_integration)
PACKAGES = ('snowflake-snowpark-python','requests')
SECRETS = ('cred' = oauth_token )
AS
$$
import _snowflake
import requests
import json
session = requests.Session()
def get_translation(sentence, language):
token = _snowflake.get_oauth_access_token('cred')
url = "https://translation.googleapis.com/language/translate/v2"
data = {'q': sentence,'target': language}
response = session.post(url, json = data, headers = {"Authorization": "Bearer " + token})
return response.json()['data']['translations'][0]['translatedText']
$$;