Sistem tarafından atanan yönetilen kimlikle Flask Python web uygulaması oluşturma ve Azure'a dağıtma
Bu öğreticide, Azure Uygulaması Hizmetinde çalışan bir web uygulaması oluşturmak ve dağıtmak için Python Flask kodunu 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 denetimiyle sistem tarafından atanan yönetilen kimliğini (parolasız bağlantılar) kullanır. Kod, Python için Azure Identity istemci kitaplığının DefaultAzureCredential sınıfını kullanır. sınıfı, DefaultAzureCredential
App Service için yönetilen bir kimliğin mevcut olduğunu 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 bkz . Azure hizmetleri için parolasız bağlantılar. Hizmet Bağlayıcısı hakkında bilgi için Hizmet Bağlayıcısı belgelerine bakın.
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:
- 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ı.
Her iki veri deposunda da kimlik doğrulaması yapmak için DefaultAzureCredential kullanır. ile DefaultAzureCredential
uygulama, 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 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, içinde fotoğraf app.py
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.py
PostgreSQL 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ç, 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 . Python için Azure SDK'sını kullanarak Azure hizmetlerinde Python uygulamalarının kimliğini doğrulama. ortamınız için değerlendirdiğini kimlik bilgisi zincirini özelleştirme de dahil olmak üzere hakkında DefaultAzureCredential
daha fazla bilgi edinmek için bkz . DefaultAzureCredential'a genel bakış.
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
aşağıdaki
ADMIN_PW
üç kategoriden 8 ila 128 karakter içermelidir: İngilizce büyük harfler, İngilizce küçük harfler, sayılar ve büyük harf 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 komutuyla 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 bkz. fiyatlandırma PostgreSQL için Azure Veritabanı. Kullanılabilir SKU'ları listelemek için kullanın
az postgres flexible-server list-skus --location $LOCATION
.az postgres flexible-server execute komutunu kullanarak adlı
restaurant
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
Sku, 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 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. Komutlardan elde edilirken, parolasız özelliği etkinleştirmek için gerçekleştirilir hizmet bağlayıcısı eylemleri listelenir.
az webapp connection create postgres-flexible komutuyla 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 Verileri 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 bloblara anonim okuma erişimine izin vermek için depolama hesabını güncelleştirin.
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.
az storage container create komutuyla 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
Bu komut, kısa bir süre için depolama hesabı anahtarını kullanarak depolama hesabıyla yetkilendirmeyi kullanır. Çoğu senaryoda, Microsoft'un önerilen yaklaşımı Microsoft Entra Id ve Azure (RBAC) rollerini kullanmaktır. Hızlı yönergeler için bkz . Hızlı Başlangıç: Azure CLI ile blob oluşturma, indirme ve listeleme. "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 sınıfını DefaultAzureCredential
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.
URL'sinde
http://$APP_SERVICE_NAME.azurewebsites.net
dağıtılan uygulamaya 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öndürülmesi için bağımsız değişkenini ekleyebilirsiniz --no-wait
.