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, usted hará lo siguiente:

  • Creación de 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
  • Almacenamiento provisional de la imagen de contenedor en Azure Container Registry
  • Implementación de Azure Container App con la imagen de contenedor de Data API Builder

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

Prerrequisitos

  • 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 de Azure Portal (https://portal.azure.com)

Creación de una aplicación de contenedor

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

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

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Cree una LOCATION variable con una región de Azure que haya seleccionado 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. Cree 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. Cree un nuevo grupo de recursos mediante az group create.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Cree 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. Cree una nueva aplicación de contenedor mediante la 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 asignadas 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. Cree 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. Cree una variable denominada SQL_SERVER_NAME con un nombre generado de forma única para la instancia de Azure SQL Server. Esta variable se usa más adelante en esta sección.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. Cree un nuevo recurso de Azure SQL Server 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 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 azure SQL Server denominada adventureworks. Configure la base de datos para usar datos de ejemplo AdventureWorksLT.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Cree una variable denominada SQL_CONNECTION_STRING con la cadena de conexión para la base de datos en la adventureworks instancia de Azure SQL Server. Construya la 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. Cree una variable denominada CONTAINER_REGISTRY_NAME con un nombre generado de forma única para la instancia de Azure Container Registry. Esta variable se usa más adelante en esta sección.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. Cree 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. Cree un Dockerfile de varias fases denominado Dockerfile. En el archivo, implemente estos pasos.

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

    • Instale la CLI de DAB.

    • Cree 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.

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

    • Copie el archivo de configuración en la imagen final mcr.microsoft.com/azure-databases/data-api-builder del contenedor.

    FROM mcr.microsoft.com/dotnet/sdk:8.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
    

Desplegar 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 a la base de datos.

  1. Configure la aplicación de contenedor 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 la cadena de conexión de Azure SQL.

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

    Importante

    Esta cadena de conexión no incluye ningún nombre de usuario ni contraseña. La cadena de conexión usa la identidad administrada para acceder a la base de datos de Azure SQL. Esto hace que sea seguro usar la 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 variable de entorno DATABASE_CONNECTION_STRING para leer desde el secreto conn-string creado 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