Extension des fonctions externes de Snowflake avec Serverless : ajout de temps de conduite de Mapbox à SQL

Extension des fonctions externes de Snowflake avec Serverless : ajout de temps de conduite de Mapbox à SQL


Les ingénieurs de données adorent utiliser SQL pour résoudre toutes sortes de problèmes de données. Pour cela et plus encore, Snowflake est un partenaire idéal. La prise en charge par Snowflake du SQL standard et de plusieurs variantes SQL, combinée aux procédures stockées JavaScript, m’a aidé à résoudre des problèmes de données complexes. Mais parfois, vous pourriez avoir besoin d’un code personnalisé.

Par exemple, il y a quelques semaines, un client a demandé à connaître les distances et les temps de conduite entre ses principaux clients et leurs entrepôts. Bien que Snowflake ait un calcul HAVERSINE et des types de données spatiales riches, la distance de conduite n’est pas un simple calcul géométrique : elle nécessite une analyse complexe du réseau routier et des vitesses attendues le long de chaque chemin, et est généralement fournie par un service tiers sophistiqué. Je ne pouvais pas utiliser de simples fonctions définies par l’utilisateur (UDF) Snowflake JavaScript, car celles-ci ne peuvent pas appeler des opérations dangereuses telles que des appels réseau.

C’est ici que Flocon de neige Fonctions externes est venu à portée de main. Les fonctions externes sont une nouvelle fonctionnalité qui vous permet d’écrire et d’appeler vos propres applications personnalisées ou d’appeler des applications tierces qui résident en dehors de Snowflake. Ces applications, appelées service à distances, peut être écrit à l’aide de n’importe quelle pile de serveurs HTTP, y compris les services de calcul cloud sans serveur, tels qu’AWS Lambda, avec n’importe quel langage de programmation.

Bien que les étapes pour configurer une fonction externe soient bien documenté, elles peuvent prendre du temps car vous devez créer des rôles, des fonctions et des relations entre votre plateforme cloud et l’instance Snowflake. Vous devez également vous assurer que seul Snowflake peut appeler vos fonctions, et qu’elles le font de manière sécurisée et auditable. Par conséquent, pour simplifier les choses, j’ai créé un plugin Serverless pour déployer les ressources requises pour les fonctions externes sur AWS et Snowflake.

Sans serveur à la rescousse

Cadre sans serveur est un outil d’automatisation cloud open source pour le déploiement des fonctions Lambda. Il aide les développeurs et les ingénieurs de données à se concentrer sur le code tout en masquant les complexités du déploiement. La section suivante décrit un plug-in sans serveur qui automatise le déploiement de fonctions externes sur AWS et Snowflake. Ce plugin est disponible gratuitement sur github.

Le processus de haut niveau pour déployer une fonction externe Snowflake comprend quatre étapes :

1. Créez un nouveau projet Serverless à partir d’un modèle Snowflake.

2. Modifiez le code gestionnaire.

3. Ajoutez la configuration AWS et Snowflake (telle que les informations d’identification ou la région).

4. Déployez la fonction externe.

Tout est automatisé. Il n’est pas nécessaire de se connecter à AWS Management Console ou à l’interface utilisateur Snowflake.

Par exemple, suivez ces étapes pour créer un simple Bonjour le monde fonction:

1. Créez votre modèle de projet :

serverless create --template-url https://github.com/starschema/snowflake-aws-external-function -p hello-function rncd hello-function rnnpm install serverless-snowflake-external-function-plugin 

2. Configurez les connexions Snowflake et AWS. Par exemple, vous pouvez remplacer les lignes suivantes dans Serverless.yml par les informations de votre compte :

Le code réel de la fonction se trouve dans handler.js :

'use strict';rnrnmodule.exports.hello = async event => {rn  const body = JSON.parse(event.body);rnrn  return {rn    statusCode: 200,rn    body: JSON.stringify(rn      {rn        data: body.data.map((row) => [row[0], 'hello from lambda'])rn      }rn    )rn  };rnrn  // Use this code if you don't use the http event with the LAMBDA-PROXY integrationrn  // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };rn};

Les clés d’accès et secrètes AWS sont conservées en tant que variables d’environnement (AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY).

3. Déployez la fonction sur AWS et Snowflake avec un sls deploy commande.

Si tout s’est bien passé, vous devriez pouvoir appeler votre fonction depuis la console Snowflake :

Ajout de l’API Mapbox

Cet exemple de fonction CALCDISTANCE utilise la fonction API Mapbox Directions, l’API REST de navigation détaillée de Mapbox. Suivez ces étapes:

1. Inscrivez-vous pour obtenir un jeton d’accès. Cela vous permet de récupérer la distance parcourue avec une simple application node/javascript.

2. Ajoutez l’appel d’API JavaScript REST suivant à votre handler.js et modifiez la signature de la fonction dans serverless.yml. Cet exemple d’implémentation de Mapbox est juste un appel Web :

Pour mapper ce gestionnaire à la fonction externe, modifiez la signature de la fonction dans serverless.yml comme indiqué ici :

functions:rn  calc_distance:rn    handler: handler.calcDistancernrn    snowflake:rn      argument_signature: (with_profile varchar,coorda varchar,coordb varchar)rn      data_type: variantrnrn    events:rn      - http:rn          path: calc_distancern          method: post rn          authorizer: aws_iam

Cette définition crée une variante de fonction CALC_DISTANCE (with_profile varchar,coorda varchar,coordb varchar), exécutant le handler.calcDistance code. Notez que même si les UDF JavaScript ne peuvent pas accéder aux services Web externes, les fonctions externes peuvent appeler en toute sécurité des points de terminaison distants tels que des API Web ou d’autres applications externes. Pour tester votre fonction nouvellement déployée, connectez-vous à Snowflake et testez la fonction avec une simple instruction SELECT pour déterminer si la conduite ou le vélo est plus rapide.

L’UDF dans l’exemple fonctionne comme prévu, renvoyant des résultats avec la distance de conduite et la durée en mètres et en secondes respectivement, montrant que l’itinéraire à vélo est plus court mais prend un peu plus de temps. Ces résultats proviennent de SQL pur, directement de Snowflake.

Le code source complet de cette fonction Mapbox Snowflake est disponible sur github, ici :
https://github.com/tfoldi/snowflake-mapbox-functions

Sommaire

Les fonctions externes sont une fonctionnalité de Snowflake qui vous permet d’écrire et d’appeler des applications personnalisées en tant que fonctions définies par l’utilisateur depuis Snowflake. Contrairement aux UDF traditionnels, cependant, les fonctions externes sont exécutées sur votre propre infrastructure cloud, tout en vous permettant d’accéder en toute sécurité à vos données Snowflake. En utilisant le plug-in de Serverless pour déployer vos fonctions externes sur AWS et Snowflake, vous pouvez simplifier considérablement le processus de déploiement et tirer parti de la possibilité d’appeler du code personnalisé et des API tierces en dehors de Snowflake.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.