Bagikan melalui


Menyebarkan aplikasi Python dalam kontainer ke App Service

Di bagian seri tutorial ini, Anda mempelajari cara menyebarkan aplikasi web Python dalam kontainer ke Azure App Service Web App for Containers. Layanan yang dikelola sepenuhnya ini memungkinkan Anda menjalankan aplikasi kontainer tanpa harus mempertahankan orkestrator kontainer Anda sendiri.

App Service menyederhanakan penyebaran melalui alur integrasi berkelanjutan/penyebaran berkelanjutan (CI/CD) yang berfungsi dengan Docker Hub, Azure Container Registry, Azure Key Vault, dan alat DevOps lainnya. Tutorial ini adalah bagian 4 dari seri tutorial 5 bagian.

Di akhir artikel ini, Anda memiliki aplikasi web App Service yang aman dan siap produksi yang berjalan dari gambar kontainer Docker. Aplikasi ini menggunakan identitas terkelola yang ditetapkan sistem untuk menarik gambar dari Azure Container Registry dan mengambil rahasia dari Azure Key Vault.

Diagram layanan ini menyoroti komponen yang tercakup dalam artikel ini.

Cuplikan layar layanan yang digunakan dalam Tutorial - Aplikasi Python Dalam Kontainer di Azure dengan jalur penyebaran disorot.

Perintah Azure CLI dapat dijalankan di Azure Cloud Shell atau di komputer lokal dengan Azure CLI terinstal.

Penting

Sebaiknya gunakan Azure Cloud Shell untuk semua langkah berbasis CLI dalam tutorial ini karena:

  • Telah diautentikasi sebelumnya dengan akun Azure Anda, menghindari masalah login
  • Menyertakan semua ekstensi Azure CLI yang diperlukan di luar kotak
  • Memastikan perilaku yang konsisten terlepas dari OS atau lingkungan lokal Anda
  • Tidak memerlukan penginstalan lokal, ideal untuk pengguna tanpa hak admin
  • Menyediakan akses langsung ke layanan Azure dari portal—tidak diperlukan Docker lokal atau penyiapan jaringan
  • Menghindari masalah firewall lokal atau konfigurasi jaringan

Membuat Key Vault dengan Otorisasi RBAC

Azure Key Vault adalah layanan aman untuk menyimpan rahasia, kunci API, string koneksi, dan sertifikat. Dalam skrip ini, string koneksi MongoDB dan aplikasi web tersebut disimpan.

Key Vault dikonfigurasi untuk menggunakan kontrol akses berbasis peran (RBAC) untuk mengelola akses melalui peran Azure alih-alih kebijakan akses tradisional. Aplikasi web menggunakan identitas terkelola yang ditetapkan sistem untuk mengambil rahasia dengan aman saat runtime.

Nota

Membuat Key Vault lebih awal memastikan bahwa peran dapat ditetapkan sebelum ada upaya untuk mengakses data rahasia. Ini juga membantu menghindari penundaan penyebaran dalam penetapan peran. Karena Key Vault tidak bergantung pada App Service, penyediaannya lebih awal meningkatkan keandalan dan urutan.

  1. Dalam langkah ini, Anda menggunakan perintah az keyvault create untuk membuat Azure Key Vault dengan RBAC diaktifkan.

    #!/bin/bash
    RESOURCE_GROUP_NAME="msdocs-web-app-rg"
    LOCATION="westus"
    KEYVAULT_NAME="${RESOURCE_GROUP_NAME}-kv"
    
    az keyvault create \
      --name "$KEYVAULT_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --location "$LOCATION" \
      --enable-rbac-authorization true
    

Membuat paket layanan aplikasi dan aplikasi web

Paket App Service menentukan sumber daya komputasi, tingkat harga, dan wilayah untuk aplikasi web Anda. Aplikasi web menjalankan aplikasi kontainer Anda dan disediakan dengan identitas terkelola yang ditetapkan sistem yang digunakan untuk mengautentikasi dengan aman ke Azure Container Registry (ACR) dan Azure Key Vault.

Dalam langkah ini, Anda melakukan tugas-tugas berikut:

  • Membuat Rencana Layanan Aplikasi
  • Membuat aplikasi web dengan identitas terkelolanya
  • Mengonfigurasi aplikasi web untuk disebarkan menggunakan gambar kontainer tertentu
  • Bersiap untuk penyebaran berkelanjutan melalui ACR

Nota

Aplikasi web harus dibuat sebelum menetapkan akses ke ACR atau Key Vault karena identitas terkelola hanya dibuat pada waktu penyebaran. Selain itu, menetapkan gambar kontainer selama pembuatan memastikan aplikasi dimulai dengan benar dengan konfigurasi yang dimaksudkan.

  1. Dalam langkah ini, Anda menggunakan perintah az appservice plan create untuk menyediakan lingkungan komputasi untuk aplikasi Anda.

    #!/bin/bash
    APP_SERVICE_PLAN_NAME="msdocs-web-app-plan"
    
    az appservice plan create \
        --name "$APP_SERVICE_PLAN_NAME" \
        --resource-group "$RESOURCE_GROUP_NAME" \
        --sku B1 \
        --is-linux
    
  2. Dalam langkah ini, Anda menggunakan perintah az webapp create untuk membuat aplikasi web. Perintah ini juga mengaktifkan identitas terkelola yang ditetapkan sistem dan mengatur citra kontainer yang dijalankan aplikasi.

    #!/bin/bash
    APP_SERVICE_NAME="msdocs-website-name" #APP_SERVICE_NAME must be globally unique as it becomes the website name in the URL `https://<website-name>.azurewebsites.net`.
    # Use the same registry name as in part 2 of this tutorial series.
    REGISTRY_NAME="msdocscontainerregistryname" #REGISTRY_NAME is the registry name you used in part 2 of this tutorial.
    CONTAINER_NAME="$REGISTRY_NAME.azurecr.io/msdocspythoncontainerwebapp:latest" #CONTAINER_NAME is of the form "yourregistryname.azurecr.io/repo_name:tag".
    
    az webapp create \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --plan "$APP_SERVICE_PLAN_NAME" \
      --name "$APP_SERVICE_NAME" \
      --assign-identity '[system]' \
      --deployment-container-image-name "$CONTAINER_NAME" 
    

    Nota

    Saat menjalankan perintah ini, Anda mungkin melihat kesalahan berikut:

    No credential was provided to access Azure Container Registry. Trying to look up...
    Retrieving credentials failed with an exception:'Failed to retrieve container registry credentials. Please either provide the credentials or run 'az acr update -n msdocscontainerregistryname --admin-enabled true' to enable admin first.'
    

    Kesalahan ini terjadi karena aplikasi web mencoba menggunakan kredensial admin untuk mengakses ACR, kredensial mana yang dinonaktifkan secara default. Aman untuk mengabaikan pesan ini: langkah berikutnya mengonfigurasi aplikasi web untuk menggunakan identitas terkelolanya untuk mengautentikasi dengan ACR.

Memberikan Peran Petugas Rahasia untuk pengguna yang masuk

Untuk menyimpan rahasia di Azure Key Vault, pengguna yang menjalankan skrip harus memiliki peran Petugas Rahasia Key Vault . Peran ini memungkinkan pembuatan dan pengelolaan rahasia dalam vault.

Dalam langkah ini, skrip menetapkan peran tersebut ke pengguna yang saat ini masuk. Pengguna ini kemudian dapat menyimpan rahasia aplikasi dengan aman, seperti string koneksi MongoDB dan aplikasi SECRET_KEY.

Penetapan peran ini adalah yang pertama dari dua penetapan peran terkait Key Vault. Kemudian, identitas terkelola yang ditetapkan sistem aplikasi web diberikan akses untuk mengambil rahasia dari brankas.

Menggunakan Azure RBAC memastikan akses yang aman dan dapat diaudit berdasarkan identitas, menghilangkan kebutuhan akan kredensial yang dikodekan secara permanen.

Nota

Pengguna harus diberi peran Petugas Rahasia Key Vaultsebelum mencoba menyimpan rahasia apa pun di brankas kunci. Penugasan ini dilakukan menggunakan perintah az role assignment create yang terlingkup ke Key Vault.

  1. Dalam langkah ini, Anda menggunakan perintah az role assignment create untuk menetapkan peran di cakupan Key Vault.

    #!/bin/bash
    CALLER_ID=$(az ad signed-in-user show --query id -o tsv)
    echo $CALLER_ID # Verify this value retrieved successfully. In production, poll to verify this value is retrieved successfully.
    
    az role assignment create \
      --role "Key Vault Secrets Officer" \
      --assignee "$CALLER_ID" \
      --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
    
    

Memberikan akses web ke ACR menggunakan identitas terkelola

Untuk menarik gambar dari Azure Container Registry (ACR) dengan aman, aplikasi web harus dikonfigurasi untuk menggunakan identitas terkelola yang ditetapkan sistemnya. Menggunakan identitas terkelola menghindari kebutuhan kredensial admin dan mendukung penyebaran yang aman dan bebas kredensial.

Proses ini melibatkan dua tindakan utama:

  • Mengaktifkan aplikasi web untuk menggunakan identitas terkelolanya saat mengakses ACR
  • Menetapkan peran AcrPull ke identitas tersebut pada ACR target
  1. Dalam langkah ini, Anda mengambil ID utama (ID objek unik) dari identitas terkelola aplikasi web menggunakan perintah az webapp identity show . Selanjutnya, Anda mengaktifkan penggunaan identitas terkelola untuk autentikasi ACR dengan mengatur properti menjadi acrUseManagedIdentityCreds menggunakan true. Anda kemudian menetapkan peran AcrPull ke identitas terkelola aplikasi web menggunakan perintah az role assignment create . Peran ini memberikan izin aplikasi web untuk menarik gambar dari registri.

    #!/bin/bash
    PRINCIPAL_ID=$(az webapp identity show \
      --name "$APP_SERVICE_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --query principalId \
      -o tsv)
    echo $PRINCIPAL_ID # Verify this value retrieved successfully. In production, poll for successful 'AcrPull' role assignment using `az role assignment list`.    
    
    az webapp config set \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --name "$APP_SERVICE_NAME" \
      --generic-configurations '{"acrUseManagedIdentityCreds": true}'
    
    az role assignment create \
    --role "AcrPull" \
    --assignee "$PRINCIPAL_ID" \
    --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.ContainerRegistry/registries/$REGISTRY_NAME"
    
    

Memberikan akses ke key vault untuk identitas terkelola dari aplikasi web tersebut

Aplikasi web memerlukan izin untuk mengakses rahasia seperti string koneksi MongoDB dan SECRET_KEY. Untuk memberikan izin ini, Anda harus menetapkan peran Pengguna Rahasia Key Vault ke identitas terkelola yang ditetapkan sistem aplikasi web.

  1. Dalam langkah ini, Anda menggunakan pengidentifikasi unik (ID utama) dari identitas terkelola yang ditetapkan sistem aplikasi web untuk memberikan akses aplikasi web ke Key Vault dengan peran Pengguna Rahasia Key Vault menggunakan perintah az role assignment create .

    #!/bin/bash
    
    az role assignment create \
    --role "Key Vault Secrets User" \
    --assignee "$PRINCIPAL_ID" \
    --scope "/subscriptions/$(az account show --query id -o tsv)/resourceGroups/$RESOURCE_GROUP_NAME/providers/Microsoft.KeyVault/vaults/$KEYVAULT_NAME"
    

Menyimpan Rahasia di Key Vault

Untuk menghindari rahasia hardcoding di aplikasi Anda, langkah ini menyimpan string koneksi MongoDB dan kunci rahasia aplikasi web di Azure Key Vault. Rahasia ini kemudian dapat diakses dengan aman oleh aplikasi web saat runtime melalui identitas terkelolanya, tanpa perlu menyimpan kredensial dalam kode atau konfigurasi.

Nota

Meskipun tutorial ini hanya menyimpan string koneksi dan kunci rahasia di brankas kunci, Anda dapat secara opsional menyimpan pengaturan aplikasi lain seperti nama database MongoDB atau nama koleksi di Key Vault juga.

  1. Dalam langkah ini, Anda menggunakan perintah az cosmosdb keys list untuk mengambil string koneksi MongoDB. Anda kemudian menggunakan perintah az keyvault secret set untuk menyimpan string koneksi dan kunci rahasia yang dihasilkan secara acak di Key Vault.

    #!/bin/bash
    ACCOUNT_NAME="msdocs-cosmos-db-account-name"
    
    MONGO_CONNECTION_STRING=$(az cosmosdb keys list \
      --name "$ACCOUNT_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --type connection-strings \
      --query "connectionStrings[?description=='Primary MongoDB Connection String'].connectionString" -o tsv)
    
    SECRET_KEY=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9')
    # This key is cryptographically secure, using OpenSSL’s strong random number generator.
    
    az keyvault secret set \
      --vault-name "$KEYVAULT_NAME" \
      --name "MongoConnectionString" \
      --value "$MONGO_CONNECTION_STRING"
    
    az keyvault secret set \
      --vault-name "$KEYVAULT_NAME" \
      --name "MongoSecretKey" \
      --value "$SECRET_KEY"
    

Mengonfigurasi aplikasi web untuk menggunakan rahasia Kay Vault

Untuk mengakses rahasia dengan aman saat runtime, aplikasi web harus dikonfigurasi untuk mereferensikan rahasia yang disimpan di Azure Key Vault. Langkah ini dilakukan menggunakan referensi Key Vault, yang menyuntikkan nilai rahasia ke lingkungan aplikasi melalui identitas terkelola yang ditetapkan sistemnya.

Pendekatan ini menghindari rahasia hardcoding dan memungkinkan aplikasi untuk mengambil nilai sensitif dengan aman seperti string koneksi MongoDB dan kunci rahasia selama eksekusi.

  1. Dalam langkah ini, Anda menggunakan perintah az webapp config appsettings set untuk menambahkan pengaturan aplikasi yang mereferensikan rahasia Key Vault. Secara khusus, pengaturan aplikasi MongoConnectionString dan MongoSecretKey diatur untuk mereferensikan rahasia terkait yang disimpan di Key Vault.

    #!/bin/bash
    MONGODB_NAME="restaurants_reviews"
    MONGODB_COLLECTION_NAME="restaurants_reviews"
    
    az webapp config appsettings set \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --name "$APP_SERVICE_NAME" \
      --settings \
          CONNECTION_STRING="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoConnectionString)" \
          SECRET_KEY="@Microsoft.KeyVault(SecretUri=https://$KEYVAULT_NAME.vault.azure.net/secrets/MongoSecretKey)" \
          DB_NAME="$MONGODB_NAME" \
          COLLECTION_NAME="$MONGODB_COLLECTION_NAME"
    

Aktifkan penyebaran berkelanjutan dari ACR

Mengaktifkan penyebaran berkelanjutan memungkinkan aplikasi web untuk secara otomatis menarik dan menjalankan gambar kontainer terbaru setiap kali didorong ke Azure Container Registry (ACR). Ini mengurangi langkah-langkah penyebaran manual dan membantu memastikan aplikasi Anda tetap terbarui.

Nota

Pada langkah berikutnya, Anda akan mendaftarkan webhook di ACR untuk memberi tahu aplikasi web ketika gambar baru diunggah.

  1. Dalam langkah ini, Anda menggunakan perintah az webapp deployment container config untuk mengaktifkan penyebaran berkelanjutan dari ACR ke aplikasi web.

    #!/bin/bash
    az webapp deployment container config \
      --name "$APP_SERVICE_NAME" \
      --resource-group "$RESOURCE_GROUP_NAME" \
      --enable-cd true
    

Mendaftarkan Webhook ACR untuk penyebaran berkelanjutan

Untuk mengotomatiskan penyebaran, daftarkan webhook di Azure Container Registry (ACR) yang memberi tahu aplikasi web setiap kali gambar kontainer baru didorong. Webhook memungkinkan aplikasi untuk secara otomatis menarik dan menjalankan versi terbaru.

Webhook yang dikonfigurasi di Azure Container Registry (ACR) mengirim permintaan POST ke titik akhir SCM (SERVICE_URI) aplikasi web setiap kali gambar baru didorong ke repositori msdocspythoncontainerwebapp. Tindakan ini memicu aplikasi web untuk menarik dan menyebarkan gambar yang diperbarui, menyelesaikan alur penyebaran berkelanjutan antara ACR dan Azure App Service.

Nota

URI webhook harus mengikuti format ini:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook

Ini harus diakhir dengan /api/registry/webhook. Jika Anda menerima kesalahan URI, konfirmasikan bahwa jalur sudah benar.

  1. Dalam langkah ini, gunakan perintah az acr webhook create untuk mendaftarkan webhook dan mengonfigurasinya untuk memicu peristiwa push .

    #!/bin/bash
    CREDENTIAL=$(az webapp deployment list-publishing-credentials \
        --resource-group "$RESOURCE_GROUP_NAME" \
        --name "$APP_SERVICE_NAME" \
        --query publishingPassword --output tsv)
    # Web app publishing credentials may not be available immediately. In production, poll until non-empty.   
    
    SERVICE_URI="https://$APP_SERVICE_NAME:$CREDENTIAL@$APP_SERVICE_NAME.scm.azurewebsites.net/api/registry/webhook"
    
    az acr webhook create \
      --name webhookforwebapp \
      --registry "$REGISTRY_NAME" \
      --scope msdocspythoncontainerwebapp:* \
      --uri "$SERVICE_URI" \
      --actions push
    
    

Jelajahi situs

Untuk memverifikasi bahwa aplikasi web sedang berjalan, buka https://<website-name>.azurewebsites.net, ganti <website-name> dengan nama App Service Anda. Sebaiknya Anda melihat aplikasi sampel ulasan restoran. Mungkin perlu beberapa saat untuk memuat pertama kalinya.

Setelah situs muncul, coba tambahkan restoran dan kirimkan ulasan untuk mengonfirmasi bahwa aplikasi berfungsi dengan benar.

Nota

Perintah az webapp browse tidak didukung di Cloud Shell. Jika Anda menggunakan Cloud Shell, buka browser secara manual dan navigasikan ke URL situs.

Jika Anda menggunakan Azure CLI secara lokal, Anda dapat menggunakan perintah az webapp browse untuk membuka situs di browser default Anda:

az webapp browse --name $APP_SERVICE_NAME --resource-group $RESOURCE_GROUP_NAME

Nota

Perintah az webapp browse tidak didukung di Cloud Shell. Buka jendela browser dan navigasikan ke URL situs web sebagai gantinya.

Pemecahan masalah penerapan

Jika Anda tidak melihat aplikasi sampel, coba langkah-langkah berikut.

  • Dengan penyebaran kontainer dan App Service, selalu periksa halaman Log di Pusat Penyebaran di portal Azure. Konfirmasikan bahwa kontainer telah ditarik dan sedang beroperasi. Penarikan awal dan berjalannya kontainer dapat memakan waktu beberapa saat.
  • Cobalah untuk menghidupkan ulang App Service dan lihat apakah itu menyelesaikan masalah Anda.
  • Jika ada kesalahan pemrograman, kesalahan tersebut muncul di log aplikasi. Pada halaman portal Microsoft Azure untuk App Service, pilih Mendiagnosis dan menyelesaikan masalah/Log aplikasi.
  • Aplikasi sampel bergantung pada koneksi ke Azure Cosmos DB untuk MongoDB. Konfirmasikan bahwa App Service memiliki pengaturan aplikasi dengan info koneksi yang benar.
  • Konfirmasikan bahwa identitas terkelola diaktifkan untuk App Service dan digunakan di Pusat Penyebaran. Pada halaman portal Microsoft Azure untuk App Service, buka sumber daya Pusat Penyebaran App Service dan konfirmasikan bahwa Autentikasi diatur ke Identitas Terkelola.
  • Periksa apakah webhook ditentukan dalam Azure Container Registry. Webhook memungkinkan App Service untuk menarik gambar kontainer. Secara khusus, periksa apakah URI Layanan berakhir dengan "/api/registry/webhook". Jika tidak, tambahkan.
  • Berbagai SKU Azure Container Registry memiliki fitur yang berbeda, termasuk jumlah webhook. Jika Anda menggunakan kembali registri yang ada, Anda dapat melihat pesan: "Kuota terlampaui untuk sumber daya jenis webhook pada registri SKU Basic." Pelajari lebih lanjut tentang berbagai kuota SKU dan proses peningkatan: https://aka.ms/acr/tiers". Jika Anda melihat pesan ini, gunakan registri baru, atau kurangi jumlah registri webhook yang digunakan.

Langkah berikutnya