Aracılığıyla paylaş


Kullanıcı tarafından atanan yönetilen kimlikle Django web uygulaması oluşturma ve Azure'a dağıtma

Bu öğreticide, Azure Uygulaması Hizmeti'ne bir Django web uygulaması 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 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.

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 bkz . Sistem tarafından atanan yönetilen kimlikle Flask Python web uygulaması oluşturma ve Azure'a dağıtma. 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 kullanmayla ilgili en iyi yöntemler hakkında daha fazla bilgi için bkz . Yönetilen kimlik en iyi uygulama önerileri.

Bu öğreticide Python web uygulamasını dağıtma ve Azure CLI kullanarak Azure kaynakları oluşturma 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.

Örnek uygulamayı alma

Bu öğreticiyle birlikte izlemek için örnek Django örnek uygulamasını kullanın. Örnek uygulamayı indirme veya geliştirme ortamınıza kopyalama.

  1. Örneği kopyalayın.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. Uygulama klasörüne gidin.

    cd msdocs-django-web-app-managed-identity
    

Azure PostgreSQL esnek sunucusu oluşturma

  1. Öğ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

    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.

  2. az group create komutuyla bir kaynak grubu oluşturun.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. az postgres flexible-server create komutuyla postgreSQL esnek sunucusu 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 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 \
      --active-directory-auth Enabled \
      --public-access 0.0.0.0
    

    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.

  4. Az postgres flexible-server ad-admin create komutuyla Azure hesabınızı sunucu için Microsoft Entra yöneticisi olarak ekleyin.

    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 User
    
  5. az 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_ADDRESS
    

    komutunda ikame <your IP> etmek için IP adresinizi gösteren herhangi bir aracı veya web sitesini kullanın. Örneğin, IP Adresim Nedir? web sitesini kullanabilirsiniz.

  6. 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

Bir App Service oluşturmak ve kodu buna dağıtmak için örnek uygulamanın kök klasöründe bu komutları çalıştırın.

  1. 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 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.

  2. App Service'i az webapp config set komutuyla örnek 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"
    

Depolama hesabı ve kapsayıcı oluşturma

Örnek uygulama, gözden geçirenler tarafından azure Depolama blob olarak gönderilen fotoğrafları depolar.

  • Kullanıcı gözden geçirmesiyle birlikte bir fotoğraf gönderdiğinde, örnek uygulama yönetilen kimliği kullanarak ve DefaultAzureCredential 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.

  1. 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 true
    
  2. az storage container create komutuyla depolama hesabında photos adlı bir kapsayıcı oluşturun.

    az storage container create \
      --account-name $STORAGE_ACCOUNT_NAME \
      --name photos \
      --public-access blob \
      --auth-mode login
    

    Not

    Örneğin komut başarısız olursa, isteğin depolama hesabının ağ kuralları tarafından engellendiğini belirten bir hata alırsanız, Azure kullanıcı hesabınıza kapsayıcı oluşturma iznine sahip bir Azure rolü atandığından 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. Depolama hesabında "Sahip", "Katkıda Bulunan", "Depolama Blob Veri Sahibi" ve "Depolama Blob Verileri Katkıda Bulunanı" gibi kapsayıcılar oluşturmanıza izin veren birkaç Azure rolü olduğunu unutmayın.

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.

  1. Kullanıcı tarafından atanan yönetilen kimlik 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_ID
    
  2. Abonelik kimliğinizi almak ve yönetilen kimliğin kaynak kimliğini oluşturmak için kullanılabilecek bir değişkene çıkarmak için 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_ID
    
  3. az 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_ID
    
  4. az 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. Bunun yerine kimlik doğrulaması ile DefaultAzureCredentialparolasız yapılır.

Örnek uygulama kodu, kullanıcı tarafından atanan yönetilen kimlik istemci kimliğini oluşturucuya geçirmeden sınıf oluşturucuyu kullanır DefaultAzureCredential . 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ılmışsa sistem tarafından atanan yönetilen kimlik kullanılır. Daha fazla bilgi için bkz . DefaultAzureCredential Ile Tanışın.

Yönetilen kimlik için roller oluşturma

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.

  1. 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.

  2. 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);"
    

    Komutunu ç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 Bkz . Azure PostgreSQL esnek sunucusu oluşturma.

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.

  1. URL'sinde http://$APP_SERVICE_NAME.azurewebsites.netdağı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.

  2. 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'de depolanır. Aşağıda örnek bir ekran görüntüsü verilmişti:

    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ü.

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 .

Sonraki adımlar