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, Python Flask kodunu kullanarak Azure Uygulama Hizmetinde çalışan bir web uygulaması oluşturacak ve dağıtacaksınız. Web uygulaması, parolasız bağlantılar için Azure rol tabanlı erişim denetimiyle sistem tarafından atanan yönetilen kimliğini kullanarak Azure Depolama ve PostgreSQL için Azure Veritabanı - Esnek Sunucu kaynaklarına erişir. Kod, Python için Azure Identity istemci kitaplığının DefaultAzureCredential sınıfını kullanır. Bu DefaultAzureCredential
sınıfı, App Service için yönetilen bir kimliğin varlığını otomatik olarak algılar ve bunu diğer Azure kaynaklarına erişmek için kullanır.
Hizmet Bağlayıcısı'nı kullanarak Azure hizmetlerine parolasız bağlantılar yapılandırabilir veya bunları el ile yapılandırabilirsiniz. Bu öğreticide Service Connector'ın nasıl kullanılacağı gösterilmektedir. Parolasız bağlantılar hakkında daha fazla bilgi için Azure hizmetleri için parolasız bağlantılar bölümüne bakın. Hizmet Bağlayıcısı hakkında bilgi için Hizmet Bağlayıcısı belgelerine başvurabilirsiniz.
Bu öğreticide, Azure CLI kullanarak Python web uygulaması oluşturma ve dağıtma adımları gösterilmektedir. Bu öğreticideki komutlar bash kabuğunda çalıştırılacak şekilde yazılmıştır. Öğretici komutlarını YEREL ortamınız veya Azure Cloud Shell gibi CLI yüklü herhangi bir Bash ortamında çalıştırabilirsiniz. Bazı değişikliklerle (örneğin, ortam değişkenlerini ayarlama ve kullanma) bu komutları Windows komut kabuğu gibi diğer ortamlarda çalıştırabilirsiniz. Kullanıcı tarafından atanan yönetilen kimlik kullanma örnekleri için bkz Kullanıcı tarafından atanan yönetilen kimlikle Django web uygulaması oluşturma ve Azure'a dağıtma.
Örnek uygulamayı alma
Flask çerçevesini kullanan örnek bir Python uygulaması, bu öğreticiyi izlemenize yardımcı olabilir. Örnek uygulamalardan birini yerel iş istasyonunuza indirin veya kopyalayın.
Örneği bir Azure Cloud Shell oturumunda kopyalayın.
git clone https://github.com/Azure-Samples/msdocs-flask-web-app-managed-identity.git
Uygulama klasörüne gidin.
cd msdocs-flask-web-app-managed-identity
Kimlik doğrulama kodunu inceleme
Örnek web uygulamasının iki farklı veri deposunda kimlik doğrulaması yapması gerekir:
- Yorumcular tarafından gönderilen fotoğrafların depolanıp alındığı Azure blob depolama sunucusu.
- PostgreSQL için Azure Veritabanı - Restoran ve incelemeleri depoladığı Esnek Sunucu veritabanı.
Her iki veri deposuyla kimlik doğrulaması yapmak için DefaultAzureCredential kullanır. İçindeki ortama bağlı olarak uygulama, kodda değişiklik yapmadan, farklı hizmet ilkelerinin kimliği altında çalışacak şekilde DefaultAzureCredential
ile 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 sistem tarafından atanan yönetilen kimliği 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'daki uygulamanızda sistem tarafından atanan yönetilen kimliği otomatik olarak etkinleştirmek ve bu kimliği Azure depolama hesabınıza ve PostgreSQL için Azure Veritabanı sunucunuza uygun rolleri atamak için hizmet bağlayıcılarını kullanacaksınız.
Sistem tarafından atanan yönetilen kimlik etkinleştirildikten ve veri depolarında uygun rollere atandıktan sonra, gerekli Azure kaynaklarıyla kimlik doğrulaması yapmak için kullanabilirsiniz DefaultAzureCredential
.
Aşağıdaki kod, app.py
içinde fotoğraf yüklemek üzere bir blob depolama istemcisi oluşturmak için kullanılır. Örneği DefaultAzureCredential
, istemcinin Azure depolamaya karşı işlemler gerçekleştirmek üzere erişim belirteçleri almak için kullandığı şekilde 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)
Azure Veritabanı için PostgreSQL'de erişim belirteci almak için DefaultAzureCredential
örneği kullanılır. Bu durumda belirteç, kimlik bilgisi örneğinde get_token fonksiyonu doğrudan çağrılarak ve uygun scope
değerinin geçirilmesiyle alınmış olur. Ardından belirteç, arayana döndürülen PostgreSQL bağlantı URI'sindeki parolanın yerine kullanılır.
azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conn = str(current_app.config.get('DATABASE_URI')).replace('PASSWORDORTOKEN', token.token)
Azure hizmetleriyle uygulamalarınızın kimliğini doğrulama hakkında daha fazla bilgi edinmek için bkz Azure için Python SDK'sını kullanarak Python uygulamalarınızı Azure hizmetleri ile kimlik doğrulama.
DefaultAzureCredential
hakkında daha fazla bilgi edinmek, ortamınız için değerlendirdiği kimlik bilgisi zincirini özelleştirme yöntemlerini öğrenmek için DefaultAzureCredential Genel Bakış sayfasına bakın.
Azure PostgreSQL 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"
Önemli
ADMIN_PW
aşağıdaki kategorilerden üçünün karakterlerini içeren 8 ila 128 karakter içermelidir: İngilizce büyük harfler, İngilizce küçük harfler, sayılar ve alfanümerik olmayan karakterler. Kullanıcı adları veya parolalar oluşturulurken karakteri kullanmayın$
. Daha sonra, karakterin Python uygulamalarını çalıştırmak için kullanılan Linux kapsayıcısı$
içinde özel bir anlamı olduğu bu değerlerle ortam değişkenleri oluşturursunuz.az group create komutuyla bir kaynak grubu oluşturun.
az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
az postgres flexible-server create komutunu kullanarak bir PostgreSQL sunucusu oluşturun. (Bu ve sonraki komutlar Bash Kabuğu ('\') için satır devamlılığı karakterini kullanır. Gerekirse kabuğunuz için satır devamlılığı 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
Sku-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 fiyatlandırması'na bakın. Kullanılabilir SKU'ları listelemek için
az postgres flexible-server list-skus --location $LOCATION
kullanın.az postgres flexible-server execute komutunu kullanarak
restaurant
adında 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
az webapp up komutunu kullanarak bir uygulama hizmeti oluşturun.
az webapp up \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --runtime PYTHON:3.9 \ --sku B1
Uygulama hizmet planının boyutunu (CPU, bellek) ve maliyetini SKU tanımlar. B1 (Temel) hizmet planı, Azure aboneliğinizde küçük bir maliyete neden olur. App Service planlarının tam listesi için App Service fiyatlandırma sayfasını görüntüleyin.
App Service'i az webapp config set komutuyla depodaki start.sh kullanacak şekilde yapılandırın.
az webapp config set \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --startup-file "start.sh"
Azure kaynaklarına parolasız bağlayıcılar oluşturma
Hizmet Bağlayıcısı komutları Azure Depolama'yı ve PostgreSQL için Azure Veritabanı kaynaklarını yönetilen kimliği ve Azure rol tabanlı erişim denetimini kullanacak şekilde yapılandırmaktadır. Komutlar App Service'te web uygulamanızı bu kaynaklara bağlayan uygulama ayarlarını oluşturur. Komutların çıktısı, parolasız özelliği etkinleştirmek için gerçekleştirilen hizmet bağlayıcısı eylemlerini listeler.
az webapp connection create postgres-flexible komutunu kullanarak bir PostgreSQL hizmet bağlayıcısı ekleyin. Sistem tarafından atanan yönetilen kimlik, bu durumda hedef kaynak olan PostgreSQL'de web uygulamasının kimliğini doğrulamak için kullanılır.
az webapp connection create postgres-flexible \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --target-resource-group $RESOURCE_GROUP_NAME \ --server $DB_SERVER_NAME \ --database restaurant \ --client-type python \ --system-identity
az webapp connection create storage-blob komutuyla bir depolama hizmeti bağlayıcısı ekleyin.
Bu komut ayrıca bir depolama hesabı ekler ve depolama hesabına 'Depolama Blob Verisi Katkıda Bulunan' rolüne sahip web uygulamasını ekler.
STORAGE_ACCOUNT_URL=$(az webapp connection create storage-blob \ --new true \ --resource-group $RESOURCE_GROUP_NAME \ --name $APP_SERVICE_NAME \ --target-resource-group $RESOURCE_GROUP_NAME \ --client-type python \ --system-identity \ --query configurations[].value \ --output tsv) STORAGE_ACCOUNT_NAME=$(cut -d . -f1 <<< $(cut -d / -f3 <<< $STORAGE_ACCOUNT_URL))
Depolama hesabında kapsayıcı oluşturma
Örnek Python uygulaması, gözden geçirenler tarafından blob olarak gönderilen fotoğrafları depolama hesabınızdaki bir kapsayıcıda depolar.
Kullanıcı gözden geçirmesiyle birlikte bir fotoğraf gönderdiğinde örnek uygulama, kimlik doğrulaması ve yetkilendirme için sistem tarafından atanan yönetilen kimliğini kullanarak görüntüyü kapsayıcıya yazar. Bu işlevi son bölümde yapılandırmıştınız.
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.
Güvenliği artırmak için depolama hesapları blob verilerine anonim erişim varsayılan olarak devre dışı bırakılarak oluşturulur. Bu bölümde, depolama hesabınızda anonim okuma erişimini etkinleştirecek ve ardından bloblarına genel (anonim) erişim sağlayan photos adlı bir kapsayıcı oluşturacaksınız.
Az storage account update komutuyla blob'lar üzerinde anonim okuma erişimine izin vermek için depolama hesabını güncelleyin.
az storage account update \ --name $STORAGE_ACCOUNT_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --allow-blob-public-access true
Depolama hesabında anonim erişimin etkinleştirilmesi, tek tek blobların erişimini etkilemez. Kapsayıcı düzeyinde bloblara genel erişimi açıkça etkinleştirmeniz gerekir.
tr-TR: az storage container create komutunu kullanarak depolama hesabında photos adlı bir kapsayıcı oluşturun. Yeni oluşturulan kapsayıcıdaki bloblara anonim okuma (genel) erişimine izin verin.
az storage container create \ --account-name $STORAGE_ACCOUNT_NAME \ --name photos \ --public-access blob \ --account-key $(az storage account keys list --account-name $STORAGE_ACCOUNT_NAME \ --query [0].value --output tsv)
Not
Komutun mümkün olduğunca basit olması için bu komut, depolama hesabı anahtarını kullanarak depolama hesabıyla yetkilendirme yapar. Çoğu senaryoda, Microsoft'un önerilen yaklaşımı Microsoft Entra Id ve Azure (RBAC) rollerini kullanmaktır. Hızlı yönergeler için, Hızlı Başlangıç: Azure CLI ile blob oluşturma, indirme ve listeleme başlıklı makaleyi inceleyin. "Sahip", "Katkıda Bulunan", "Depolama Blobu Veri Sahibi" ve "Depolama Blobu Verileri Katkıda Bulunanı" dahil olmak üzere bir depolama hesabında kapsayıcılar oluşturmanıza izin veren birkaç Azure rolü olduğunu unutmayın.
Blob verilerine anonim okuma erişimi hakkında daha fazla bilgi edinmek için bkz: Kapsayıcılar ve bloblar için anonim okuma erişimini yapılandırma.
Azure'da Python web uygulamasını test edin
Örnek Python uygulaması azure.identity paketini ve 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.net
` URL'sinden 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 kaldırılması, kaynak grubundaki tüm kaynakları kaldırır 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önmesini sağlamak için --no-wait
bağımsız değişkenini ekleyebilirsiniz.
Sonraki adımlar
Kullanıcı tanımlı yönetilen kimlikle bir Django web uygulaması oluşturun ve Azure'a dağıtın.
Azure Uygulama Hizmetinde PostgreSQL kullanarak Django veya Flask ile bir Python web uygulaması yayınlama