Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, bir Django web uygulamasını Azure Uygulama Hizmeti'ne dağıtacaksınız. Web uygulaması, Azure Depolama ve PostgreSQL için Azure Veritabanı - Esnek Sunucu kaynaklarına erişmek için Azure rol tabanlı erişim denetimine sahip kullanıcı tarafından atanan yönetilen kimliği (parolasız bağlantılar) kullanır. Kod, Python için Azure Identity istemci kütüphanesinin DefaultAzureCredential sınıfını kullanır.
DefaultAzureCredential sınıfı, App Service için yönetilen bir kimlik olduğunu otomatik olarak algılar ve bu kimliği diğer Azure kaynaklarına erişim sağlamak için kullanır.
Bu öğreticide, kullanıcı tarafından atanan bir yönetilen kimlik oluşturacak ve veritabanı ve depolama hesabı kaynaklarına erişebilmesi için App Service'e atayacaksınız. Sistem tarafından atanan yönetilen kimlik kullanma örneği için Sistem tarafından atanan yönetilen kimlikle bir Flask Python web uygulaması oluşturun ve Azure'a dağıtın bölümüne bakın. Kullanıcı tarafından atanan yönetilen kimlikler, birden çok kaynak tarafından kullanılabildiklerinden ve yaşam döngüleri ilişkilendirildikleri kaynak yaşam döngülerinden ayrıştırıldığından önerilir. Yönetilen kimlikleri kullanmaya yönelik en iyi yöntemler hakkında daha fazla bilgi için bkz. Yönetilen kimlik en iyi uygulama önerileri.
Bu öğretici, Azure CLI'yi kullanarak Python web uygulamasını nasıl dağıtabileceğinizi ve Azure kaynaklarını nasıl oluşturabileceğinizi gösterir. Bu öğreticideki komutlar Bash kabuğunu kullansa da, yerel ortamınız veya Azure Cloud Shell gibi CLI yüklü herhangi bir Bash ortamında öğretici komutlarını çalıştırabilirsiniz. Bazı değişikliklerle bu komutları Windows komut kabuğu gibi diğer ortamlarda çalıştırabilirsiniz (örneğin, ortam değişkenlerini ayarlamak ve kullanmak için söz dizimini değiştirme).
Örnek uygulamayı alma
Bu eğitimi takip etmek için örnek Django uygulamasını kullanın. Örnek uygulamayı indirme veya geliştirme ortamınıza kopyalama.
Örneği kopyalayın.
git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.gitUygulama klasörüne gidin.
cd msdocs-django-web-app-managed-identity
Kimlik doğrulama kodunu inceleme
Örnek web uygulamasının iki farklı veri deposunda kimlik doğrulaması yapması gerekir:
- Gözden geçirenler tarafından gönderilen fotoğrafları depoladığı ve aldığı Azure blob depolama sunucusu.
- PostgreSQL için Azure Veritabanı - Restoran ve incelemeleri depoladığı Esnek Sunucu veritabanı.
DefaultAzureCredential kullanarak her iki veri deposunda kimlik doğrulaması yapar. ile DefaultAzureCredentialuygulama, kodda değişiklik yapmadan, içinde çalıştığı ortama bağlı olarak farklı hizmet sorumlularının kimliği altında çalışacak şekilde yapılandırılabilir. Örneğin, yerel geliştirme ortamında uygulama Azure CLI'da oturum açan geliştiricinin kimliği altında, Azure'da ise bu öğreticide olduğu gibi kullanıcı tarafından atanan yönetilen kimlik altında çalıştırılabilir.
Her iki durumda da, uygulamanın altında çalıştığı güvenlik sorumlusunun, uygulamanın gerektirdiği kaynak üzerinde eylemleri gerçekleştirmesine izin veren her Azure kaynağında bir rolü olmalıdır. Bu öğreticide Azure CLI komutlarını kullanarak kullanıcı tarafından atanan bir yönetilen kimlik oluşturacak ve bunu Azure'daki uygulamanıza atayacaksınız. Ardından bu kimliğe uygun rolleri Azure depolama hesabınızda ve PostgreSQL için Azure Veritabanı sunucunuzda el ile atarsınız. Son olarak, uygulamanın yönetilen kimliği kullanması için AZURE_CLIENT_ID ortam değişkenini Azure'da DefaultAzureCredential olarak yapılandırırsınız.
Kullanıcı tarafından atanan yönetilen kimlik uygulamanızda ve çalışma zamanı ortamında yapılandırıldıktan ve veri depolarında uygun rollere atandıktan sonra, gerekli Azure kaynaklarıyla doğrulama yapmak için DefaultAzureCredential kullanabilirsiniz.
Aşağıdaki kod, ./restaurant_review/views.py içinde fotoğraf yüklemek üzere bir blob depolama istemcisi oluşturmak için kullanılır. örneği DefaultAzureCredential , Azure depolamaya karşı işlemler gerçekleştirmek üzere erişim belirteçleri almak için kullandığı istemciye sağlanır.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
azure_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=account_url,
credential=azure_credential)
örneğiDefaultAzureCredential, içindeki ./azureproject/get_conn.pyPostgreSQL için Azure Veritabanı için erişim belirteci almak için de kullanılır. Bu durumda, belirteç doğrudan kimlik bilgisi örneğinde get_token çağrılarak ve uygun scope değer geçirilerek alınır. Ardından belirteç, PostgreSQL bağlantı URI'sinde parolayı ayarlamak için kullanılır.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conf.settings.DATABASES['default']['PASSWORD'] = token.token
Azure hizmetleri için Python uygulamalarınızın kimliğini doğrulama hakkında daha fazla bilgi edinmek için Python için Azure SDK'sını kullanarak Azure hizmetlerine Python uygulamalarını kimlik doğrulayın bölümüne bakın. Daha fazla bilgi edinmek ve ortamınız için değerlendirdiği kimlik bilgisi zincirini nasıl özelleştireceğinizi öğrenmek için, DefaultAzureCredential bölümüne bakın.
Azure PostgreSQL esnek sunucusu oluşturma
Öğretici için gereken ortam değişkenlerini ayarlayın.
LOCATION="eastus" RAND_ID=$RANDOM RESOURCE_GROUP_NAME="msdocs-mi-web-app" APP_SERVICE_NAME="msdocs-mi-web-$RAND_ID" DB_SERVER_NAME="msdocs-mi-postgres-$RAND_ID" ADMIN_USER="demoadmin" ADMIN_PW="ChAnG33#ThsPssWD$RAND_ID" UA_NAME="UAManagedIdentityPythonTest$RAND_ID"Önemli
ADMIN_PWüç kategoriden 8 ila 128 karakter içermelidir: İngilizce büyük harf, İngilizce küçük harf, sayılar ve alfanümerik olmayan karakterler. Kullanıcı adları veya parolalar oluşturulurken karakteri kullanmayın$. Daha sonra, karakterin özel bir anlamı olduğu Linux kapsayıcısında, Python uygulamalarını çalıştırmak için$kullanarak bu değerleri kullanarak çevre değişkenleri oluşturursunuz.az group create komutuyla bir kaynak grubu oluşturun.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAMEaz postgres flexible-server create komutuyla PostgreSQL esnek bir sunucu oluşturun. (Bu ve sonraki komutlar Bash Kabuğu ('\') için satır devamlılığı karakterini kullanır. Diğer kabuklar için satır devamı karakterini değiştirin.
az postgres flexible-server create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --location $LOCATION \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --sku-name Standard_D2ds_v4 \ --active-directory-auth Enabled \ --public-access 0.0.0.0Sku-name, fiyatlandırma katmanının ve işlem yapılandırmasının adıdır. Daha fazla bilgi için Azure Veritabanı PostgreSQL için fiyatlandırması bölümüne bakın. Kullanılabilir SKU'ları listelemek için
az postgres flexible-server list-skus --location $LOCATIONkullanın.Azure hesabınızı sunucu için Microsoft Entra yöneticisi olarak eklemek için az postgres flexible-server ad-admin create komutunu kullanın.
ACCOUNT_EMAIL=$(az ad signed-in-user show --query userPrincipalName --output tsv) ACCOUNT_ID=$(az ad signed-in-user show --query id --output tsv) echo $ACCOUNT_EMAIL, $ACCOUNT_ID az postgres flexible-server ad-admin create \ --resource-group $RESOURCE_GROUP_NAME \ --server-name $DB_SERVER_NAME \ --display-name $ACCOUNT_EMAIL \ --object-id $ACCOUNT_ID \ --type Useraz postgres flexible-server firewall-rule create komutuyla sunucunuzda bir güvenlik duvarı kuralı yapılandırın. Bu kural, yerel ortamınızın sunucuya bağlanmasına izin verir. (Azure Cloud Shell kullanıyorsanız bu adımı atlayabilirsiniz.)
IP_ADDRESS=<your IP> az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --rule-name AllowMyIP \ --start-ip-address $IP_ADDRESS \ --end-ip-address $IP_ADDRESSIP adresinizi gösteren herhangi bir aracı veya web sitesini kullanarak komut içerisine
<your IP>ifadesi yerine IP adresinizi geçirin. Örneğin, IP Adresim Nedir? web sitesini kullanabilirsiniz.restaurantkomutunu kullanarak adlı bir veritabanı oluşturun.az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ADMIN_USER \ --admin-password $ADMIN_PW \ --database-name postgres \ --querytext 'create database restaurant;'
Azure Uygulaması Hizmeti oluşturma ve kodu dağıtma
App Service oluşturmak ve kodu dağıtmak için bu komutları örnek uygulamanın kök klasöründe çalıştırın.
az webapp up komutunu kullanarak bir uygulama hizmeti oluşturun.
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1Sku, App Service planının boyutunu (CPU, bellek) ve maliyetini tanımlar. B1 (Temel) hizmet planı, Azure aboneliğinizde küçük bir maliyete neden olur. App Service planlarının tam bir listesi için App Service fiyatlandırma sayfasını görüntüleyin.
az webapp config set komutuyla örnek depodaki start.sh dosyasını kullanacak şekilde App Service'i yapılandırın.
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Depolama hesabı ve kapsayıcı oluşturma
Örnek uygulama, değerlendirenler tarafından gönderilen fotoğrafları Azure Depolama üzerinde blob olarak depolar.
Kullanıcı incelemesiyle birlikte bir fotoğraf gönderdiğinde, örnek uygulama yönetilen kimlik ve
DefaultAzureCredentialkullanarak depolama hesabına erişmek için görüntüyü kapsayıcıya yazar.Bir kullanıcı bir restoranın incelemelerini görüntülediğinde uygulama, kendisiyle ilişkilendirilmiş olan her inceleme için blob depolamadaki fotoğrafın bağlantısını döndürür. Tarayıcının fotoğrafı görüntüleyebilmesi için fotoğrafa depolama hesabınızdan erişebilmesi gerekir. Blob verilerinin anonim (kimliği doğrulanmamış) erişim aracılığıyla genel olarak okunabilmesi gerekir.
Bu bölümde, kapsayıcıdaki bloblara genel okuma erişimine izin veren bir depolama hesabı ve kapsayıcı oluşturursunuz. Sonraki bölümlerde kullanıcı tarafından atanan bir yönetilen kimlik oluşturacak ve depolama hesabına blob yazacak şekilde yapılandıracaksınız.
Bir depolama hesabı oluşturmak için `az storage create` komutunu kullanın.
STORAGE_ACCOUNT_NAME="msdocsstorage$RAND_ID" az storage account create \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --location $LOCATION \ --sku Standard_LRS \ --allow-blob-public-access trueDepolama hesabında "photos" adlı bir kapsayıcı oluşturmak için az storage container create komutunu kullanın.
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --auth-mode loginNot
Komutun başarısız olması mümkündür. Örneğin, ağ kurallarının depolama hesabı oluşturma isteğini engellediğini belirten bir hata alabilirsiniz. Komut başarısız olursa, Azure kullanıcı hesabınıza kapsayıcı oluşturma iznine sahip bir Azure rolü atadığınızdan emin olmak için aşağıdaki komutu girin.
az role assignment create --role "Storage Blob Data Contributor" --assignee $ACCOUNT_EMAIL --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"Daha fazla bilgi için bkz. Hızlı Başlangıç: Azure CLI ile blob oluşturma, indirme ve listeleme. Bir depolama hesabında kapsayıcılar oluşturmanıza olanak tanıyan çeşitli Azure rolleri, Sahip, Katkıda Bulunan, Depolama Blobu Veri Sahibi ve Depolama Blobu Veri Katkıda Bulunanı gibi rolleri içerir.
Kullanıcı tarafından atanan yönetilen kimlik oluşturma
Kullanıcı tarafından atanan bir yönetilen kimlik oluşturun ve bunu App Service'e atayın. Yönetilen kimlik, veritabanına ve depolama hesabına erişmek için kullanılır.
Kullanıcı tarafından atanan yönetilen kimliği oluşturmak ve istemci kimliğini daha sonra kullanmak üzere bir değişkene çıkarmak için az identity create komutunu kullanın.
UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv) echo $UA_CLIENT_IDtr-TR: Abonelik kimliğinizi almak ve yönetilen kimliğin kaynak kimliğini oluşturmak için kullanılabilecek bir değişkene atamak üzere `az account show` komutunu kullanın.
SUBSCRIPTION_ID=$(az account show --query id --output tsv) RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ManagedIdentity/userAssignedIdentities/$UA_NAME" echo $RESOURCE_IDaz webapp identity assign komutuyla yönetilen kimliği App Service'e atayın.
export MSYS_NO_PATHCONV=1 az webapp identity assign \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --identities $RESOURCE_IDaz webapp config appsettings set komutuyla yönetilen kimliğin istemci kimliğini ve diğer yapılandırma bilgilerini içeren App Service uygulama ayarları oluşturun.
az webapp config appsettings set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --settings AZURE_CLIENT_ID=$UA_CLIENT_ID \ STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME \ STORAGE_CONTAINER_NAME=photos \ DBHOST=$DB_SERVER_NAME \ DBNAME=restaurant \ DBUSER=$UA_NAME
Örnek uygulama, veritabanı ve depolama hesabı için bağlantı bilgilerini tanımlamak için ortam değişkenlerini (uygulama ayarları) kullanır ancak bu değişkenler parola içermez. Buna karşılık, kimlik doğrulaması DefaultAzureCredential ile parolasız gerçekleştirilmektedir.
Örnek uygulama kodu, kullanıcı tarafından atanan yönetilen kimlik istemci kimliğini oluşturucuya geçirmeden DefaultAzureCredential sınıf oluşturucuyu kullanır. Bu senaryoda geri dönüş, uygulama ayarı olarak ayarladığınız AZURE_CLIENT_ID ortam değişkenini denetlemektir.
AZURE_CLIENT_ID Ortam değişkeni yoksa, yapılandırılırsa sistem tarafından atanan yönetilen kimlik kullanılır. Daha fazla bilgi için DefaultAzureCredential Hakkında'ya bakınız.
Yönetilen kimlik için roller oluşturun
Bu bölümde, depolama hesabına ve veritabanına erişimi etkinleştirmek için yönetilen kimlik için rol atamaları oluşturacaksınız.
az role assignment create komutuyla depolama hesabına erişimi etkinleştirmek için yönetilen kimlik için bir rol ataması oluşturun .
export MSYS_NO_PATHCONV=1 az role assignment create \ --assignee $UA_CLIENT_ID \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCE_GROUP_NAME"komutu, kaynak grubuna rol atamasının kapsamını belirtir. Daha fazla bilgi için bkz. Rol atamalarını anlama.
Postgres veritabanına bağlanmak için az postgres flexible-server execute komutunu kullanın ve yönetilen kimliğe rol atamak için aynı komutları çalıştırın.
ACCOUNT_EMAIL_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken) az postgres flexible-server execute \ --name $DB_SERVER_NAME \ --admin-user $ACCOUNT_EMAIL \ --admin-password $ACCOUNT_EMAIL_TOKEN \ --database-name postgres \ --querytext "select * from pgaadauth_create_principal('"$UA_NAME"', false, false);select * from pgaadauth_list_principals(false);"Komutu çalıştırırken sorun yaşıyorsanız, kullanıcı hesabınızı PosgreSQL sunucusu için Microsoft Entra yöneticisi olarak eklediğinizden ve güvenlik duvarı kurallarında IP adresinize erişim izni eklediğinizden emin olun. Daha fazla bilgi için "Azure PostgreSQL esnek sunucu oluşturma" başlığına bakın.
Azure'da Python web uygulamasını test edin
Örnek Python uygulaması azure.identity paketini ve onun DefaultAzureCredential sınıfını kullanır. Uygulama Azure'da çalışırken, DefaultAzureCredential App Service için yönetilen bir kimliğin mevcut olup olmadığını otomatik olarak algılar ve varsa diğer Azure kaynaklarına (bu durumda depolama ve PostgreSQL) erişmek için bu kimliği kullanır. Bu kaynaklara erişmek için App Service'e depolama anahtarları, sertifikalar veya kimlik bilgileri sağlamanız gerekmez.
Dağıtılan uygulamaya
http://$APP_SERVICE_NAME.azurewebsites.netURL'sinde göz atın.Uygulamanın başlatılması bir veya iki dakika sürebilir. Varsayılan örnek uygulama sayfası olmayan bir varsayılan uygulama sayfası görürseniz, bir dakika bekleyin ve tarayıcıyı yenileyin.
Restoran ekleyerek örnek uygulamanın işlevselliğini test edin ve restoran için fotoğraflarla bazı incelemeler yapın.
Restoran ve inceleme bilgileri PostgreSQL için Azure Veritabanı ve fotoğraflar Azure Depolama'da depolanır. Aşağıda örnek bir ekran görüntüsü verilmişti:
Temizleme
Bu öğreticide, tüm Azure kaynakları aynı kaynak grubunda oluşturulmuştur. Az group delete komutuyla kaynak grubunun silinmesi, kaynak grubundaki tüm kaynakları siler ve uygulamanız için kullanılan tüm Azure kaynaklarını kaldırmanın en hızlı yoludur.
az group delete --name $RESOURCE_GROUP_NAME
İsteğe bağlı olarak, işlem tamamlanmadan önce komutun dönmesi için --no-wait argümanını ekleyebilirsiniz.
Sonraki adımlar
Flask web uygulaması oluşturun ve sistem tarafından atanan yönetilen kimlikle Azure'a dağıtın.
Azure Uygulaması Hizmetinde PostgreSQL ile Python (Django veya Flask) web uygulaması dağıtma
Azure Uygulaması Hizmeti, Azure Postgre SQL Veritabanı ve Azure Depolama kullanarak restoran inceleme işlevselliğini gösteren örnek uygulamanın ekran görüntüsü.