Aracılığıyla paylaş


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

Veri API'si 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ü derleyip Azure Container Registry'de depolarsınız. Ardından kapsayıcı görüntüsü, bir destekleyici Azure SQL veritabanı ile Azure Container Apps’e dağıtılır. Eğitimin tamamı her bileşeni yönetilen kimlikleri kullanarak kimlik doğrulaması yapacak şekilde tasarlanmıştır.

Bu eğitimde, siz:

  • Rol tabanlı erişim denetimi izinleriyle yönetilen kimlik oluşturma
  • Örnek AdventureWorksLT veri kümesiyle Azure SQL'i dağıtma
  • Azure Container Registry'de kapsayıcı görüntüsünü hazırlama
  • Azure Container App'i Veri API oluşturucu kapsayıcı görüntüsüyle dağıtma

Eğer bir 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 kod veya komut bloğunda Deneyin'i seçin. Deneyin seçildiğinde kod veya komut otomatik olarak Cloud Shell'e kopyalanmaz.
      • adresine https://shell.azure.comgidin veya Cloud Shell'i Başlat'ı seçin.
      • Azure portalının () menü çubuğunda https://portal.azure.com seçin

Kapsayıcı uygulama oluştur

İ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'ye 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 oluşturun.

    let SUFFIX=$RANDOM*$RANDOM
    
  2. LOCATION Bu öğreticide kullanmayı seçtiğiniz Azure bölgesiyle bir değişken oluşturun.

    LOCATION="<azure-region>"
    

    Uyarı

    Ö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. Kaynak grubu adıyla adlı RESOURCE_GROUP_NAME bir değişken oluşturun. Bu kılavuz 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 oluşturun.

    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şturulmuş adlarla API_CONTAINER_NAME ve CONTAINER_ENV_NAME isimli değişkenler oluşturun. Öğ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. DAB kapsayıcı görüntüsünü ve mcr.microsoft.com/azure-databases/data-api-builder komutunu kullanarak az containerapp create yeni bir kapsayıcı uygulaması oluşturun. Bu kapsayıcı uygulaması başarıyla çalışıyor, ancak herhangi bir veritabanına bağlı değil.

    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 yönetilen kimliğin az identity show 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" \
    )
    

    Tavsiye

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

    echo $MANAGED_IDENTITY_PRINCIPAL_ID
    

İzin atama

Şimdi, Azure SQL ve Azure Container Registry'den verileri okumak için sistem tarafından atanan yönetilen kimlik izinlerini atayın. Ayrıca, Azure Container Registry'ye 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 oluşturun. kullanarak az group show tanı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" \
    )
    

    Tavsiye

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

    echo $RESOURCE_GROUP_ID
    
  2. Azure Container Registry'ye kapsayıcı gönderebilmeniz için az role assignment create rolünü hesabınıza atamak için kullanın.

    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. 'yi tekrar kullanarak rolünü yönetilen kimliğinize atayın. Bu atama, yönetilen kimliğin Azure Container Registry'den kapsayıcı görüntüleri çekmesine izin verir. 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 server örneğiniz için benzersiz olarak oluşturulmuş bir adla adlı SQL_SERVER_NAME bir değişken oluşturun. Bu değişkeni bu bölümün ilerleyen bölümlerinde kullanacaksınız.

    SQL_SERVER_NAME="srvr$SUFFIX"
    
  2. kullanarak yeni bir Azure SQL az sql server create kaynağı oluşturun. 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. Azure SQL sunucusunda az sql db create adlı bir veritabanı oluşturmak için adventureworks kullanın. 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 SQL_CONNECTION_STRING bağlantı dizesiyle adlı adventureworks bir değişken oluşturun. Bağlantı dizesini, sunucunun tam etki alanı adı ile az sql server show kullanarak oluşturun. Bu değişkeni bu öğreticide daha sonra 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;"
    

    Tavsiye

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

    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 adla adlı CONTAINER_REGISTRY_NAME bir değişken oluşturun. 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 oluşturun.

    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 oluşturun. dosyasında bu adımları uygulayın.

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

    • DAB CLI'yi yükleyin.

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

    • Product tablosuna eşlenen SalesLT.Product adlı bir varlık oluşturun.

    • 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: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. Kullanarak az acr build Dockerfile'i Azure Container Registry görevi olarak oluştur.

    az acr build \
      --registry $CONTAINER_REGISTRY_NAME \
      --image adventureworkslt-dab:latest \
      --image adventureworkslt-dab:{{.Run.ID}} \
      --file Dockerfile \
      .
    
  5. az acr show kullanarak kapsayıcı kayıt defterinin uç noktasını alın ve bunu CONTAINER_REGISTRY_LOGIN_SERVER adlı bir değişkende saklayın.

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

    Tavsiye

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

    echo $CONTAINER_REGISTRY_LOGIN_SERVER
    

Kapsayıcı imajını dağıt

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. Kapsayıcı uygulamasını az containerapp registry set kullanarak kapsayıcı kayıt defterini kullanacak ş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ı dizesiyle az containerapp secret set adlı bir gizli oluşturmak için conn-string kullanın.

    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ı dizesini sunucuda gizli bilgi olarak kullanılmasını güvenli kılar.

  3. kullanarak az containerapp updatekapsayıcı uygulamasını yeni özel kapsayıcı görüntünüzle güncelleştirin. Önceden oluşturulan DATABASE_CONNECTION_STRING gizli bilgiden okumak için conn-string ortam değişkenini 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. Çalışan kapsayıcı uygulamasındaki en son revizyonun tam etki alanı adını az containerapp show kullanarak 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" \
    )
    

    Tavsiye

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

    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ı temizle

Ö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