Tutoriel : Créer une Snowflake Native App avec les Snowpark Container Services¶
Introduction¶
Ce tutoriel décrit comment créer un Snowflake Native App with Snowpark Container Services. Un Snowflake Native App with Snowpark Container Services est une Snowflake Native App qui exécute des charges de travail de conteneur dans Snowflake. Snowflake Native Apps with Snowpark Container Services peut exécuter n’importe quel service conteneurisé, tout en tirant parti de toutes les fonctions du Snowflake Native App Framework, y compris la sécurité, la journalisation, le contenu de données partagé et la logique d’application.
Ce tutoriel utilise à la fois Snowflake CLI et Snowsight pour effectuer les tâches requises.
Ce que vous apprendrez¶
Dans ce tutoriel, vous apprendrez à :
Utilisez Snowflake CLI pour initialiser un projet Snowflake Native App with Snowpark Container Services.
Créez une image Docker pour une appli.
Créez le paquet d’application et les fichiers d’application requis pour un Snowflake Native App with Snowpark Container Services.
Testez un Snowflake Native App with Snowpark Container Services en appelant la fonction de service dans le conteneur.
Conditions préalables¶
Pour réaliser ce tutoriel, vous devez remplir les conditions préalables suivantes :
Accès à un compte Snowflake qui prend en charge Snowpark Container Services.
Vous devez pouvoir utiliser le rôle ACCOUNTADMIN pour créer le rôle utilisé dans ce tutoriel et lui accorder les privilèges requis.
Vous devez avoir Snowflake CLI version
3.0.0
ou supérieure installée sur votre machine locale.Docker Desktop doit être installé sur votre machine locale.
Créer un rôle pour ce tutoriel¶
Ce tutoriel vous guide à travers le processus de création d’un Snowflake Native App with Snowpark Container Services à l’aide du rôle tutorial_role
. Avant de suivre ce tutoriel, un utilisateur de Snowflake ayant le rôle ACCOUNTADMIN doit effectuer les étapes suivantes pour configurer ce rôle.
Pour créer et configurer le rôle tutorial_role
, procédez comme suit :
Pour créer le rôle
tutorial_role
, exécutez la commande suivante :CREATE ROLE tutorial_role;
Pour accorder le rôle
tutorial_role
à l’utilisateur Snowflake qui effectuera le tutoriel, exécutez la commande suivante :GRANT ROLE tutorial_role TO USER <user_name>;
Où :
user_name
Spécifie le nom de l’utilisateur qui effectuera le tutoriel.
Pour accorder les privilèges nécessaires à la création et à l’utilisation des objets Snowflake requis par une appli de conteneur, exécutez les commandes suivantes :
GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE WAREHOUSE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE DATABASE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE APPLICATION PACKAGE ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE APPLICATION ON ACCOUNT TO ROLE tutorial_role; GRANT CREATE COMPUTE POOL ON ACCOUNT TO ROLE tutorial_role WITH GRANT OPTION; GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE tutorial_role WITH GRANT OPTION;
Après avoir effectué les tâches décrites dans cette section, l’utilisateur auquel le rôle tutorial_role
a été attribué sur son compte dispose des autorisations nécessaires pour créer tous les objets Snowflake requis pour créer un Snowflake Native App with Snowpark Container Services. Nous utiliserons ce rôle tout au long de ce tutoriel.
Dans une situation réelle, un fournisseur peut avoir besoin de privilèges similaires ou d’un accès à des objets existants pour développer une appli avec des conteneurs, notamment un pool de calcul, un entrepôt et une base de données.
Créer les objets requis dans votre compte¶
Dans cette section, vous allez créer certains objets Snowflake requis par un Snowflake Native App with Snowpark Container Services.
Configurer votre connexion Snowflake CLI¶
Les commandes que vous exécuterez dans ce tutoriel supposent que vous avez configuré Snowflake CLI pour qu’il se connecte par défaut au compte sur lequel vous développez l’appli. Si ce compte n’est pas défini par défaut, vous pouvez utiliser l’argument de ligne de commande -c
pour spécifier une autre connexion nommée, par exemple :
snow sql -q "SELECT 1" -c connection_name
Créer un entrepôt et un référentiel d’images¶
Pour créer les objets requis, effectuez les opérations suivantes via Snowsight ou Snowflake CLI.
Pour définir le contexte actuel dans Snowsight afin qu’il utilise le rôle
tutorial_role
, exécutez la commande suivante :USE ROLE tutorial_role;
Si vous utilisez Snowflake CLI, vous pouvez utiliser
--role tutorial_role
à la place.Pour créer un entrepôt pour Snowflake Native App with Snowpark Container Services, exécutez la commande suivante :
CREATE OR REPLACE WAREHOUSE tutorial_warehouse WITH WAREHOUSE_SIZE = 'X-SMALL' AUTO_SUSPEND = 180 AUTO_RESUME = true INITIALLY_SUSPENDED = false;
Un entrepôt est requis par la Snowflake Native App pour exécuter les commandes SQL et les procédures stockées.
Pour créer le référentiel d’images utilisé pour stocker le conteneur, exécutez la commande suivante :
CREATE DATABASE tutorial_image_database; CREATE SCHEMA tutorial_image_schema; CREATE IMAGE REPOSITORY tutorial_image_repo;
Dans cette section, vous avez créé un entrepôt qui servira à exécuter des requêtes pour l’appli que vous allez créer, ainsi qu’un référentiel d’images pour héberger des images de conteneurs.
Dans la section suivante, vous allez créer une image pour le conteneur et la télécharger dans le référentiel d’images que vous avez créé ci-dessus.
Construire une image pour un service Snowpark Container Services¶
Dans cette section, vous allez créer une image Docker et la télécharger dans le référentiel d’images que vous avez créé dans la section précédente.
Créer un répertoire de projet¶
Le code source de votre application se trouve dans le système de fichiers local et peut, si vous le souhaitez, faire l’objet d’un contrôle de version. Nous commencerons par utiliser Snowflake CLI pour démarrer un projet Native Apps ; ensuite, nous construirons l’image de notre service de conteneur dans un sous-dossier.
Sur votre système de fichiers local, exécutez la commande suivante pour créer un dossier nommé
na-spcs-tutorial
:snow init --template app_basic na-spcs-tutorial
Note
Vous ajouterez d’autres fichiers et sous-dossiers à ce dossier et modifierez les fichiers que cette commande a créés dans les sous-sections suivantes.
Note
Exécutez
snow init --help
pour voir d’autres modèles de configuration d’un environnement de développement Snowflake Native App.Créez un dossier appelé
service
à l’intérieur du dossierna-spcs-tutorial
. Ce dossier contient le code source du service basé sur un conteneur que nous sommes sur le point de construire et de publier sur Snowflake.Pour obtenir les fichiers Docker nécessaires au tutoriel, téléchargez le fichier zip sur votre système de fichiers local.
Dézippez le contenu dans le dossier
na-spcs-tutorial/service
. Ce dossier doit contenir les fichiers suivants :echo_service.py
Dockerfile
templates/basic_ui.html
echo_spec.yaml
Ouvrez une fenêtre de terminal et accédez à ce répertoire.
Construire une image Docker et la télécharger dans le conteneur¶
Pour créer une image Docker et la télécharger dans le référentiel d’images, procédez comme suit :
Exécutez la commande Docker CLI suivante. Notez que vous devez spécifier le répertoire de travail actuel (.) dans la commande :
docker build --rm --platform linux/amd64 -t my_echo_service_image:tutorial .
Cette commande permet d’effectuer les opérations suivantes :
Construit une image Docker en utilisant le fichier Docker inclus dans le fichier zip que vous avez téléchargé
Nomme l’image
my_echo_service_image
Applique la balise
tutorial
à l’image.
Pour identifier l’URL du référentiel d’images que vous avez créé dans une section précédente, exécutez la commande suivante :
REPO_URL=$(snow spcs image-repository url tutorial_image_database.tutorial_image_schema.tutorial_image_repo --role tutorial_role) echo $REPO_URL
L’URL du référentiel d’images est capturée dans la variable
$REPO_URL
, puis imprimée dans la console. Vous utiliserez cette valeur à l’étape suivante.Pour créer une balise pour l’image qui inclut l’URL de l’image, exécutez la commande Docker CLI suivante :
docker tag <image_name> <image_url>/<image_name>
Cette commande nécessite deux paramètres :
<image_name>
Spécifie le nom de l’image et de la balise.<image_url>/<image_name>
Spécifie l’URL du référentiel d’images où l’image est téléchargée ainsi que le nom et la balise de l’image où elle doit être stockée dans le référentiel distant.
Pour ce tutoriel, utilisez
$REPO_URL
etmy_echo_service_image:tutorial
:docker tag my_echo_service_image:tutorial $REPO_URL/my_echo_service_image:tutorial
Pour vous authentifier auprès du registre Snowflake, exécutez la commande suivante de Snowflake CLI :
snow spcs image-registry login [-c connection_name]
Cette commande charge les identifiants de connexion nécessaires pour que Docker CLI utilise les référentiels d’images de votre compte Snowflake. Vous devez spécifier le nom de la connexion si vous n’utilisez pas le nom par défaut.
Le message
Login Succeeded
s’affiche si tout s’est déroulé correctement.Pour télécharger l’image Docker dans le référentiel d’images, exécutez la commande
docker push
suivante :docker push $REPO_URL/<image_name>
En utilisant la même valeur que
<image_name>
des étapes précédentes, cette commande est :docker push $REPO_URL/my_echo_service_image:tutorial
Confirmez que l’image a été téléchargée avec succès en exécutant la commande suivante :
snow spcs image-repository list-images tutorial_image_database.tutorial_image_schema.tutorial_image_repo --role tutorial_role
Dans cette section, vous avez créé une image Docker contenant le service echo et l’avez poussée vers le référentiel d’images tutorial_repository
que vous avez créé plus tôt dans le tutoriel.
Dans la section suivante, vous allez créer un paquet d’application qui utilise cette image.
Développer votre Snowflake Native App¶
Dans cette section, vous allez créer les fichiers suivants :
- Fichier de définition du projet
Un fichier YAML qui contient des informations sur le(s) objet(s) Snowflake que vous souhaitez créer. Ce fichier s’appelle
snowflake.yml
et est utilisé par Snowflake CLI pour déployer le paquet d’application et l’objet dans votre compte.- Fichier manifeste
Un fichier YAML qui contient des informations de configuration de base sur l’application. Ce fichier s’appelle
manifest.yml
.- Script d’installation
Script SQL qui s’exécute automatiquement lorsqu’un consommateur installe une application dans son compte. Ce fichier peut être appelé comme vous le souhaitez, tant qu’il est référencé par votre manifeste.
Le premier fichier est utilisé par Snowflake CLI, tandis que les deux derniers sont requis par le Snowflake Native App Framework.
Vous en apprendrez plus sur ces fichiers et leur contenu tout au long de ce tutoriel. Vous créerez également un fichier Lisez-moi qui vous sera utile lors de l’affichage et de la publication de votre application dans les sections ultérieures de ce tutoriel.
Création du fichier manifeste d’un paquet d’application¶
Pour créer le fichier manifeste requis pour le paquet d’application, procédez comme suit :
Modifiez
na-spcs-tutorial/app/manifest.yml
pour qu’il ressemble à ce qui suit :manifest_version: 1 artifacts: setup_script: setup_script.sql readme: README.md container_services: images: - /tutorial_image_database/tutorial_image_schema/tutorial_image_repo/my_echo_service_image:tutorial privileges: - BIND SERVICE ENDPOINT: description: "A service that can respond to requests from public endpoints." - CREATE COMPUTE POOL: description: "Permission to create compute pools for running services"
Cet exemple comprend ce qui suit :
La propriété
artifacts
spécifie les emplacements des ressources requises par une appli avec des conteneurs, y compris l’emplacement de l’image Docker que vous avez créée dans une étape précédente, ainsi que le projet README qui sera visible dans Snowsight.La propriété
privileges
permet à un service de répondre aux demandes publiques et de créer son propre pool de calcul. Ces propriétés sont nécessaires à l’instanciation de notre service dans l’étape suivante du tutoriel.
Créer le script d’installation pour le paquet d’application¶
Pour créer le script d’installation requis pour le paquet d’application, procédez comme suit :
Modifiez le fichier
na-spcs-tutorial/app/setup_script.sql
pour y inclure les éléments suivants :CREATE APPLICATION ROLE IF NOT EXISTS app_user; CREATE SCHEMA IF NOT EXISTS core; GRANT USAGE ON SCHEMA core TO APPLICATION ROLE app_user; CREATE OR ALTER VERSIONED SCHEMA app_public; GRANT USAGE ON SCHEMA app_public TO APPLICATION ROLE app_user; CREATE OR REPLACE PROCEDURE app_public.start_app() RETURNS string LANGUAGE sql AS $$ BEGIN -- account-level compute pool object prefixed with app name to prevent clashes LET pool_name := (SELECT CURRENT_DATABASE()) || '_compute_pool'; CREATE COMPUTE POOL IF NOT EXISTS IDENTIFIER(:pool_name) MIN_NODES = 1 MAX_NODES = 1 INSTANCE_FAMILY = CPU_X64_XS AUTO_RESUME = true; CREATE SERVICE IF NOT EXISTS core.echo_service IN COMPUTE POOL identifier(:pool_name) FROM spec='service/echo_spec.yaml'; CREATE OR REPLACE FUNCTION core.my_echo_udf (TEXT VARCHAR) RETURNS varchar SERVICE=core.echo_service ENDPOINT=echoendpoint AS '/echo'; GRANT USAGE ON FUNCTION core.my_echo_udf (varchar) TO APPLICATION ROLE app_user; RETURN 'Service successfully created'; END; $$; GRANT USAGE ON PROCEDURE app_public.start_app() TO APPLICATION ROLE app_user; CREATE OR REPLACE PROCEDURE app_public.service_status() RETURNS VARCHAR LANGUAGE SQL EXECUTE AS OWNER AS $$ DECLARE service_status VARCHAR; BEGIN CALL SYSTEM$GET_SERVICE_STATUS('core.echo_service') INTO :service_status; RETURN PARSE_JSON(:service_status)[0]['status']::VARCHAR; END; $$; GRANT USAGE ON PROCEDURE app_public.service_status() TO APPLICATION ROLE app_user;
Créer un fichier lisez-moi pour le paquet d’application¶
Modifiez
na-spcs-tutorial/app/README.md
pour qu’il ressemble à ce qui suit :Welcome to your first app with containers!
Ce fichier lisez-moi est visible par les consommateurs qui ont installé votre appli.
Créer le fichier de définition du projet¶
Dans cette section, vous allez créer le fichier de définition de projet requis par Snowflake CLI.
Modifiez
na-spcs-tutorial/snowflake.yml
pour qu’il ressemble à ce qui suit :definition_version: 2 entities: na_spcs_tutorial_pkg: type: application package manifest: app/manifest.yml artifacts: - src: app/* dest: ./ - service/echo_spec.yaml meta: role: tutorial_role warehouse: tutorial_warehouse na_spcs_tutorial_app: type: application from: target: na_spcs_tutorial_pkg debug: false meta: role: tutorial_role warehouse: tutorial_warehouse
Dans cette section, vous avez défini une structure de fichiers locale qui peut être déployée dans un compte Snowflake en tant que Snowflake Native App with Snowpark Container Services. Dans la section suivante, vous effectuerez ce déploiement à l’aide de Snowflake CLI.
Créer et tester l’appli¶
Après avoir défini le fichier manifeste, le script d’installation et la spécification de service pour votre Snowflake Native App with Snowpark Container Services, vous pouvez tester l’appli en la déployant sur votre compte à l’aide de Snowflake CLI.
Déployer l’application¶
Pour déployer l’application en zone de développement de zone de préparation, procédez comme suit :
Créez le paquet d’application et l’objet dans votre compte en exécutant la commande suivante dans le dossier
na-spcs-tutorial
:snow app run [-c connection_name]
Cette commande affiche une confirmation qu’un paquet d’application appelé
na_spcs_tutorial_pkg
et un objet d’application appeléna_spcs_tutorial_app
ont été créés dans votre compte. Ces noms correspondent aux noms de la définition du projetsnowflake.yml
que vous avez créée dans une section précédente.
Vous pouvez utiliser la sortie d’URL vers la console pour voir l’application. Cependant, vous devez d’abord vous assurer qu’il dispose de tous les privilèges nécessaires pour créer son service basé sur un conteneur.
Vous le ferez dans la section suivante.
Accorder les privilèges et tester l’application¶
Dans cette section, vous allez accorder les privilèges requis à l’appli et la tester en appelant les services dans le conteneur.
Vous pouvez exécuter les commandes SQL en utilisant soit Snowsight soit Snowflake CLI.
Pour accorder les privilèges et tester l’appli, procédez comme suit.
Note
Pour exécuter dans Snowflake CLI, essayez la syntaxe suivante :
snow sql -q "<sql>" --role tutorial_role --warehouse tutorial_warehouseComme dans les étapes précédentes, vous pouvez ajouter
-c connection_name
pour choisir une connexion autre que celle par défaut.
Accordez le privilège
CREATE COMPUTE POOL
à l’appli en exécutant ce qui suit :grant create compute pool on account to application na_spcs_tutorial_app; grant bind service endpoint on account to application na_spcs_tutorial_app;
Exécutez la procédure
app_public.start_app
que nous avons définie dans le fichiersetup_script.sql
.CALL na_spcs_tutorial_app.app_public.start_app();
Cette procédure crée le pool de calcul, instancie le service et crée la fonction de service.
Confirmez la création de la fonction en exécutant la procédure suivante :
SHOW FUNCTIONS LIKE '%my_echo_udf%' IN APPLICATION na_spcs_tutorial_app;
Note
Les consommateurs ne peuvent pas voir le service en cours d’exécution, car il s’exécute dans le cadre du Snowflake Native App. Par exemple, l’exécution de
SHOW SERVICES IN APPLICATION na_spcs_tutorial_app;
ne renvoie rien.Pour vérifier que le service a été créé et qu’il est intègre, exécutez la commande suivante :
CALL na_spcs_tutorial_app.app_public.service_status();
Cette commande appelle la procédure
app_public.service_status
que vous avez définie dans le script d’installation :Lorsque cette procédure renvoie
READY
, vous passez à l’étape suivante.Pour appeler la fonction de service afin d’envoyer une requête au service et de vérifier la réponse, exécutez la commande suivante :
SELECT na_spcs_tutorial_app.core.my_echo_udf('hello');
Vous verrez un message du service que nous avons téléchargé dans une section précédente :
Bob said hello
.
Démonter l’application et les objets créés dans le tutoriel¶
Comme l’appli utilise un pool de calcul, elle accumule des crédits sur votre compte et son utilisation coûte de l’argent. Pour empêcher l’appli de consommer des ressources, vous devez supprimer l’objet d’application ainsi que tous les objets de niveau compte créés (comme notre COMPUTE POOL
).
Pour confirmer que le pool de calcul est en cours d’exécution, exécutez la commande suivante :
snow object list compute-pool -l "na_spcs_tutorial_app_%"
Vous devriez voir une ligne avec un pool de calcul
ACTIVE
qui a été créé par l’objet d’application.Exécutez la commande Snowflake CLI suivante pour démonter l’appli :
snow app teardown --cascade [-c connection_name]
Note
L’option
CASCADE
supprime tous les objets associés au niveau du compte appartenant à l’appli avant qu’elle ne soit supprimée. Cette option nécessite Snowflake CLI 2.4.0 ou une version supérieure.Exécutez à nouveau la commande
snow object list
pour confirmer que le pool de calcul a été supprimé.
Note
La commande snow app teardown
supprime à la fois le paquet d’application et l’objet d’application, ce qui entraîne la perte de toutes les données d’état.
En savoir plus¶
Félicitations ! Non seulement vous avez terminé ce tutoriel, mais vous avez travaillé sur le cycle de vie du développement et de la publication d’une Snowflake Native App with Snowpark Container Services.
Vous avez :
Utilisé Snowsight et Snowflake CLI pour créer une application à l’aide de Snowflake Native App Framework.
Voir Configuration de Snowflake CLI et connexion à Snowflake pour plus d’informations sur la configuration des connexions utilisées par Snowflake CLI.
Pour plus d’informations sur Snowsight, voir Premiers pas avec les feuilles de calcul et Utilisation de feuilles de calcul dans Snowsight.
Pour plus d’informations sur les Native Apps dans Snowflake CLI, reportez-vous à Utilisation de Snowflake Native App dans Snowflake CLI.
Créé le manifeste et le script d’installation requis par toutes les applications.
Reportez-vous à Création du fichier manifeste d’un paquet d’application et Création d’un script de configuration pour plus de détails.
Créé un paquet d’application qui fonctionne comme un conteneur pour la logique d’application et le contenu des données de votre application.
Reportez-vous à Création d’un paquet d’application pour plus de détails.
Utilisé Docker CLI et Snowflake CLI pour construire et télécharger un conteneur dans Snowflake.
Utilisé Snowpark Container Services pour créer un
COMPUTE POOL
et instancier le conteneur à l’intérieur d’une Snowflake Native App.