Compartir a través de


Tutorial: Implementación de Data API Builder en Azure Container Apps con la CLI de Azure

El generador de API de datos se puede implementar rápidamente en servicios de Azure como Azure Container Apps como parte de la pila de aplicaciones. En este tutorial, usará la CLI de Azure para automatizar tareas comunes al implementar Data API Builder en Azure. En primer lugar, cree una imagen de contenedor con data API Builder y almacénela en Azure Container Registry. A continuación, implemente la imagen de contenedor en Azure Container Apps con una base de datos de Azure SQL de respaldo. Todo el tutorial se autentica en cada componente mediante identidades administradas.

En este tutorial, hizo lo siguiente:

  • Create una identidad administrada con permisos de control de acceso basado en rol
  • Implementación de Azure SQL con el conjunto de datos AdventureWorksLT de ejemplo
  • Almacenar provisionalmente la imagen de contenedor en Azure Container Registry
  • Implementación de Una aplicación contenedora de Azure con la imagen de contenedor de Data API Builder

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

Requisitos previos

  • Suscripción de Azure
  • Azure Cloud Shell
    • Azure Cloud Shell es un entorno de shell interactivo que puede usar a través del explorador. Use este shell y sus comandos preinstalados para ejecutar el código de este artículo, sin tener que instalar nada en el entorno local. Para iniciar Azure Cloud Shell:
      • Seleccione Pruébelo en un código o bloque de comandos dentro de este artículo. Al seleccionar Probar, no se copia automáticamente el código ni el comando en Cloud Shell.
      • Vaya a https://shell.azure.como seleccione Iniciar Cloud Shell.
      • Seleccione Cloud Shell en la barra de menús del Azure Portal (https://portal.azure.com)

Create aplicación contenedora

En primer lugar, cree una instancia de Azure Container Apps con una identidad administrada asignada por el sistema. A esta identidad se le conceden permisos de control de acceso basado en rol para acceder a Azure SQL y Azure Container Registry.

  1. Create una variable universal SUFFIX que se usará para varios nombres de recursos más adelante en este tutorial.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Create una variable con una LOCATION región de Azure que seleccionó para usarla en este tutorial.

    LOCATION="<azure-region>"
    

    Nota

    Por ejemplo, si desea realizar la implementación en la región Oeste de EE. UU ., usaría este script.

    LOCATION="westus"
    

    Para obtener una lista de las regiones admitidas para la suscripción actual, use az account list-locations

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

    Para más información, consulte Regiones de Azure.

  3. Create una variable denominada RESOURCE_GROUP_NAME con el nombre del grupo de recursos. Para este tutorial, se recomienda msdocs-dab-*. Este valor se usa varias veces en este tutorial.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. Create un nuevo grupo de recursos mediante az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Create variables denominadas API_CONTAINER_NAME y CONTAINER_ENV_NAME con nombres generados de forma única para la instancia de Azure Container Apps. Estas variables se usan en todo el tutorial.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Use az containerapp env create para crear un nuevo entorno de Azure Container Apps.

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. Create una nueva aplicación de contenedor mediante mcr.microsoft.com/azure-databases/data-api-builder Imagen de contenedor DAB y el az containerapp create comando . Esta aplicación contenedora se ejecuta correctamente, pero no está conectada a ninguna base de datos.

    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. Obtenga el identificador principal de la identidad administrada mediante az identity show y almacene el valor en una variable denominada 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" \
    )
    

    Sugerencia

    Siempre puede comprobar la salida de este comando.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

Asignación de permisos

Ahora, asigne los permisos de identidad administrada asignada por el sistema para leer datos de Azure SQL y Azure Container Registry. Además, asigne los permisos de identidad para escribir en Azure Container Registry.

  1. Create una variable denominada RESOURCE_GROUP_ID para almacenar el identificador del grupo de recursos. Obtenga el identificador mediante az group show. Esta variable se usa varias veces en este tutorial.

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

    Sugerencia

    Siempre puede comprobar la salida de este comando.

    echo $RESOURCE_GROUP_ID
    
  2. Use az role assignment create para asignar el rol AcrPush a su cuenta para que pueda insertar contenedores en 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. Asigne el rol AcrPull a la identidad administrada mediante az role assignment create otra vez. Esta asignación permite que la identidad administrada extraiga imágenes de contenedor de Azure Container Registry. La identidad administrada se asigna finalmente a una instancia de Azure Container Apps.

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

Implementación de la base de datos

A continuación, implemente un nuevo servidor y una base de datos en el servicio Azure SQL. La base de datos usa el conjunto de datos de ejemplo AdventureWorksLT .

  1. Create una variable denominada SQL_SERVER_NAME con un nombre generado de forma única para la instancia del servidor de Azure SQL. Esta variable se usará más adelante en esta sección.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Create un nuevo recurso de servidor de Azure SQL mediante az sql server create. Configure la identidad administrada como administrador de este servidor.

    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. Use az sql server firewall-rule create para crear una regla de firewall para permitir el acceso desde los servicios de 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. Use az sql db create para crear una base de datos en el servidor Azure SQL denominado adventureworks. Configure la base de datos para usar los datos de AdventureWorksLT ejemplo.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Create una variable denominada SQL_CONNECTION_STRING con el cadena de conexión de la base de datos en la adventureworks instancia del servidor de Azure SQL. Construya el cadena de conexión con el nombre de dominio completo del servidor mediante az sql server show. Usará esta variable más adelante en este tutorial.

    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;"
    

    Sugerencia

    Siempre puede comprobar la salida de este comando.

    echo $SQL_CONNECTION_STRING
    

Compilar la imagen del contenedor

A continuación, compile una imagen de contenedor mediante un Dockerfile. A continuación, implemente esa imagen de contenedor en una instancia de Azure Container Registry recién creada.

  1. Create una variable denominada CONTAINER_REGISTRY_NAME con un nombre generado de forma única para la instancia de Azure Container Registry. Esta variable se usará más adelante en esta sección.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Create una nueva instancia de Azure Container Registry mediante 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 Dockerfile de varias fases denominado Dockerfile. En el archivo, implemente estos pasos.

    • Uso de la imagen de mcr.microsoft.com/dotnet/sdk contenedor como base de la fase de compilación

    • Instale la CLI de DAB.

    • Create un archivo de configuración para una conexión de base de datos SQL (mssql) mediante la DATABASE_CONNECTION_STRING variable de entorno como cadena de conexión.

    • Create una entidad denominada Product asignada a la SalesLT.Product tabla.

    • Copie el archivo de configuración en la imagen de contenedor final 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. Compile el Dockerfile como una tarea de Azure Container Registry mediante az acr build.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Use az acr show para obtener el punto de conexión del registro de contenedor y almacenarlo en una variable denominada CONTAINER_REGISTRY_LOGIN_SERVER.

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

    Sugerencia

    Siempre puede comprobar la salida de este comando.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Implementación de una imagen de contenedor

Por último, actualice la aplicación contenedora de Azure con la nueva imagen de contenedor personalizada y las credenciales. Pruebe la aplicación en ejecución para validar su conectividad con la base de datos.

  1. Configure la aplicación contenedora para usar el registro de contenedor mediante 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. Use az containerapp secret set para crear un secreto denominado conn-string con el Azure SQL cadena de conexión.

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

    Importante

    Este cadena de conexión no incluye ningún nombre de usuario ni contraseña. El cadena de conexión usa la identidad administrada para acceder a la base de datos Azure SQL. Esto hace que sea seguro usar el cadena de conexión como secreto en el host.

  3. Actualice la aplicación contenedora con la nueva imagen de contenedor personalizada mediante az containerapp update. Establezca la DATABASE_CONNECTION_STRING variable de entorno que se va a leer del secreto creado conn-string anteriormente.

    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. Recupere el nombre de dominio completo de la revisión más reciente de la aplicación contenedora en ejecución mediante az containerapp show. Almacene ese valor en una variable denominada APPLICATION_URL.

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

    Sugerencia

    Siempre puede comprobar la salida de este comando.

    echo $APPLICATION_URL
    
  5. Vaya a la dirección URL y pruebe la Product API REST.

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

    Advertencia

    La implementación puede tardar hasta un minuto. Si no ve una respuesta correcta, espere y actualice el explorador.

Limpieza de recursos

Cuando ya no necesite la aplicación o los recursos de ejemplo, quite la implementación correspondiente y todos los recursos.

az group delete \
  --name $RESOURCE_GROUP_NAME

Paso siguiente