Aracılığıyla paylaş


Öğretici: Azure CLI ile Azure Container Apps'e Veri API oluşturucusu dağıtma

Veri API oluşturucusu, uygulama yığınınızın bir parçası olarak Azure Container Apps gibi Azure hizmetlerine hızla dağıtılabilir. Bu öğreticide, Azure'a Veri API oluşturucusu dağıtırken sık kullanılan görevleri otomatikleştirmek için Azure CLI'yi kullanacaksınız. İlk olarak, Data API builder ile bir kapsayıcı görüntüsü oluşturup Azure Container Registry depolarsınız. Ardından kapsayıcı görüntüsünü bir yedekleme Azure SQL veritabanıyla Azure Container Apps'e dağıtırsınız. Öğreticinin tamamı, yönetilen kimlikleri kullanarak her bileşende kimlik doğrulaması yapar.

Bu öğreticide şunları yaptınız:

  • Rol tabanlı erişim denetimi izinleriyle yönetilen kimliği İçerik Oluşturucu
  • Örnek AdventureWorksLT veri kümesiyle Azure SQL dağıtma
  • Kapsayıcı görüntüsünü Azure Container Registry
  • Azure Container App'i Data API builder kapsayıcı görüntüsüyle dağıtma

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Önkoşullar

  • Azure aboneliği
  • Azure Cloud Shell
    • Azure Cloud Shell, tarayıcınız aracılığıyla kullanabileceğiniz etkileşimli bir kabuk ortamıdır. Yerel ortamınıza herhangi bir şey yüklemek zorunda kalmadan bu makaledeki kodu çalıştırmak için bu kabuğu ve önceden yüklenmiş komutlarını kullanın. Azure Cloud Shell’i başlatmak için:
      • Bu makalenin içindeki bir kodda veya komut bloğunda Deneyin'i seçin. Deneyin seçildiğinde kod veya komut otomatik olarak Cloud Shell kopyalanmaz.
      • adresine https://shell.azure.comgidin veya Cloud Shell Başlat'ı seçin.
      • Azure portal menü çubuğunda Cloud Shell seçin (https://portal.azure.com)

kapsayıcı uygulamasını İçerik Oluşturucu

İlk olarak, sistem tarafından atanan yönetilen kimliğe sahip bir Azure Container Apps örneği oluşturun. Bu kimliğe sonunda Azure SQL ve Azure Container Registry erişmek için rol tabanlı erişim denetimi izinleri verilir.

  1. Bu öğreticinin devamında birden çok kaynak adı için kullanılacak evrensel SUFFIX bir değişken İçerik Oluşturucu.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. Bu öğreticide kullanmak üzere seçtiğiniz Azure bölgesine sahip bir LOCATION değişken İçerik Oluşturucu.

    LOCATION="<azure-region>"
    

    Not

    Örneğin, Batı ABD bölgesine dağıtmak istiyorsanız bu betiği kullanabilirsiniz.

    LOCATION="westus"
    

    Geçerli abonelik için desteklenen bölgelerin listesi için az account list-locations

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

    Daha fazla bilgi için bkz. Azure bölgeleri.

  3. adlı bir değişkeni RESOURCE_GROUP_NAME kaynak grubu adıyla İçerik Oluşturucu. Bu öğretici için öneririz msdocs-dab-*. Bu öğreticide bu değeri birden çok kez kullanırsınız.

    RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"    
    
  4. kullanarak az group createyeni bir kaynak grubu İçerik Oluşturucu.

    az group create \
      --name $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --tag "source=msdocs-dab-tutorial"
    
  5. Azure Container Apps örneğiniz için benzersiz olarak oluşturulan adlarla ve CONTAINER_ENV_NAME adlı API_CONTAINER_NAME değişkenleri İçerik Oluşturucu. Öğretici boyunca bu değişkenleri kullanırsınız.

    API_CONTAINER_NAME="api$SUFFIX"
    CONTAINER_ENV_NAME="env$SUFFIX"
    
  6. Yeni bir Azure Container Apps ortamı oluşturmak için kullanın az containerapp env create .

    az containerapp env create \ 
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_ENV_NAME \
      --logs-destination none \
      --location $LOCATION
    
  7. kullanarak yeni bir kapsayıcı uygulaması mcr.microsoft.com/azure-databases/data-api-builder İçerik Oluşturucu DAB kapsayıcı görüntüsü ve az containerapp create komutu. Bu kapsayıcı uygulaması başarıyla çalışır ancak herhangi bir veritabanına bağlı değildir.

    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. kullanarak az identity show yönetilen kimliğin asıl tanımlayıcısını alın ve değerini adlı MANAGED_IDENTITY_PRINCIPAL_IDbir değişkende depolayın.

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

    İpucu

    Bu komutun çıkışını istediğiniz zaman deleyebilirsiniz.

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

İzinler atama

Şimdi Azure SQL ve Azure Container Registry verileri okumak için sistem tarafından atanan yönetilen kimlik izinlerini atayın. Ayrıca, Azure Container Registry yazmak için kimlik izinlerinizi atayın.

  1. Kaynak grubunun tanımlayıcısını depolamak için adlı RESOURCE_GROUP_ID bir değişken İçerik Oluşturucu. kullanarak az group showtanımlayıcıyı alın. Bu öğreticide bu değişkeni birden çok kez kullanırsınız.

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

    İpucu

    Bu komutun çıkışını istediğiniz zaman deleyebilirsiniz.

    echo $RESOURCE_GROUP_ID
    
  2. Kapsayıcıları Azure Container Registry gönderebilmek için hesabınıza AcrPush rolünü atamak için kullanınaz role assignment create.

    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. kullanarak az role assignment create yönetilen kimliğinize AcrPull rolünü yeniden atayın. Bu atama, yönetilen kimliğin Azure Container Registry kapsayıcı görüntülerini çekmesine olanak tanır. Yönetilen kimlik sonunda bir Azure Container Apps örneğine atanır.

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

Veritabanını dağıtma

Ardından, Azure SQL hizmetinde yeni bir sunucu ve veritabanı dağıtın. Veritabanı AdventureWorksLT örnek veri kümesini kullanır.

  1. Azure SQL sunucu örneğiniz için benzersiz olarak oluşturulmuş bir ada sahip adlı SQL_SERVER_NAME bir değişken İçerik Oluşturucu. Bu değişkeni bu bölümün ilerleyen bölümlerinde kullanacaksınız.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. kullanarak az sql server createyeni bir Azure SQL sunucusu kaynağı İçerik Oluşturucu. Yönetilen kimliği bu sunucunun yöneticisi olarak yapılandırın.

    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. Azure hizmetlerinden erişime izin veren bir güvenlik duvarı kuralı oluşturmak için kullanın az sql server firewall-rule create .

    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. adlı Azure SQL sunucusunda adventureworksbir veritabanı oluşturmak için kullanınaz sql db create. Veritabanını örnek verileri kullanacak şekilde AdventureWorksLT yapılandırın.

    az sql db create \
      --resource-group $RESOURCE_GROUP_NAME \
      --server $SQL_SERVER_NAME \
      --name "adventureworks" \
      --sample-name "AdventureWorksLT"
    
  5. Azure SQL sunucu örneğinizdeki veritabanının bağlantı dizesi adventureworks ile adlı SQL_CONNECTION_STRING bir değişken İçerik Oluşturucu. kullanarak az sql server showsunucunun tam etki alanı adıyla bağlantı dizesi oluşturma. Bu değişkeni bu öğreticinin ilerleyen bölümlerinde kullanacaksınız.

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

    İpucu

    Bu komutun çıkışını istediğiniz zaman deleyebilirsiniz.

    echo $SQL_CONNECTION_STRING
    

Kapsayıcı görüntüsü oluşturma

Ardından Dockerfile kullanarak bir kapsayıcı görüntüsü oluşturun. Ardından bu kapsayıcı görüntüsünü yeni oluşturulan bir Azure Container Registry örneğine dağıtın.

  1. Azure Container Registry örneğiniz için benzersiz olarak oluşturulmuş bir ada sahip adlı CONTAINER_REGISTRY_NAME bir değişken İçerik Oluşturucu. Bu değişkeni bu bölümün ilerleyen bölümlerinde kullanacaksınız.

    CONTAINER_REGISTRY_NAME="reg$SUFFIX"
    
  2. kullanarak az acr createyeni bir Azure Container Registry örneği İçerik Oluşturucu.

    az acr create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $CONTAINER_REGISTRY_NAME \
      --sku "Standard" \
      --location $LOCATION \
      --admin-enabled false
    
  3. adlı Dockerfileçok aşamalı bir Dockerfile İçerik Oluşturucu. dosyasında bu adımları uygulayın.

    • Derleme aşamasının mcr.microsoft.com/dotnet/sdk temeli olarak kapsayıcı görüntüsünü kullanma

    • DAB CLI'yi yükleyin.

    • bağlantı dizesi olarak ortam değişkenini DATABASE_CONNECTION_STRING kullanarak SQL veritabanı bağlantısı (mssql) için bir yapılandırma dosyası İçerik Oluşturucu.

    • tabloyla eşlenen SalesLT.Product adlı Product bir varlığı İçerik Oluşturucu.

    • Yapılandırma dosyasını son mcr.microsoft.com/azure-databases/data-api-builder kapsayıcı görüntüsüne kopyalayın.

    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. Kullanarak az acr buildDockerfile dosyasını Azure Container Registry görevi olarak oluşturun.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. Kapsayıcı kayıt defterinin uç noktasını almak ve adlı CONTAINER_REGISTRY_LOGIN_SERVERbir değişkende depolamak için kullanınaz acr show.

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

    İpucu

    Bu komutun çıkışını istediğiniz zaman deleyebilirsiniz.

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Kapsayıcı görüntüsünü dağıtma

Son olarak Azure Container App'i yeni özel kapsayıcı görüntüsü ve kimlik bilgileriyle güncelleştirin. Veritabanı bağlantısını doğrulamak için çalışan uygulamayı test edin.

  1. kullanarak kapsayıcı uygulamasını kapsayıcı kayıt defterini az containerapp registry setkullanacak şekilde yapılandırın.

    az containerapp registry set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $API_CONTAINER_NAME \
      --server $CONTAINER_REGISTRY_LOGIN_SERVER \
      --identity "system"
    
  2. Azure SQL bağlantı dizesi adlı bir gizli dizi conn-string oluşturmak için kullanınaz containerapp secret set.

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

    Önemli

    Bu bağlantı dizesi herhangi bir kullanıcı adı veya parola içermez. bağlantı dizesi, Azure SQL veritabanına erişmek için yönetilen kimliği kullanır. Bu, bağlantı dizesi konakta gizli dizi olarak kullanılmasını güvenli hale getirir.

  3. kullanarak az containerapp updatekapsayıcı uygulamasını yeni özel kapsayıcı görüntünüzle güncelleştirin. Ortam değişkenini DATABASE_CONNECTION_STRING önceden oluşturulan conn-string gizli diziden okumak üzere ayarlayın.

    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. kullanarak az containerapp showçalışan kapsayıcı uygulamasındaki en son düzeltmenin tam etki alanı adını alın. Bu değeri adlı APPLICATION_URLbir değişkende depolayın.

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

    İpucu

    Bu komutun çıkışını istediğiniz zaman deleyebilirsiniz.

    echo $APPLICATION_URL
    
  5. URL'ye gidin ve REST API'yi test edin Product .

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

    Uyarı

    Dağıtım bir dakika kadar sürebilir. Başarılı bir yanıt görmüyorsanız bekleyin ve tarayıcınızı yenileyin.

Kaynakları temizleme

Örnek uygulamaya veya kaynaklara artık ihtiyacınız kalmadığında, ilgili dağıtımı ve tüm kaynakları kaldırın.

az group delete \
  --name $RESOURCE_GROUP_NAME

Sonraki adım