Contoh: Menggunakan pustaka Azure untuk membuat dan menyebarkan aplikasi web

Contoh ini menunjukkan cara menggunakan pustaka manajemen Azure SDK dalam skrip Python untuk membuat dan menyebarkan aplikasi web ke Azure App Service. Kode aplikasi disebarkan dari repositori GitHub.

Dengan pustaka manajemen (namespace dimulai dengan azure-mgmt, misalnya, azure-mgmt-web), Anda dapat menulis konfigurasi dan program penyebaran untuk melakukan tugas yang sama yang Dapat Anda lakukan melalui portal Azure, Azure CLI, atau alat manajemen sumber daya lainnya. Misalnya, lihat Mulai Cepat: Menyebarkan aplikasi web Python (Django atau Flask) ke Azure App Service. (Perintah Azure CLI yang setara diberikan nanti di artikel ini.)

Semua perintah dalam artikel ini bekerja secara sama di bash Linux/macOS dan shell perintah Windows kecuali ada catatan.

1: Siapkan lingkungan pengembangan lokal Anda

Jika Anda belum melakukannya, siapkan lingkungan tempat Anda dapat menjalankan kode ini. Berikut ini adalah beberapa opsi:

2: Menginstal paket pustaka Azure yang diperlukan

Buat file bernama requirements.txt dengan konten berikut:

azure-mgmt-resource
azure-mgmt-web
azure-identity

Di terminal atau command prompt dengan lingkungan virtual diaktifkan, instal persyaratan:

pip install -r requirements.txt

3: Fork repositori sampel

Kunjungi https://github.com/Azure-Samples/python-docs-hello-world dan fork repositori ke akun GitHub Anda sendiri. Anda akan menggunakan fork untuk memastikan bahwa Anda memiliki izin untuk menyebarkan repositori ke Azure.

Forking the sample repository on GitHub

Kemudian buat variabel lingkungan yang diberi nama REPO_URL dengan URL fork Anda. Kode contoh di bagian berikutnya tergantung pada variabel lingkungan ini:

set REPO_URL=<url_of_your_fork>
set AZURE_SUBSCRIPTION_ID=<subscription_id>

4: Menulis kode untuk membuat dan menyebarkan aplikasi web

Buat file Python bernama provision_deploy_web_app.py dengan kode berikut. Komentar menjelaskan detail kode. Pastikan untuk menentukan REPO_URL variabel lingkungan dan AZURE_SUBSCRIPTION_ID sebelum menjalankan skrip.

import random, os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient
from azure.mgmt.web import WebSiteManagementClient

# Acquire a credential object using CLI-based authentication.
credential = AzureCliCredential()

# Retrieve subscription ID from environment variable
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

# Constants we need in multiple places: the resource group name and the region
# in which we provision resources. You can change these values however you want.
RESOURCE_GROUP_NAME = 'PythonAzureExample-WebApp-rg'
LOCATION = "centralus"

# Step 1: Provision the resource group.
resource_client = ResourceManagementClient(credential, subscription_id)

rg_result = resource_client.resource_groups.create_or_update(RESOURCE_GROUP_NAME,
    { "location": LOCATION })

print(f"Provisioned resource group {rg_result.name}")

# For details on the previous code, see Example: Provision a resource group
# at https://docs.microsoft.com/azure/developer/python/azure-sdk-example-resource-group


#Step 2: Provision the App Service plan, which defines the underlying VM for the web app.

# Names for the App Service plan and App Service. We use a random number with the
# latter to create a reasonably unique name. If you've already provisioned a
# web app and need to re-run the script, set the WEB_APP_NAME environment 
# variable to that name instead.
SERVICE_PLAN_NAME = 'PythonAzureExample-WebApp-plan'
WEB_APP_NAME = os.environ.get("WEB_APP_NAME", f"PythonAzureExample-WebApp-{random.randint(1,100000):05}")

# Obtain the client object
app_service_client = WebSiteManagementClient(credential, subscription_id)

# Provision the plan; Linux is the default
poller = app_service_client.app_service_plans.begin_create_or_update(RESOURCE_GROUP_NAME,
    SERVICE_PLAN_NAME,
    {
        "location": LOCATION,
        "reserved": True,
        "sku" : {"name" : "B1"}
    }
)

plan_result = poller.result()

print(f"Provisioned App Service plan {plan_result.name}")


# Step 3: With the plan in place, provision the web app itself, which is the process that can host
# whatever code we want to deploy to it.

poller = app_service_client.web_apps.begin_create_or_update(RESOURCE_GROUP_NAME,
    WEB_APP_NAME,
    {
        "location": LOCATION,
        "server_farm_id": plan_result.id,
        "site_config": {
            "linux_fx_version": "python|3.8"
        }
    }
)

web_app_result = poller.result()

print(f"Provisioned web app {web_app_result.name} at {web_app_result.default_host_name}")

# Step 4: deploy code from a GitHub repository. For Python code, App Service on Linux runs
# the code inside a container that makes certain assumptions about the structure of the code.
# For more information, see How to configure Python apps,
# https://docs.microsoft.com/azure/app-service/containers/how-to-configure-python.
#
# The create_or_update_source_control method doesn't provision a web app. It only sets the
# source control configuration for the app. In this case we're simply pointing to
# a GitHub repository.
#
# You can call this method again to change the repo.

REPO_URL = os.environ["REPO_URL"]

poller = app_service_client.web_apps.begin_create_or_update_source_control(RESOURCE_GROUP_NAME,
    WEB_APP_NAME, 
    { 
        "location": "GitHub",
        "repo_url": REPO_URL,
        "branch": "master",
        "is_manual_integration": True
    }
)

sc_result = poller.result()

print(f"Set source control on web app to {sc_result.branch} branch of {sc_result.repo_url}")

# Step 5: Deploy the code using the repository and branch configured in the previous step.
#
# If you push subsequent code changes to the repo and branch, you must call this method again
# or use another Azure tool like the Azure CLI or Azure portal to redeploy. 
# Note: By default, the method returns None.

app_service_client.web_apps.sync_repository(RESOURCE_GROUP_NAME, WEB_APP_NAME)

print(f"Deploy code")

Kode ini menggunakan autentikasi berbasis-CLI (menggunakan AzureCliCredential) karena menunjukkan tindakan yang mungkin Anda lakukan dengan Azure CLI secara langsung. Dalam kedua kasus, Anda menggunakan identitas yang sama untuk autentikasi. Bergantung pada lingkungan Anda, Anda mungkin perlu menjalankan az login terlebih dahulu untuk mengautentikasi.

Untuk menggunakan kode tersebut dalam skrip produksi (misalnya, untuk mengotomatiskan manajemen VM), gunakan DefaultAzureCredential (disarankan) dengan metode berbasis perwakilan layanan seperti yang dijelaskan dalam Cara mengautentikasi aplikasi Python dengan layanan Azure.

5: Jalankan skrip

python provision_deploy_web_app.py

6: Verifikasi penyebaran aplikasi web

Kunjungi situs web yang disebarkan dengan menjalankan perintah berikut:

az webapp browse --name PythonAzureExample-WebApp-12345 --resource-group PythonAzureExample-WebApp-rg

Ganti nama aplikasi web (--name opsi) dan nama grup sumber daya (--resource-group opsi) dengan nilai yang Anda gunakan dalam skrip. Anda akan melihat "Hello, World!" di browser.

Jika Anda tidak melihat output yang diharapkan, tunggu beberapa menit dan coba lagi.

Jika Anda masih tidak melihat output yang diharapkan, maka:

  1. Buka portal Microsoft Azure.
  2. Pilih Grup sumber daya, dan temukan grup sumber daya yang Anda buat.
  3. Pilih nama grup sumber daya untuk melihat sumber daya yang dikandungnya. Secara khusus, verifikasi bahwa ada Paket App Service dan App Service.
  4. Pilih App Service, lalu pilih Pusat Penyebaran.
  5. Pilih tab log untuk melihat log penyebaran.

7: Menyebarkan ulang kode aplikasi web (opsional)

Skrip menyiapkan sumber daya yang diperlukan untuk menghosting aplikasi web Anda dan mengatur sumber penyebaran ke fork Anda menggunakan integrasi manual. Dengan integrasi manual, Anda harus memicu aplikasi web untuk menarik dari repositori dan cabang yang dikonfigurasi.

Skrip memanggil metode WebSiteManagementClient.web_apps.sync_repository untuk memicu penarikan dari aplikasi web. Jika Anda mendorong perubahan kode berikutnya ke repositori, Anda dapat menyebarkan ulang kode dengan memanggil API ini atau dengan menggunakan alat Azure lainnya seperti Azure CLI atau portal Azure.

Anda dapat menyebarkan kode Anda dengan Azure CLI dengan menjalankan perintah sinkronisasi sumber penyebaran webapp az:

az webapp deployment source sync --name PythonAzureExample-WebApp-12345 --resource-group PythonAzureExample-WebApp-rg

Ganti nama aplikasi web (--name opsi) dan nama grup sumber daya (--resource-group opsi) dengan nilai yang Anda gunakan dalam skrip.

Untuk menyebarkan kode Anda dari portal Azure:

  1. Buka portal Microsoft Azure.
  2. Pilih Grup sumber daya, dan temukan grup sumber daya yang Anda buat.
  3. Pilih nama grup sumber daya untuk melihat sumber daya yang dikandungnya. Secara khusus, verifikasi bahwa ada Paket App Service dan App Service.
  4. Pilih App Service, lalu pilih Pusat Penyebaran.
  5. Di menu atas, pilih Sinkronkan untuk menyebarkan kode Anda.

8: Membersihkan sumber daya

az group delete --name PythonAzureExample-WebApp-rg --no-wait

Jalankan perintah az group delete jika Anda tidak perlu membuat grup sumber daya dalam contoh ini. Grup sumber daya tidak dikenakan biaya berkelanjutan dalam langganan Anda, tetapi ini adalah praktik yang baik untuk membersihkan grup apa pun yang tidak Anda gunakan secara aktif. Argumen --no-wait memungkinkan perintah untuk segera kembali alih-alih menunggu operasi selesai.

Anda juga dapat menggunakan metode ResourceManagementClient.resource_groups.begin_delete untuk menghapus grup sumber daya dari kode.

Untuk referensi: perintah Azure CLI yang setara

Perintah Azure CLI berikut melengkapi langkah-langkah provisi yang sama dengan skrip Python:

rem Replace <your_github_user_name> with the account name of the fork.

set repoUrl=https://github.com/<your_github_user_name>/python-docs-hello-world
set appName=PythonAzureExample-WebApp-%random%

az group create -l centralus -n PythonAzureExample-WebApp-rg

az appservice plan create -n PythonAzureExample-WebApp-plan -g PythonAzureExample-WebApp-rg ^
     --is-linux --sku F1

echo Creating app: %appName%

az webapp create -g PythonAzureExample-WebApp-rg -n %appName% ^
    --plan PythonAzureExample-WebApp-plan --runtime "python|3.8"

rem You can use --deployment-source-url with the first create command. It is shown here
rem to match the sequence of the Python code.

az webapp create -n %appName% -g PythonAzureExample-WebApp-rg ^
    --plan PythonAzureExample-WebApp-plan --runtime "python|3.8" ^
    --deployment-source-url %repoUrl% 

rem The previous command sets up External Git deployment from the specified repository. This 
rem command triggers a pull from the repository.

az webapp deployment source sync --name %appName% --resource-group PythonAzureExample-WebApp-rg

Baca juga