Bagikan melalui


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

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

Anda dapat mengonfigurasi koneksi tanpa kata sandi ke layanan Azure menggunakan Konektor Layanan atau Anda dapat mengonfigurasinya secara manual. Tutorial ini menunjukkan cara menggunakan Konektor Layanan. Untuk informasi selengkapnya tentang koneksi tanpa kata sandi, lihat Koneksi tanpa kata sandi untuk layanan Azure. Untuk informasi tentang Konektor Layanan, lihat dokumentasi Konektor Layanan.

Tutorial ini menunjukkan cara membuat dan menyebarkan aplikasi web Python menggunakan Azure CLI. Jalankan perintah dalam tutorial ini di lingkungan Bash apa pun dengan Azure CLI yang diinstal, seperti lingkungan lokal Anda atau Azure Cloud Shell.

Untuk contoh penggunaan identitas terkelola yang ditetapkan pengguna, lihat Membuat dan menyebarkan aplikasi web Django ke Azure dengan identitas terkelola yang ditetapkan pengguna.

Mendapatkan aplikasi sampel

Sampel aplikasi Python menggunakan kerangka kerja Flask tersedia untuk membantu Anda mengikuti tutorial ini. Unduh atau kloning salah satu aplikasi sampel ke workstation lokal Anda.

  1. Kloning sampel dalam sesi Azure Cloud Shell.

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

    cd msdocs-flask-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.
  • Database Azure for PostgreSQL - Database Server Fleksibel tempat database menyimpan restoran dan ulasan.

Ini menggunakan DefaultAzureCredential untuk mengautentikasi ke kedua penyimpanan data. Dengan DefaultAzureCredential, aplikasi dapat dikonfigurasi untuk berjalan di bawah identitas perwakilan layanan yang berbeda, tergantung pada lingkungan tempatnya berjalan, tanpa membuat perubahan pada 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 sistemnya.

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 konektor layanan untuk mengaktifkan identitas terkelola yang ditetapkan sistem secara otomatis pada aplikasi Anda di Azure dan untuk menetapkan peran yang sesuai identitas tersebut di akun penyimpanan Azure dan server Azure Database for PostgreSQL.

Setelah identitas terkelola yang ditetapkan sistem diaktifkan dan diberi peran yang sesuai pada 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 app.py. Instans DefaultAzureCredential diberikan kepada klien, yang digunakannya untuk memperoleh token akses untuk melakukan operasi terhadap 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 meneruskannya nilai yang sesuai scope . Token kemudian digunakan di tempat kata sandi di URI koneksi PostgreSQL yang dikembalikan ke pemanggil.

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)

Untuk mempelajari selengkapnya tentang mengautentikasi aplikasi Anda dengan layanan Azure, lihat Mengautentikasi aplikasi Python ke layanan Azure dengan menggunakan Azure SDK untuk Python. Untuk mempelajari selengkapnya tentang DefaultAzureCredential, termasuk cara menyesuaikan rantai kredensial yang dievaluasi untuk lingkungan Anda, lihat Gambaran umum DefaultAzureCredential.

Membuat server 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"
    

    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-nufanumerik. 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 PostgreSQL dengan perintah az postgres flexible-server create . (Perintah ini dan berikutnya menggunakan karakter kelanjutan baris untuk Bash Shell ('\'). Ubah karakter kelanjutan baris untuk shell Anda jika diperlukan.)

    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
    

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

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

  1. Buat layanan aplikasi menggunakan perintah az webapp up .

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

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

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

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

Membuat konektor tanpa kata sandi ke sumber daya Azure

Perintah Konektor Layanan mengonfigurasi sumber daya Azure Storage dan Azure Database for PostgreSQL untuk menggunakan identitas terkelola dan kontrol akses berbasis peran Azure. Perintah membuat pengaturan aplikasi di App Service yang menghubungkan aplikasi web Anda ke sumber daya ini. Output dari perintah mencantumkan tindakan konektor layanan yang diambil untuk mengaktifkan kemampuan tanpa kata sandi.

  1. Tambahkan konektor layanan PostgreSQL dengan perintah az webapp connection create postgres-flexible . Identitas terkelola yang ditetapkan sistem digunakan untuk mengautentikasi aplikasi web ke sumber daya target, PostgreSQL dalam hal ini.

    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
    
  2. Tambahkan konektor layanan penyimpanan dengan perintah az webapp connection create storage-blob .

    Perintah ini juga menambahkan akun penyimpanan dan menambahkan aplikasi web dengan peran Kontributor Data Blob Penyimpanan ke akun penyimpanan.

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

Membuat kontainer di akun penyimpanan

Contoh aplikasi Python menyimpan foto yang dikirimkan oleh peninjau sebagai blob dalam kontainer di akun penyimpanan Anda.

  • Saat pengguna mengirimkan foto dengan ulasan mereka, aplikasi sampel menulis gambar ke kontainer menggunakan identitas terkelola yang ditetapkan sistem untuk autentikasi dan otorisasi. Anda mengonfigurasi fungsionalitas ini di bagian terakhir.

  • Saat pengguna melihat ulasan untuk restoran, aplikasi mengembalikan tautan ke foto dalam penyimpanan blob untuk setiap ulasan yang memiliki satu yang terkait dengannya. 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).

Untuk meningkatkan keamanan, akun penyimpanan dibuat dengan akses anonim ke data blob yang dinonaktifkan secara default. Di bagian ini, Anda mengaktifkan akses baca anonim di akun penyimpanan Anda lalu membuat kontainer bernama foto yang menyediakan akses publik (anonim) ke blob-nya.

  1. Perbarui akun penyimpanan untuk memungkinkan akses baca anonim ke blob dengan perintah az storage account update .

    az storage account update \
      --name $STORAGE_ACCOUNT_NAME \
      --resource-group $RESOURCE_GROUP_NAME \
      --allow-blob-public-access true
    

    Mengaktifkan akses anonim pada akun penyimpanan tidak memengaruhi akses untuk blob individual. Anda harus secara eksplisit mengaktifkan akses publik ke blob di tingkat kontainer.

  2. Buat kontainer yang disebut foto di akun penyimpanan dengan perintah az storage container create. Izinkan akses baca anonim (publik) ke blob di kontainer yang baru dibuat.

    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) 
    

    Catatan

    Untuk brevity, perintah ini menggunakan kunci akun penyimpanan untuk mengotorisasi dengan akun penyimpanan. Untuk sebagian besar skenario, pendekatan yang direkomendasikan Microsoft adalah menggunakan peran ID Microsoft Entra dan kontrol akses berbasis peran Azure (Azure RBAC). Untuk sekumpulan instruksi cepat, 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.

Untuk mempelajari selengkapnya tentang akses baca anonim ke data blob, lihat Mengonfigurasi akses baca anonim untuk kontainer dan blob.

Menguji aplikasi web Python di Azure

Contoh aplikasi Python menggunakan paket azure.identity dan kelasnya 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 hal ini). Tidak perlu menyediakan kunci penyimpanan, sertifikat, atau kredensial ke App Service untuk mengakses sumber daya ini.

  1. Telusuri ke aplikasi yang 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 aplikasi sampel memperlihatkan fungsionalitas ulasan restoran 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 akan dihapus dengan perintah az group delete akan menghapus semua sumber daya dalam grup sumber daya 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 --no-wait argumen untuk mengizinkan perintah kembali sebelum operasi selesai.

Langkah berikutnya