Öğ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)
- 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:
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.
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
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.
adlı bir değişkeni
RESOURCE_GROUP_NAME
kaynak grubu adıyla İçerik Oluşturucu. Bu öğretici için öneririzmsdocs-dab-*
. Bu öğreticide bu değeri birden çok kez kullanırsınız.RESOURCE_GROUP_NAME="msdocs-dab$SUFFIX"
kullanarak
az group create
yeni bir kaynak grubu İçerik Oluşturucu.az group create \ --name $RESOURCE_GROUP_NAME \ --location $LOCATION \ --tag "source=msdocs-dab-tutorial"
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"
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
kullanarak yeni bir kapsayıcı uygulaması
mcr.microsoft.com/azure-databases/data-api-builder
İçerik Oluşturucu DAB kapsayıcı görüntüsü veaz 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
kullanarak
az identity show
yönetilen kimliğin asıl tanımlayıcısını alın ve değerini adlıMANAGED_IDENTITY_PRINCIPAL_ID
bir 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.
Kaynak grubunun tanımlayıcısını depolamak için adlı
RESOURCE_GROUP_ID
bir değişken İçerik Oluşturucu. kullanarakaz 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" \ )
İpucu
Bu komutun çıkışını istediğiniz zaman deleyebilirsiniz.
echo $RESOURCE_GROUP_ID
Kapsayıcıları Azure Container Registry gönderebilmek için hesabınıza AcrPush rolünü atamak için kullanın
az 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
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.
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"
kullanarak
az sql server create
yeni 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
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"
adlı Azure SQL sunucusunda
adventureworks
bir veritabanı oluşturmak için kullanınaz sql db create
. Veritabanını örnek verileri kullanacak şekildeAdventureWorksLT
yapılandırın.az sql db create \ --resource-group $RESOURCE_GROUP_NAME \ --server $SQL_SERVER_NAME \ --name "adventureworks" \ --sample-name "AdventureWorksLT"
Azure SQL sunucu örneğinizdeki veritabanının bağlantı dizesi
adventureworks
ile adlıSQL_CONNECTION_STRING
bir değişken İçerik Oluşturucu. kullanarakaz sql server show
sunucunun 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.
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"
kullanarak
az acr create
yeni 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
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ü kullanmaDAB 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
Kullanarak
az acr build
Dockerfile 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 \ .
Kapsayıcı kayıt defterinin uç noktasını almak ve adlı
CONTAINER_REGISTRY_LOGIN_SERVER
bir 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.
kullanarak kapsayıcı uygulamasını kapsayıcı kayıt defterini
az containerapp registry set
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"
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.
kullanarak
az containerapp update
kapsayıcı uygulamasını yeni özel kapsayıcı görüntünüzle güncelleştirin. Ortam değişkeniniDATABASE_CONNECTION_STRING
önceden oluşturulanconn-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
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_URL
bir 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
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