Prise en charge de l’appel de fonctions externes via la gestion des API Azure désormais en préversion publique

Prise en charge de l’appel de fonctions externes via la gestion des API Azure désormais en préversion publique


En juin, Snowflake a annoncé l’avant-première publique du fonctions externes fonctionnalité avec prise en charge de l’appel d’API externes via AWS API Gateway. Avec des fonctions externes, vous pouvez facilement étendre vos pipelines de données en appelant des services externes, des bibliothèques tierces ou même votre propre logique personnalisée, permettant ainsi de nouveaux cas d’utilisation passionnants. Par exemple, vous pouvez utiliser des fonctions externes pour la tokenisation externe, le géocodage, la notation des données à l’aide de modèles d’apprentissage automatique pré-formés, et bien plus encore.

Snowflake est ravi d’étendre la prise en charge des fonctions externes à Azure API Management pour une préversion publique. Vous pouvez désormais utiliser des fonctions externes pour appeler des points de terminaison via Azure API Management. Si votre déploiement et vos ressources Snowflake s’exécutent sur Azure, vous avez désormais la possibilité de vous assurer que votre passerelle s’exécute également sur le même cloud et la même région et d’éviter de passer des appels inter-cloud.

Ce blog présente un exemple de traduction de messages dans une table Snowflake de l’anglais vers l’italien à l’aide de fonctions externes pour appeler une API externe via Azure API Management.

EXEMPLE

Dans l’exemple suivant, nous montrons comment utiliser des fonctions externes pour appeler une API via Azure API Management qui déclenchera une fonction Azure. La fonction Azure est écrite en Python et appelle l’API Microsoft Translator fournie par Azure Cognitive Services pour renvoyer la traduction italienne d’une chaîne de texte d’entrée donnée. Cette solution avec des fonctions externes élimine le besoin d’exporter manuellement les données hors de Snowflake, de les traduire, puis de les réimporter, ce qui simplifie considérablement le flux de travail.

Architecture des solutions

Comme le montre la figure 1, lorsque le client exécute une fonction externe référencée dans une instruction SQL, Snowflake initie la demande d’API à Azure API Management. Azure API Management déclenche une fonction Azure qui formate le JSON fourni par Snowflake, appelle l’API REST Microsoft Translator et traite la réponse. La fonction emballe ensuite la traduction demandée dans un format JSON défini par Snowflake afin que la fonction externe puisse interpréter les valeurs et les intégrer au résultat de la requête dans Snowflake.

2020 11 16 blog solution architecture
Figure 1 : Architecture des fonctions externes

Vous pouvez utiliser une architecture similaire pour gérer l’analyse des sentiments, les cours des actions en temps réel, les prévisions météorologiques et à peu près toutes les fonctionnalités fournies par les API accessibles au public.

Mettre en place

L’exemple comprend cinq étapes de haut niveau :

  1. Création d’une nouvelle fonction Python Azure qui répond aux requêtes HTTP
  2. Configuration de l’application Azure Function pour exiger l’authentification Azure AD
  3. Création et configuration du service Azure API Management
  4. Création d’une intégration d’API et de fonctions externes dans Snowflake
  5. Appel de la fonction externe

Création d’une fonction Python Azure

Premièrement, nous créer une nouvelle fonction Python Azure qui répond aux requêtes HTTP. Nous remplaçons le code par défaut par le code ci-dessous. (Noter: N’oubliez pas de remplacer la clé et la région des services cognitifs par vos propres données.)

import os, requests, json
import logging, httpx
import azure.functions as func
 
async def main(req: func.HttpRequest) -> func.HttpResponse:
   endpoint = "https://api.cognitive.microsofttranslator.com/"
   path = "/translate?api-version=3.0"
   params = "&to=it"
   constructed_url = endpoint + path + params
 
   headers = {
       "Ocp-Apim-Subscription-Key": "",
       "Ocp-apim-subscription-region": "",
       "Content-Type": "application/json"
   }
 
   req_body = req.get_json()
      
   if req_body :
       translated = []
       body = []
       i = 0
 
       # Format JSON data passed from Snowflake to what Translator API expects.
       for row in req_body["data"]:
           body.append({"text": row[1]})
      
       # Microsoft recommends using asynchronous APIs for network IO.
	 # This example uses httpx library to make async calls to the API.
       client = httpx.AsyncClient()
       response = await client.post(constructed_url, headers = headers, json = body)
       response_json = response.json()
  
       # Process and format response into Snowflake expected JSON.
       for row in response_json:
           translations = row["translations"][0]
           translated_text = translations["text"]
           translated.append([req_body["data"][i][0], translated_text])
           i += 1
    
       output = {"data": translated}
       return func.HttpResponse(json.dumps(output))
  
   else:
       return func.HttpResponse(
            "Please pass data to translate in the request body",
            Status_code = 400
       )

Après avoir créé la fonction Azure, nous pouvons la tester avec les données de test ci-dessous :

{
 "data": [
   [
     0,
     "hello"
   ]
 ]
}

Configuration de l’application Function pour exiger l’authentification Azure AD

Ensuite, nous configurons l’application Azure Function pour exiger l’authentification Azure AD. Nous le faisons en cliquant sur Autorisation d’authentification dans la section Paramètres de l’application Fonction et en sélectionnant les paramètres illustrés à la figure 2. S’il n’y a pas d’application Azure AD existante, nous pouvons créer une nouvelle application Azure AD en sélectionnant Créer une nouvelle application et en suivant les invites.

2020 11 16 blog azure authentication
Figure 2 : Configuration de l’authentification/autorisation

Nous notons la ID de l’application (client) pour l’application Azure AD associée à notre application de fonctions à partir de la page Inscriptions d’applications. Lorsque Snowflake s’authentifie avec Azure API Management, il utilise cette application AD pour le flux d’octroi des informations d’identification client OAuth.

Création et configuration du service Azure API Management

L’étape suivante consiste à créer et à configurer le service Azure API Management. Comme le montre le diagramme d’architecture (Figure 1), Snowflake n’envoie pas de données (requêtes HTTP POST) directement au service distant (notre fonction Azure). Au lieu de cela, Snowflake envoie les données au service proxy, Azure API Management, qui relaie les données de Snowflake à la fonction Azure, et de la fonction Azure à Snowflake.

Création d’une intégration d’API et d’une fonction externe dans Snowflake

Après avoir installé et configuré les ressources sur Azure, nous permettons à Snowflake d’accéder en toute sécurité au point de terminaison Azure API Management en utilisant le code suivant pour créer l’intégration d’API et la fonction externe :

-- create API integration
create or replace api integration external_api_integration   api_provider = azure_api_management   azure_tenant_id = ''   azure_ad_application_id = ''   api_allowed_prefixes = ('https://.azure-api.net/')   enabled = true;
-- create external functioncreate or replace external function translate_en_italian(input string)    returns variant    api_integration = external_api_integration    as 'https://.azure-api.net//'    ;

Avant de pouvoir appeler la fonction externe, nous devons lier l’intégration de l’API Snowflake au service de gestion des API Azure. Nous exécutons la commande d’intégration de l’API DESCRIBE ci-dessous :

describe api integration external_api_integration;

Pour accorder à Snowflake l’accès à notre locataire Azure, nous obtenons l’URL AZURE_CONSENT_URL de l’intégration d’API, la collons dans notre navigateur et cliquez sur Accepter. Cela crée un principal de service dans notre locataire Azure AD qui permet à Snowflake de s’authentifier auprès d’Azure AD lors de l’appel du service de gestion des API dans notre locataire.

Enfin, nous voulons nous assurer que seul Snowflake est en mesure d’accéder aux API disponibles via l’instance de gestion des API Azure. Nous faisons cela en ajouter une politique ‘validate-jwt’ sur Azure API Management Service pour valider l’en-tête d’autorisation envoyé par Snowflake.

Screen Shot 2020 12 17 at 11.16.25 AM 2
Figure 3 : Ajout d’une stratégie validate-jwt

Appel de la fonction externe

Et maintenant nous avons tout en place pour invoquer la fonction externe sur notre table qui contient les messages à traduire. Dans la figure 3, nous pouvons voir que l’appel à la fonction externe passe, traduisant nos messages anglais en italien.

2020 11 16 blog to italian
Figure 4 : Résultats de la traduction des fonctions externes

CONCLUSION

Ce blog présente un exemple simple d’utilisation de fonctions externes pour appeler des API tierces via le service Azure API Management. Snowflake étendra également la prise en charge à d’autres proxys et configurations courants, alors restez à l’écoute pour les mises à jour !

OBTENEZ PLUS DE SNOWFLAKE

Êtes-vous intéressé à essayer des fonctions externes sur Azure ? Voir la documentation détaillée ici pour commencer. Nous avons hâte de voir tous les cas d’utilisation intéressants que vous créez !

Laisser un commentaire

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