Bagikan melalui


Membuat dan menyebarkan aplikasi web Django ke Azure dengan identitas terkelola yang ditetapkan pengguna

Dalam tutorial ini, Anda menerapkan aplikasi web Django ke Azure App Service. Aplikasi web menggunakan identitas terkelola yang ditetapkan pengguna (koneksi tanpa kata sandi) dengan kontrol akses berbasis peran Azure untuk mengakses Azure Storage dan Azure Database for PostgreSQL - Server Fleksibel. Kode ini menggunakan kelas DefaultAzureCredential dari pustaka klien Azure Identity untuk Python. Kelas DefaultAzureCredential secara otomatis mendeteksi bahwa ada identitas terkelola untuk App Service dan menggunakannya untuk mengakses sumber daya Azure lainnya.

Dalam tutorial ini, Anda membuat identitas terkelola yang ditetapkan pengguna dan menetapkannya ke App Service sehingga dapat mengakses database dan sumber daya akun penyimpanan. Untuk contoh penggunaan identitas terkelola yang ditetapkan sistem, lihat Membuat dan menyebarkan aplikasi web Flask Python ke Azure dengan identitas terkelola tersebut. Identitas terkelola yang ditetapkan pengguna direkomendasikan karena dapat digunakan oleh beberapa sumber daya, dan siklus hidup mereka dipisahkan dari siklus hidup sumber daya yang terkait dengannya. Untuk informasi selengkapnya tentang praktik terbaik untuk menggunakan identitas terkelola, lihat Rekomendasi praktik terbaik identitas terkelola.

Tutorial ini menunjukkan kepada Anda cara menyebarkan aplikasi web Python dan membuat sumber daya Azure menggunakan Azure CLI. Meskipun perintah dalam tutorial ini menggunakan shell Bash, Anda dapat menjalankan perintah tutorial di lingkungan Bash apa pun dengan CLI yang diinstal, seperti lingkungan lokal Anda atau Azure Cloud Shell. Dengan beberapa modifikasi, Anda dapat menjalankan perintah ini di lingkungan lain seperti shell perintah Windows (misalnya memodifikasi sintaks untuk mengatur dan menggunakan variabel lingkungan).

Unduh aplikasi sampel

Gunakan contoh aplikasi sampel Django untuk mengikuti tutorial ini. Unduh atau klon aplikasi sampel ke lingkungan pengembangan Anda.

  1. Gandakan sampel.

    git clone https://github.com/Azure-Samples/msdocs-django-web-app-managed-identity.git
    
  2. Navigasikan ke folder aplikasi.

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

Memeriksa kode autentikasi

Contoh aplikasi web perlu mengautentikasi ke dua penyimpanan data yang berbeda:

  • Server penyimpanan blob Azure tempatnya menyimpan dan mengambil foto yang dikirimkan oleh peninjau.
  • Azure Database untuk PostgreSQL - Server Fleksibel yang menyimpan basis data restoran dan ulasan.

Ini menggunakan DefaultAzureCredential untuk mengautentikasi dengan kedua penyimpanan data. Dengan DefaultAzureCredential, aplikasi dapat dikonfigurasi untuk berjalan di bawah identitas perwakilan layanan yang berbeda, tergantung pada lingkungan tempat aplikasi tersebut berjalan, tanpa mengubah kode. Misalnya, di lingkungan pengembangan lokal, aplikasi dapat berjalan di bawah identitas pengembang yang masuk ke Azure CLI, sementara di Azure, seperti dalam tutorial ini, aplikasi dapat berjalan di bawah identitas terkelola yang ditetapkan pengguna.

Dalam kedua kasus, prinsip keamanan yang dijalankan aplikasi harus memiliki peran pada setiap sumber daya Azure yang digunakan aplikasi yang mengizinkannya melakukan tindakan pada sumber daya yang diperlukan aplikasi. Dalam tutorial ini, Anda menggunakan perintah Azure CLI untuk membuat identitas terkelola yang ditetapkan pengguna dan menetapkannya ke aplikasi Anda di Azure. Anda kemudian menetapkan peran yang sesuai identitas tersebut secara manual di akun penyimpanan Azure dan server Azure Database for PostgreSQL. Terakhir, Anda mengatur variabel lingkungan AZURE_CLIENT_ID untuk aplikasi Anda di Azure, sehingga DefaultAzureCredential dapat menggunakan identitas terkelola.

Setelah identitas terkelola yang ditetapkan pengguna dikonfigurasi pada aplikasi Anda dan lingkungan runtime-nya, serta diberi peran yang sesuai di penyimpanan data, Anda dapat menggunakan DefaultAzureCredential untuk mengautentikasi dengan sumber daya Azure yang diperlukan.

Kode berikut digunakan untuk membuat klien penyimpanan blob untuk mengunggah foto di ./restaurant_review/views.py. Instans DefaultAzureCredential diberikan kepada klien, yang digunakan untuk memperoleh token akses untuk melakukan operasi pada penyimpanan Azure.

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)

Instans DefaultAzureCredential juga digunakan untuk mendapatkan token akses untuk Azure Database for PostgreSQL di ./azureproject/get_conn.py. Dalam hal ini, token diperoleh langsung dengan memanggil get_token pada instans kredensial dan memberikan nilai scope yang sesuai. Token kemudian digunakan untuk mengatur kata sandi di URI koneksi PostgreSQL.

azure_credential = DefaultAzureCredential()
token = azure_credential.get_token("https://ossrdbms-aad.database.windows.net")
conf.settings.DATABASES['default']['PASSWORD'] = token.token

Untuk mempelajari selengkapnya tentang mengautentikasi aplikasi Anda dengan layanan Azure, lihat Authenticate Python apps to Azure services by using the Azure SDK for Python. Untuk mempelajari lebih lanjut tentang DefaultAzureCredential, termasuk cara menyesuaikan rantai kredensial yang dievaluasi untuk lingkungan Anda, lihat DefaultAzureCredential Gambaran Umum.

Membuat server fleksibel Azure PostgreSQL

  1. Siapkan variabel lingkungan yang diperlukan untuk tutorial.

    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"
    

    Penting

    ADMIN_PW harus berisi 8 hingga 128 karakter dari tiga kategori berikut: huruf besar bahasa Inggris, huruf kecil bahasa Inggris, angka, dan karakter non-alfanumerik. Saat membuat nama pengguna atau kata sandi jangan menggunakan karakter . Kemudian Anda membuat variabel lingkungan dengan nilai-nilai ini di mana karakter $ memiliki arti khusus dalam kontainer Linux yang digunakan untuk menjalankan aplikasi Python.

  2. Buat grup sumber daya dengan perintah az group create.

    az group create --location $LOCATION --name $RESOURCE_GROUP_NAME
    
  3. Buat server fleksibel PostgreSQL dengan perintah `az postgres flexible-server create`. (Perintah ini dan berikutnya menggunakan karakter garis lanjutan untuk Bash Shell ('\'). Ubah karakter kelanjutan baris perintah untuk shell lain.

    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
    

    Nama sku-name adalah nama tingkatan harga dan konfigurasi komputasi. Untuk informasi selengkapnya, lihat penentuan harga Azure Database untuk PostgreSQL. Untuk mencantumkan SKU yang tersedia, gunakan az postgres flexible-server list-skus --location $LOCATION.

  4. Tambahkan akun Azure Anda sebagai admin Microsoft Entra untuk server dengan perintah `az postgres flexible-server ad-admin create`.

    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. Atur aturan firewall di server Anda dengan perintah az postgres flexible-server firewall-rule create. Aturan ini memungkinkan akses lingkungan lokal Anda tersambung ke server. (Jika Anda menggunakan Azure Cloud Shell, Anda dapat melewati langkah ini.)

    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
    

    Gunakan alat atau situs web apa pun yang menunjukkan alamat IP Anda untuk menggantikan <your IP> di dalam perintah. Misalnya, Anda dapat menggunakan situs web Apa Alamat IP Saya?.

  6. Buat database bernama restaurant menggunakan perintah az postgres flexible-server execute.

    az postgres flexible-server execute \
      --name $DB_SERVER_NAME \
      --admin-user $ADMIN_USER \
      --admin-password $ADMIN_PW \
      --database-name postgres \
      --querytext 'create database restaurant;'
    

Membuat Azure App Service dan menyebarkan kode

Untuk membuat App Service dan menyebarkan kode, jalankan perintah ini di folder akar aplikasi sampel.

  1. Buat layanan aplikasi menggunakan perintah az webapp up.

    az webapp up \
      --resource-group $RESOURCE_GROUP_NAME \
      --location $LOCATION \
      --name $APP_SERVICE_NAME \
      --runtime PYTHON:3.9 \
      --sku B1
    

    Sku menentukan ukuran (CPU, memori) dan biaya paket App Service. Paket layanan B1 (Dasar) dikenakan biaya kecil dalam langganan Azure Anda. Untuk melihat daftar lengkap paket App Service, kunjungi halaman harga App Service.

  2. Konfigurasikan App Service untuk menggunakan start.sh di dalam repo contoh dengan perintah az webapp config set.

    az webapp config set \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $APP_SERVICE_NAME \
      --startup-file "start.sh"
    

Buat akun penyimpanan dan kontainer

Aplikasi sampel menyimpan foto yang dikirimkan oleh peninjau sebagai blob di Azure Storage.

  • Saat pengguna mengirimkan foto dengan ulasan mereka, aplikasi contoh menulis gambar ke kontainer menggunakan identitas terkelola dan DefaultAzureCredential untuk mengakses akun penyimpanan.

  • Saat pengguna melihat ulasan untuk restoran, aplikasi mengembalikan tautan ke foto dalam penyimpanan blob untuk setiap ulasan yang memiliki foto terkait. Agar browser menampilkan foto, browser harus dapat mengaksesnya di akun penyimpanan Anda. Data blob harus tersedia untuk dibaca secara publik melalui akses anonim (tidak diaturentikasi).

Di bagian ini, Anda membuat akun penyimpanan dan kontainer yang mengizinkan akses baca publik ke blob dalam kontainer. Di bagian selanjutnya, Anda membuat identitas terkelola yang ditetapkan pengguna dan mengonfigurasinya untuk menulis blob ke akun penyimpanan.

  1. Gunakan perintah az storage create untuk membuat akun penyimpanan.

    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. Buat kontainer bernama photos di akun penyimpanan dengan perintah az storage container create.

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

    Catatan

    Ada kemungkinan bahwa perintah gagal. Misalnya, Anda mungkin mendapatkan kesalahan yang menunjukkan bahwa aturan jaringan memblokir permintaan untuk membuat akun penyimpanan. Jika perintah gagal, masukkan perintah berikut untuk memastikan untuk menetapkan peran Azure dengan izin untuk membuat kontainer ke akun pengguna Azure Anda.

    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"
    

    Untuk informasi selengkapnya, lihat Mulai Cepat: Membuat, mengunduh, dan mencantumkan blob dengan Azure CLI. Beberapa peran Azure memungkinkan Anda membuat kontainer di akun penyimpanan, termasuk Pemilik, Kontributor, Pemilik Data Blob Penyimpanan, dan Kontributor Data Blob Penyimpanan.

Membuat identitas terkelola yang ditetapkan pengguna

Buat identitas terkelola yang ditetapkan pengguna dan tetapkan ke App Service. Identitas terkelola digunakan untuk mengakses database dan akun penyimpanan.

  1. Gunakan perintah az identity create untuk membuat identitas terkelola yang ditetapkan pengguna dan menghasilkan ID klien ke variabel untuk digunakan nanti.

    UA_CLIENT_ID=$(az identity create --name $UA_NAME --resource-group $RESOURCE_GROUP_NAME --query clientId --output tsv)
    echo $UA_CLIENT_ID
    
  2. Gunakan perintah az account show untuk mendapatkan ID langganan Anda dan menyimpannya ke dalam variabel yang dapat digunakan untuk menyusun ID sumber daya dari identitas terkelola.

    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. Tetapkan identitas terkelola ke App Service dengan perintah az webapp identity assign.

    export MSYS_NO_PATHCONV=1
    az webapp identity assign \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $APP_SERVICE_NAME \
        --identities $RESOURCE_ID
    
  4. Buat pengaturan aplikasi App Service yang berisi ID klien dari identitas terkelola dan informasi konfigurasi lainnya menggunakan perintah az webapp config appsettings set.

    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
    

Aplikasi sampel menggunakan variabel lingkungan (pengaturan aplikasi) untuk menentukan informasi koneksi untuk database dan akun penyimpanan tetapi variabel ini tidak menyertakan kata sandi. Sebaliknya, autentikasi dilakukan tanpa kata sandi dengan DefaultAzureCredential.

Kode aplikasi sampel menggunakan konstruktor kelas DefaultAzureCredential tanpa meneruskan ID klien identitas terkelola yang ditetapkan pengguna ke konstruktor. Dalam skenario ini, langkah cadangan adalah memeriksa variabel lingkungan AZURE_CLIENT_ID, yang Anda atur sebagai pengaturan aplikasi.

AZURE_CLIENT_ID Jika variabel lingkungan tidak ada, identitas terkelola yang ditetapkan sistem digunakan jika dikonfigurasi. Untuk informasi selengkapnya, lihat Memperkenalkan DefaultAzureCredential.

Membuat peran untuk identitas terkelola

Di bagian ini, Anda membuat penetapan peran untuk identitas terkelola untuk mengaktifkan akses ke akun penyimpanan dan database.

  1. Buat penetapan peran untuk identitas terkelola agar memungkinkan akses ke akun penyimpanan dengan perintah az role assignment create.

    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"
    

    Perintah menentukan cakupan penetapan peran ke grup sumber daya. Untuk informasi selengkapnya, lihat Memahami penetapan peran.

  2. Gunakan perintah az postgres flexible-server execute untuk menyambungkan ke database Postgres dan jalankan perintah yang sama untuk menetapkan peran ke identitas terkelola.

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

    Jika Anda mengalami masalah dalam menjalankan perintah, pastikan Anda menambahkan akun pengguna sebagai admin Microsoft Entra untuk server PosgreSQL dan Anda mengizinkan akses ke alamat IP Anda dalam aturan firewall. Untuk informasi selengkapnya, lihat bagian Membuat server fleksibel Azure PostgreSQL.

Menguji aplikasi web Python di Azure

Contoh aplikasi Python menggunakan paket azure.identity dan kelas DefaultAzureCredential. Saat aplikasi berjalan di Azure, DefaultAzureCredential secara otomatis mendeteksi apakah identitas terkelola ada untuk App Service dan, jika demikian, menggunakannya untuk mengakses sumber daya Azure lainnya (penyimpanan dan PostgreSQL dalam kasus ini). Tidak perlu menyediakan kunci penyimpanan, sertifikat, atau kredensial ke App Service untuk mengakses sumber daya ini.

  1. Telusuri aplikasi yang telah disebarkan di URL http://$APP_SERVICE_NAME.azurewebsites.net.

    Diperlukan waktu satu atau dua menit agar aplikasi dapat dimulai. Jika Anda melihat halaman aplikasi default yang bukan halaman aplikasi sampel default, tunggu sebentar dan refresh browser.

  2. Uji fungsionalitas aplikasi sampel dengan menambahkan restoran dan beberapa ulasan dengan foto untuk restoran.

    Informasi restoran dan ulasan disimpan di Azure Database for PostgreSQL dan foto disimpan di Azure Storage. Berikut adalah contoh cuplikan layar:

    Screenshot of the sample app showing restaurant review functionality using Azure App Service, Azure PostgreSQL Database, and Azure Storage.Cuplikan layar dari aplikasi contoh yang menunjukkan fitur ulasan restoran dengan menggunakan Azure App Service, Azure PostgreSQL Database, dan Azure Storage.

Penghapusan

Dalam tutorial ini, semua sumber daya Azure dibuat dalam grup sumber daya yang sama. Menghapus grup sumber daya dengan perintah az group delete akan menghapus semua sumber daya dalam grup tersebut dan merupakan cara tercepat untuk menghapus semua sumber daya Azure yang digunakan untuk aplikasi Anda.

az group delete  --name $RESOURCE_GROUP_NAME 

Anda dapat secara opsional menambahkan argumen --no-wait untuk mengizinkan perintah kembali sebelum operasi selesai.

Langkah berikutnya

  • Membuat dan menyebarkan aplikasi web Flask ke Azure dengan identitas terkelola yang ditetapkan oleh sistem

  • Menyebarkan aplikasi web Python (Django atau Flask) dengan PostgreSQL di Azure App Service