Langlaufende Dienste in einer App erstellen und verwalten¶
Unter diesem Thema wird beschrieben, wie Sie Dienste mit langen Ausführungszeiten in einer Snowflake Native App with Snowpark Container Services konfigurieren und verwenden. Informationen zur Verwendung eines Jobdienstes in einer App finden Sie unter Jobdienste in einer App erstellen und verwalten.
Erforderliche Berechtigungen zum Erstellen eines Dienstes im Verbraucherkonto¶
Damit eine App einen Dienst im Verbraucherkonto erstellen kann, muss der Verbraucher zunächst die folgenden Berechtigungen erteilen:
CREATE COMPUTE POOL
Diese Berechtigung ist für alle Dienste erforderlich. Ein oder mehrere Computepools sind erforderlich, um einen Dienst im Verbraucherkonto zu erstellen.
BIND SERVICE ENDPOINT
Diese Berechtigung ist für jeden Dienst erforderlich, der Endpunkte zur Verfügung stellt. Wenn ein Dienst Verbindungen zu URLs außerhalb von Snowflake herstellen muss, ist diese Berechtigung erforderlich, damit die App die erforderliche Integration für den externen Zugriff erstellen kann.
Hinweise zum Erstellen von Diensten innerhalb einer App¶
Die folgenden Aspekte müssen beim Erstellen eines Dienstes innerhalb einer Snowflake Native App with Snowpark Container Services berücksichtigt werden:
Referenzen auf Warehouses. Informationen zur Verwendung in einer Snowflake Native App with Snowpark Container Services finden Sie unter Best Practices bei der Verwendung von Diensten innerhalb einer App.
In Anführungszeichen gesetzte Namen für einen Dienst innerhalb einer App werden nicht unterstützt.
Dienste können nicht in einem versionierten Schema erstellt werden.
Dienste dürfen nicht außerhalb der Anwendung unter Verwendung eines in der App erstellten Container-Images erstellt werden.
Befehl CREATE SERVICE in einer App verwenden¶
Verwenden Sie CREATE SERVICE, um einen langlaufenden Dienst zu erstellen. Im Kontext einer App sollten Anbieter immer in Betracht ziehen, diesen Befehl aus einer gespeicherten Prozedur heraus aufzurufen, anstatt ihn direkt im Setup-Skript aufzurufen.
Um einen Dienst zu erstellen, verwenden Sie den Befehl CREATE SERVICE innerhalb einer gespeicherten Prozedur. Das folgende Beispiel zeigt die Syntax für die Verwendung dieses Befehls in einer App.
CREATE SERVICE [ IF NOT EXISTS ] <name>
IN COMPUTE POOL <compute_pool_name>
{
fromSpecification
| fromSpecificationTemplate
}
fromSpecification ::=
SPECIFICATION_FILE = '/containers/service1_spec.yaml'
fromSpecificationTemplate ::=
FROM SPECIFICATION_TEMPLATE_FILE = '/containers/service1_spec.yaml'
USING ( <key> => <value> [ , <key> => <value> [ , ... ] ] )
Die FROM SPECIFICATION_FILE-Klausel zeigt auf die für eine bestimmte Version der App spezifische Dienstspezifikationsdatei. Dieser Pfad ist relativ zum Stammverzeichnis der App.
Befehl CREATE SERVICE zu einer gespeicherten Prozedur hinzufügen¶
Snowflake Native Apps with Snowpark Container Services unterstützen mehrere Möglichkeiten, einen Dienst innerhalb einer gespeicherten Prozedur zu erstellen.
Ein Anbieter kann eine beliebige Kombination dieser Methoden verwenden, um Dienste im Verbraucherkonto zu erstellen.
Dienst mithilfe der Eigenschaft grant_callback
erstellen¶
grant_callback
ist eine Eigenschaft in der Manifest-Datei, die es Anbietern ermöglicht, eine Callback-Funktion anzugeben. Bei der Callback-Funktion handelt es sich um eine gespeicherte Prozedur, die Computepools und Dienste erstellen und andere von der Anwendung benötigte Einrichtungsaufgaben ausführen kann.
Bemerkung
Die Verwendung der Eigenschaft grant_callback
zur Angabe der Callback-Funktion wird nur von Snowflake Native Apps with Snowpark Container Services unterstützt.
Der Vorteil der Angabe einer Callback-Funktion mit grant_callback
ist, dass die gespeicherte Prozedur erst dann aufgerufen wird, wenn der App vom Verbraucher die erforderlichen Berechtigungen erteilt wurden. Dadurch wird sichergestellt, dass die App über die erforderlichen Berechtigungen verfügt, um Dienste und andere Objekte im Verbraucherkonto zu erstellen.
Um grant_callback
zu verwenden, fügen Sie es dem Abschnitt configuration
der Datei manifest.yml
hinzu:
configuration:
log_level: INFO
trace_level: ALWAYS
grant_callback: core.grant_callback
Definieren Sie dann im Setup-Skript eine Callback-Funktion wie im folgenden Beispiel gezeigt:
CREATE SCHEMA core;
CREATE APPLICATION ROLE app_public;
CREATE OR REPLACE PROCEDURE core.grant_callback(privileges array)
RETURNS STRING
AS $$
BEGIN
IF (ARRAY_CONTAINS('CREATE COMPUTE POOL'::VARIANT, privileges)) THEN
CREATE COMPUTE POOL IF NOT EXISTS app_compute_pool
MIN_NODES = 1
MAX_NODES = 3
INSTANCE_FAMILY = GPU_NV_M;
END IF;
IF (ARRAY_CONTAINS('BIND SERVICE ENDPOINT'::VARIANT, privileges)) THEN
CREATE SERVICE IF NOT EXISTS core.app_service
IN COMPUTE POOL my_compute_pool
FROM SPECIFICATION_FILE = '/containers/service1_spec.yaml';
END IF;
RETURN 'DONE';
END;
$$;
GRANT USAGE ON PROCEDURE core.grant_callback(array) TO APPLICATION ROLE app_public;
In diesem Beispiel wird eine grant_callback
-Prozedur erstellt, die Folgendes tut:
Prüft, ob der Verbraucher der App die CREATE COMPUTE POOL-Berechtigung erteilt hat. Wenn der Verbraucher diese Berechtigung erteilt hat, erstellt die
grant_callback
-Prozedur den Computepool.Prüft, ob der Verbraucher der App die BIND SERVICE ENDPOINT-Berechtigung erteilt hat. Wenn der Verbraucher diese Berechtigung erteilt hat, erstellt die
grant_callback
-Prozedur den Dienst.
Dieses Beispiel zeigt ein Muster für die Erstellung von Diensten und eines Computepools in einer App mit Containern. In diesem Beispiel testet die App zunächst, ob der Verbraucher die erforderlichen Berechtigungen erteilt hat, und erstellt dann den Service oder den Computepool.
Dienst auf Grundlage einer Referenzdefinition erstellen¶
Eine App kann Dienste über eine Referenzdefinition erstellen, indem sie die Eigenschaft register_callback
in der Datei manifest.yml
verwendet. Diese Eigenschaft gibt eine gespeicherte Prozedur an, die verwendet wird, um ein Objekt im Verbraucherkonto mit der Referenzdefinition zu verbinden.
Weitere Informationen zur Verwendung von Referenzen in einer App finden Sie unter Referenzen und Berechtigungen auf Objektebene von Verbrauchern anfordern
Eine App kann die Eigenschaft register_callback
der Referenz verwenden, um einen Dienst zu erstellen, nachdem alle erforderlichen Referenzen gebunden wurden. Wenn ein Dienst erstellt wird, bevor alle Referenzen auf eine Integration für den externen Zugriff oder ein Geheimnis zugelassen wird, schlägt das Erstellen des Dienstes fehl.
Dienst mit einer gespeicherten Prozedur erstellen¶
Eine App kann einen Dienst direkt innerhalb einer gespeicherten Prozedur erstellen. Wie bei anderen gespeicherten Prozeduren können Anbieter sie im Setup-Skript der Anwendung definieren. Diese gespeicherte Prozedur würde den Befehl CREATE SERVICE verwenden, um den Dienst zu erstellen, und dann einer Anwendungsrolle die erforderlichen Berechtigungen für die gespeicherte Prozedur zuweisen.
Der Verbraucher würde diese gespeicherte Prozedur aufrufen, um den Dienst in seinem Konto zu erstellen, nachdem er der App die erforderlichen Berechtigungen und Referenzen erteilt hat.
Status eines Dienstes ermitteln¶
Um den Status eines Dienstes zu ermitteln, kann eine App die Systemfunktion SYSTEM$GET_SERVICE_STATUS – Veraltet aus dem Setup-Skript heraus aufrufen.
Diese Systemfunktion gibt ein JSON-Objekt für jeden Container in jeder Dienstinstanz zurück.
Best Practices bei der Verwendung von Diensten innerhalb einer App¶
Im Folgenden finden Sie bewährte Methoden und Hinweise zur Verwendung von Diensten innerhalb einer Snowflake Native App with Snowpark Container Services:
Erstellen Sie eine Streamlit-App oder gespeicherte Prozeduren, mit denen Verbraucher mit einem Dienst interagieren können.
In manchen Situationen muss ein Verbraucher die von der App bereitgestellten Dienste erstellen, starten, stoppen, neu starten und verwalten.
Verwenden Sie eine einzige gespeicherte Prozedur, um zu überprüfen, ob der Verbraucher alle erforderlichen Berechtigungen erteilt hat.
Für einen Dienst kann es erforderlich sein, dass der Verbraucher der App mehrere Berechtigungen erteilt. Ein Dienst kann zum Beispiel die Berechtigungen CREATE COMPUTE POOL, CREATE WAREHOUSE, BIND SERVICE ENDPOINT und andere erfordern. Eine App kann auch eine Referenz auf bestehende Objekte im Verbraucherkonto erfordern.
In diesem Zusammenhang empfiehlt Snowflake die Verwendung einer einzigen gespeicherten Prozedur, um zu überprüfen, ob alle Voraussetzungen erfüllt sind. Nachdem die Voraussetzungen erfüllt sind, würde diese gespeicherte Prozedur den Dienst erstellen.
Wenn ein Dienst ein Warehouse zum Ausführen von Abfragen benötigt, sollte die App das Warehouse direkt im Verbraucherkonto erstellen. Dies setzt voraus, dass der Verbraucher der App die globale Berechtigung CREATE WAREHOUSE erteilt. Weitere Informationen dazu finden Sie unter Globale Berechtigungen von Verbrauchern anfordern.
Wenn Sie einen Service mit Hilfe einer Spezifikationsvorlage erstellen, speichern Sie die vom Verbraucher bereitgestellten Argumente innerhalb Ihrer Anwendungsinstanz. Auf diese Weise können sie bei der Aktualisierung eines Services als Argumente übergeben werden.