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)
- 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:
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.
Create una variable universal
SUFFIX
que se usará para varios nombres de recursos más adelante en este tutorial.let SUFFIX=$RANDOM*$RANDOM
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.
Create una variable denominada
RESOURCE_GROUP_NAME
con el nombre del grupo de recursos. Para este tutorial, se recomiendamsdocs-dab-*
. Este valor se usa varias veces en este tutorial.RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"
Create un nuevo grupo de recursos mediante
az group create
.az group create \ --name $RESOURCE_GROUP_NAME \ --location $LOCATION \ --tag "source=msdocs-dab-tutorial"
Create variables denominadas
API_CONTAINER_NAME
yCONTAINER_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"
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
Create una nueva aplicación de contenedor mediante
mcr.microsoft.com/azure-databases/data-api-builder
Imagen de contenedor DAB y elaz 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
Obtenga el identificador principal de la identidad administrada mediante
az identity show
y almacene el valor en una variable denominadaMANAGED_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.
Create una variable denominada
RESOURCE_GROUP_ID
para almacenar el identificador del grupo de recursos. Obtenga el identificador medianteaz 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
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
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 .
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"
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
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"
Use
az sql db create
para crear una base de datos en el servidor Azure SQL denominadoadventureworks
. Configure la base de datos para usar los datos deAdventureWorksLT
ejemplo.az sql db create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "adventureworks" \ --sample-name "AdventureWorksLT"
Create una variable denominada
SQL_CONNECTION_STRING
con el cadena de conexión de la base de datos en laadventureworks
instancia del servidor de Azure SQL. Construya el cadena de conexión con el nombre de dominio completo del servidor medianteaz 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.
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"
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
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ónInstale la CLI de DAB.
Create un archivo de configuración para una conexión de base de datos SQL (
mssql
) mediante laDATABASE_CONNECTION_STRING
variable de entorno como cadena de conexión.Create una entidad denominada
Product
asignada a laSalesLT.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
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 \ .
Use
az acr show
para obtener el punto de conexión del registro de contenedor y almacenarlo en una variable denominadaCONTAINER_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.
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"
Use
az containerapp secret set
para crear un secreto denominadoconn-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.
Actualice la aplicación contenedora con la nueva imagen de contenedor personalizada mediante
az containerapp update
. Establezca laDATABASE_CONNECTION_STRING
variable de entorno que se va a leer del secreto creadoconn-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
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 denominadaAPPLICATION_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
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