Partager via


Tutoriel : Déployer le générateur d’API de données sur Azure Container Apps avec Azure CLI

Le générateur d’API de données peut être rapidement déployé sur des services Azure comme Azure Container Apps dans le cadre de votre pile d’applications. Dans ce tutoriel, vous utilisez Azure CLI pour automatiser les tâches courantes lors du déploiement du générateur d’API de données sur Azure. Tout d’abord, vous créez une image conteneur avec le Générateur d’API de données et vous la stockez dans Azure Container Registry. Vous déployez ensuite l’image conteneur sur Azure Container Apps avec une base de données Azure SQL de sauvegarde. L’ensemble du tutoriel s’authentifie auprès de chaque composant à l’aide d’identités managées.

Dans ce tutoriel, vous allez :

  • Create une identité managée avec des autorisations de contrôle d’accès en fonction du rôle
  • Déployer Azure SQL avec l’exemple de jeu de données AdventureWorksLT
  • Mettre en scène l’image conteneur dans Azure Container Registry
  • Déployer Azure Container App avec l’image conteneur du générateur d’API de données

Si vous n’avez pas d’abonnement Azure, créez un compte gratuit avant de commencer.

Prérequis

  • Abonnement Azure
  • Azure Cloud Shell
    • Azure Cloud Shell est un environnement d’interpréteur de commandes interactif que vous pouvez utiliser via votre navigateur. Utilisez cet interpréteur de commandes et ses commandes préinstallées pour exécuter le code de cet article, sans avoir à installer quoi que ce soit sur votre environnement local. Pour démarrer Azure Cloud Shell :
      • Sélectionnez Essayer dans un bloc de code ou de commande dans cet article. Si vous sélectionnez Essayer, vous ne copiez pas automatiquement le code ou la commande dans Cloud Shell.
      • Accédez à https://shell.azure.comou sélectionnez Lancer Cloud Shell.
      • Sélectionnez Cloud Shell dans la barre de menus du Portail Azure (https://portal.azure.com)

application conteneur Create

Tout d’abord, créez un instance Azure Container Apps avec une identité managée affectée par le système. Cette identité se voit finalement accorder des autorisations de contrôle d’accès en fonction du rôle pour accéder aux Azure SQL et aux Azure Container Registry.

  1. Create une variable universelle SUFFIX à utiliser pour plusieurs noms de ressources plus loin dans ce didacticiel.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Create une LOCATION variable avec une région Azure que vous avez sélectionnée pour utiliser dans ce didacticiel.

    LOCATION="<azure-region>"
    

    Notes

    Par exemple, si vous souhaitez déployer dans la région USA Ouest , vous devez utiliser ce script.

    LOCATION="westus"
    

    Pour obtenir la liste des régions prises en charge pour l’abonnement actuel, utilisez az account list-locations

    az account list-locations --query "[].{Name:displayName,Slug:name}" --output table
    

    Pour plus d’informations, consultez Régions Azure.

  3. Create une variable nommée RESOURCE_GROUP_NAME avec le nom du groupe de ressources. Pour ce tutoriel, nous vous recommandons msdocs-dab-*. Vous utilisez cette valeur plusieurs fois dans ce didacticiel.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Create un nouveau groupe de ressources à l’aide de az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Create des variables nommées API_CONTAINER_NAME et CONTAINER_ENV_NAME avec des noms générés de manière unique pour vos instance Azure Container Apps. Vous utilisez ces variables tout au long du didacticiel.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Utilisez az containerapp env create pour créer un environnement Azure Container Apps.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Create une nouvelle application conteneur à l’aide de mcr.microsoft.com/azure-databases/data-api-builder Image conteneur DAB et la az containerapp create commande. Cette application conteneur s’exécute correctement, mais n’est connectée à aucune base de données.

    az containerapp create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --environment $CONTAINER_ENV_NAME \
      --name $API_CONTAINER_NAME \
      --image "mcr.microsoft.com/azure-databases/data-api-builder" \
      --ingress "external" \
      --target-port "5000" \
      --system-assigned
    
  8. Obtenez l’identificateur principal de l’identité managée à l’aide az identity show de et stockez la valeur dans une variable nommée MANAGED_IDENTITY_PRINCIPAL_ID.

    MANAGED_IDENTITY_PRINCIPAL_ID=$( \
      az containerapp show \ 
        --resource-group $RESOURCE_GROUP_NAME \
        --name $API_CONTAINER_NAME \
        --query "identity.principalId" \
        --output "tsv" \
    )
    

    Conseil

    Vous pouvez toujours case activée la sortie de cette commande.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Attribuer des autorisations

À présent, attribuez les autorisations d’identité managée attribuées par le système pour lire les données des Azure SQL et des Azure Container Registry. En outre, attribuez vos autorisations d’identité pour écrire dans Azure Container Registry.

  1. Create une variable nommée RESOURCE_GROUP_ID pour stocker l’identificateur du groupe de ressources. Obtenez l’identificateur à l’aide de az group show. Vous utilisez cette variable plusieurs fois dans ce didacticiel.

    RESOURCE_GROUP_ID=$( \
      az group show \
        --name $RESOURCE_GROUP_NAME \
        --query "id" \
        --output "tsv" \
    )
    

    Conseil

    Vous pouvez toujours case activée la sortie de cette commande.

    echo $RESOURCE_GROUP_ID
    
  2. Utilisez az role assignment create pour attribuer le rôle AcrPush à votre compte afin de pouvoir envoyer des conteneurs à Azure Container Registry.

    CURRENT_USER_PRINCIPAL_ID=$( \
      az ad signed-in-user show \
        --query "id" \
        --output "tsv" \
    )
    
    # AcrPush
    az role assignment create \
      --assignee $CURRENT_USER_PRINCIPAL_ID \
      --role "8311e382-0749-4cb8-b61a-304f252e45ec" \
      --scope $RESOURCE_GROUP_ID
    
  3. Attribuez à nouveau le rôle AcrPull à votre identité az role assignment create managée. Cette affectation permet à l’identité managée d’extraire des images conteneur de Azure Container Registry. L’identité managée est finalement affectée à un instance Azure Container Apps.

    # AcrPull    
    az role assignment create \
      --assignee $MANAGED_IDENTITY_PRINCIPAL_ID \
      --role "7f951dda-4ed3-4680-a7ca-43fe172d538d" \
      --scope $RESOURCE_GROUP_ID
    

Déployer une base de données

Ensuite, déployez un nouveau serveur et une nouvelle base de données dans le service Azure SQL. La base de données utilise l’exemple de jeu de données AdventureWorksLT .

  1. Create une variable nommée SQL_SERVER_NAME avec un nom généré de manière unique pour votre instance de serveur Azure SQL. Vous utiliserez cette variable plus loin dans cette section.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Create une nouvelle ressource de serveur Azure SQL à l’aide de az sql server create. Configurez l’identité managée en tant qu’administrateur de ce serveur.

    az sql server create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $SQL_SERVER_NAME \
      --location $LOCATION \
      --enable-ad-only-auth \
      --external-admin-principal-type "User" \
      --external-admin-name $API_CONTAINER_NAME \
      --external-admin-sid $MANAGED_IDENTITY_PRINCIPAL_ID
    
  3. Utilisez az sql server firewall-rule create pour créer une règle de pare-feu pour autoriser l’accès à partir des services Azure.

    az sql server firewall-rule create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "AllowAzure" \
      --start-ip-address "0.0.0.0" \
      --end-ip-address "0.0.0.0"
    
  4. Utilisez az sql db create pour créer une base de données dans le serveur Azure SQL nommé adventureworks. Configurez la base de données pour utiliser les AdventureWorksLT exemples de données.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Create une variable nommée SQL_CONNECTION_STRING avec le chaîne de connexion de la base de données dans votre adventureworks instance de serveur Azure SQL. Construisez le chaîne de connexion avec le nom de domaine complet du serveur à l’aide az sql server showde . Vous utiliserez cette variable plus loin dans ce tutoriel.

    SQL_SERVER_ENDPOINT=$( \
      az sql server show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $SQL_SERVER_NAME \
        --query "fullyQualifiedDomainName" \
        --output "tsv" \
    )
    
    SQL_CONNECTION_STRING="Server=$SQL_SERVER_ENDPOINT;Database=adventureworks;Encrypt=true;Authentication=Active Directory Default;"
    

    Conseil

    Vous pouvez toujours case activée la sortie de cette commande.

    echo $SQL_CONNECTION_STRING
    

Générer l’image conteneur

Ensuite, générez une image conteneur à l’aide d’un fichier Dockerfile. Déployez ensuite cette image conteneur sur un Azure Container Registry instance nouvellement créé.

  1. Create une variable nommée CONTAINER_REGISTRY_NAME avec un nom généré de manière unique pour votre Azure Container Registry instance. Vous utiliserez cette variable plus loin dans cette section.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Create une nouvelle Azure Container Registry instance à l’aide de az acr create.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. Create un fichier Dockerfile à plusieurs étapes nommé Dockerfile. Dans le fichier, implémentez ces étapes.

    • Utiliser l’image mcr.microsoft.com/dotnet/sdk conteneur comme base de la phase de génération

    • Installez l’interface CLI DAB.

    • Create un fichier de configuration pour une connexion de base de données SQL (mssql) en utilisant la DATABASE_CONNECTION_STRING variable d’environnement comme chaîne de connexion.

    • Create une entité nommée Product mappée à la SalesLT.Product table.

    • Copiez le fichier de configuration dans l’image conteneur finale mcr.microsoft.com/azure-databases/data-api-builder .

    FROM mcr.microsoft.com/dotnet/sdk:6.0-cbl-mariner2.0 AS build
    
    WORKDIR /config
    
    RUN dotnet new tool-manifest
    
    RUN dotnet tool install Microsoft.DataApiBuilder
    
    RUN dotnet tool run dab -- init --database-type "mssql" --connection-string "@env('DATABASE_CONNECTION_STRING')"
    
    RUN dotnet tool run dab -- add Product --source "SalesLT.Product" --permissions "anonymous:read"
    
    FROM mcr.microsoft.com/azure-databases/data-api-builder
    
    COPY --from=build /config /App
    
  4. Générez le fichier Dockerfile en tant que tâche Azure Container Registry à l’aide de az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Utilisez az acr show pour obtenir le point de terminaison du registre de conteneurs et le stocker dans une variable nommée CONTAINER_REGISTRY_LOGIN_SERVER.

    CONTAINER_REGISTRY_LOGIN_SERVER=$( \
      az acr show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CONTAINER_REGISTRY_NAME \
        --query "loginServer" \
        --output "tsv" \
    )
    

    Conseil

    Vous pouvez toujours case activée la sortie de cette commande.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Déployer une image conteneur

Enfin, mettez à jour l’application conteneur Azure avec la nouvelle image de conteneur personnalisée et les informations d’identification. Testez l’application en cours d’exécution pour valider sa connectivité à la base de données.

  1. Configurez l’application conteneur pour utiliser le registre de conteneurs à l’aide de az containerapp registry set.

    az containerapp registry set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --server $CONTAINER_REGISTRY_LOGIN_SERVER \
      --identity "system"
    
  2. Utilisez az containerapp secret set pour créer un secret nommé conn-string avec le Azure SQL chaîne de connexion.

    az containerapp secret set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --secrets conn-string="$SQL_CONNECTION_STRING"
    

    Important

    Cette chaîne de connexion n’inclut aucun nom d’utilisateur ou mot de passe. Le chaîne de connexion utilise l’identité managée pour accéder à la base de données Azure SQL. Cela permet d’utiliser le chaîne de connexion comme secret dans l’hôte.

  3. Mettez à jour l’application conteneur avec votre nouvelle image conteneur personnalisée à l’aide de az containerapp update. Définissez la DATABASE_CONNECTION_STRING variable d’environnement pour lire à partir du secret créé conn-string précédemment.

    az containerapp update \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --image "$CONTAINER_REGISTRY_LOGIN_SERVER/adventureworkslt-dab:latest" \
      --set-env-vars DATABASE_CONNECTION_STRING=secretref:conn-string
    
  4. Récupérez le nom de domaine complet de la dernière révision dans l’application conteneur en cours d’exécution à l’aide de az containerapp show. Stockez cette valeur dans une variable nommée APPLICATION_URL.

    APPLICATION_URL=$( \
      az containerapp show \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $API_CONTAINER_NAME \
        --query "properties.latestRevisionFqdn" \
        --output "tsv" \
    )
    

    Conseil

    Vous pouvez toujours case activée la sortie de cette commande.

    echo $APPLICATION_URL
    
  5. Accédez à l’URL et testez l’API Product REST.

    echo "https://$APPLICATION_URL/api/Product"
    

    Avertissement

    Le déploiement peut prendre jusqu’à une minute. Si vous ne voyez pas de réponse réussie, attendez et actualisez votre navigateur.

Nettoyer les ressources

Lorsque vous n’avez plus besoin de l’exemple d’application ou de ressources, supprimez le déploiement correspondant et toutes les ressources.

az group delete \
  --name $RESOURCE_GROUP_NAME

Étape suivante