Aracılığıyla paylaş


Kapsayıcılı Python uygulamasını App Service'e dağıtma

Öğretici serisinin bu bölümünde kapsayıcılı python web uygulamasını Kapsayıcılar için Azure App Service Web App'e dağıtmayı öğreneceksiniz. Bu tam olarak yönetilen hizmet, kapsayıcılı uygulamaları kendi kapsayıcı düzenleyicinizi korumak zorunda kalmadan çalıştırmanıza olanak tanır.

App Service, Docker Hub, Azure Container Registry, Azure Key Vault ve diğer DevOps araçlarıyla çalışan sürekli tümleştirme/sürekli dağıtım (CI/CD) işlem hatları aracılığıyla dağıtımı basitleştirir. Bu öğretici, 5 bölümden oluşan bir öğretici serisinin 4. bölümüdür.

Bu makalenin sonunda, Docker kapsayıcı görüntüsünden çalışan güvenli, üretime hazır bir App Service web uygulamanız vardır. Uygulama, görüntüyü Azure Container Registry'den çekmek ve Azure Key Vault'tan gizli dizileri almak için sistem tarafından atanan yönetilen kimliği kullanır.

Bu hizmet diyagramı, bu makalede ele alınan bileşenleri vurgular.

Azure'da Kapsayıcılı Python Uygulaması Öğreticisi'nde kullanılan hizmetlerin, dağıtım yolunun vurgulandığı ekran görüntüsü.

Azure CLI komutları Azure Cloud Shell'de veya AzureCLI yüklü yerel bir makinede çalıştırılabilir.

Önemli

Bu öğreticideki tüm CLI tabanlı adımlar için Azure Cloud Shell'i kullanmanızı öneririz çünkü:

  • Oturum açma sorunlarından kaçınarak Azure hesabınızla önceden kimliği doğrulanmış olarak gelir
  • Kutu içeriği olarak gerekli tüm Azure CLI uzantılarını içerir.
  • Yerel işletim sisteminizden veya ortamınızdan bağımsız olarak tutarlı bir davranış sağlar
  • Yönetici hakları olmayan kullanıcılar için ideal olan yerel yükleme gerektirmez
  • Azure hizmetlerine portaldan doğrudan erişim sağlar; yerel Docker veya ağ kurulumu gerekmez
  • Yerel güvenlik duvarı veya ağ yapılandırması sorunlarını önler

RBAC Yetkilendirmesi ile Key Vault oluşturma

Azure Key Vault gizli dizileri, API anahtarlarını, bağlantı dizelerini ve sertifikaları depolamaya yönelik güvenli bir hizmettir. Bu betikte MongoDB bağlantı dizesini ve web uygulamasının SECRET_KEYöğesini depolar.

Key Vault, geleneksel erişim ilkeleri yerine Azure rolleri aracılığıyla erişimi yönetmek için rol tabanlı erişim denetimini (RBAC) kullanacak şekilde yapılandırılmıştır. Web uygulaması, çalışma anında gizli bilgileri güvenli bir şekilde almak için sistem tarafından atanan yönetilen kimliğini kullanır.

Not

Key Vault'un erken oluşturulması, sırlara erişim girişiminden önce rollerin atanabilmesini sağlar. Ayrıca rol atamalarında yayılma gecikmelerini önlemeye yardımcı olur. Key Vault, App Service'e bağlı olmadığından, bunu erken sağlamak güvenilirliği ve sıralamayı artırır.

  1. Bu adımda az keyvault create komutunu kullanarak RBAC etkin bir Azure Key Vault oluşturacaksınız.

    #!/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
    

App Service planını ve web uygulamasını oluşturma

App Service Planı, web uygulamanızın işlem kaynaklarını, fiyatlandırma katmanını ve bölgesini tanımlar. Web uygulamanız, kapsayıcılı uygulamanızı çalıştırır ve Azure Container Registry (ACR) ile Azure Key Vault'a güvenli bir şekilde kimlik doğrulaması yapmak için kullanılan, sistemin atadığı yönetilen bir kimlikle donatılmış olarak sağlanır.

Bu adımda aşağıdaki görevleri gerçekleştirirsiniz:

  • App Service Planı Oluşturma
  • Web uygulamasını yönetilen kimliğiyle oluşturma
  • Web uygulamasını belirli bir kapsayıcı görüntüsü kullanarak dağıtılacak şekilde yapılandırma
  • ACR üzerinden sürekli dağıtıma hazırlık

Not

Yönetilen kimlik yalnızca dağıtım zamanında oluşturulduğundan, ACR veya Key Vault'a erişim atanmadan önce web uygulamasının oluşturulması gerekir. Ayrıca oluşturma sırasında kapsayıcı görüntüsünün atanması, uygulamanın istenen yapılandırmayla doğru şekilde başlatılmasını sağlar.

  1. Bu adımda az appservice plan create komutunu kullanarak uygulamanız için işlem ortamını sağlarsınız.

    #!/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. Bu adımda az webapp create komutunu kullanarak web uygulamasını oluşturursunuz. Bu komut ayrıca sistem tarafından atanan yönetilen kimliği etkinleştirir ve uygulamanın çalıştırdığı kapsayıcı görüntüsünü ayarlar.

    #!/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" 
    

    Not

    Bu komutu çalıştırırken aşağıdaki hatayı görebilirsiniz:

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

    Bu hatanın nedeni, web uygulamasının ACR'ye erişmek için yönetici kimlik bilgilerini kullanmayı denemesi ve bu kimlik bilgilerinin varsayılan olarak devre dışı bırakılmasıdır. Bu iletiyi yoksaymak güvenlidir: Sonraki adım, web uygulamasını ACR ile kimlik doğrulaması yapmak için yönetilen kimliğini kullanacak şekilde yapılandırmaktadır.

Oturum açmış kullanıcıya gizli bilgi sorumlusu rolü verme

Azure Key Vault'ta gizli dizileri depolamak için betiği çalıştıran kullanıcının Key Vault Gizli DiziLeri Yetkilisi rolüne sahip olması gerekir. Bu rol, alanda gizli anahtarlar oluşturmaya ve yönetmeye olanak tanır.

Bu adımda, betik bu rolü şu anda oturum açmış olan kullanıcıya atar. Bu kullanıcı daha sonra MongoDB bağlantı dizesi ve uygulamanın SECRET_KEY gibi gizli bilgilerini güvenli bir şekilde depolayabilir.

Bu rol ataması, Key Vault ile ilgili iki rol atamasının ilkidir. Daha sonra, web uygulamasının sistem tarafından atanan yönetilen kimliğine, gizli bilgiler kasasından sırları alma erişimi verilir.

Azure RBAC kullanmak, kimlik temelinde güvenli ve denetlenebilir erişim sağlayarak sabit kodlanmış kimlik bilgilerine olan ihtiyacı ortadan kaldırır.

Not

Anahtar kasasında herhangi bir gizli anahtar depolamaya çalışmadan önce kullanıcıya Key Vault Gizli Anahtarlar Yetkilisi rolü atanmalıdır. Bu atama, kapsamı Key Vault olan az role assignment create komutu kullanılarak yapılır.

  1. Bu adımda, Key Vault kapsamındaki bir rolü atamak için az role assignment create komutunu kullanırsınız.

    #!/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"
    
    

Yönetilen kimliği kullanarak ACR'ye web erişimi verme

Azure Container Registry'den (ACR) görüntüleri güvenli bir şekilde çekmek için web uygulamasının sistem tarafından atanan yönetilen kimliğini kullanacak şekilde yapılandırılması gerekir. Yönetilen kimliğin kullanılması yönetici kimlik bilgileri gereksinimini önler ve güvenli, kimlik bilgisi olmayan dağıtımı destekler.

Bu işlem iki önemli eylem içerir:

  • ACR'ye erişirken web uygulamasının yönetilen kimliğini kullanmasını etkinleştirme
  • AcrPull rolünü hedef ACR'de bu kimliğe atama
  1. Bu adımda az webapp identity show komutunu kullanarak web uygulamasının yönetilen kimliğinin asıl kimliğini (benzersiz nesne kimliği) alırsınız. Ardından, acrUseManagedIdentityCreds komutunu kullanarak true özelliğini olarak ayarlayıp ACR kimlik doğrulaması için yönetilen kimliğin kullanımını etkinleştirebilirsiniz. Ardından az role assignment create komutunu kullanarak AcrPull rolünü web uygulamasının yönetilen kimliğine atarsınız. Bu rol, web uygulamasına kayıt defterinden görüntü çekme izni verir.

    #!/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"
    
    

Web uygulamasının yönetilen kimliğine anahtar kasası erişimi verme

Web uygulamasının MongoDB bağlantı dizesi ve SECRET_KEY gibi sırlar dahil olmak üzere gizli bilgilere erişim için izne ihtiyacı vardır. Bu izinleri vermek için Key Vault Gizli Dizileri Kullanıcı rolünü web uygulamasının sistem atamalı yönetilen kimliğine atamanız gerekir.

  1. Bu adımda, az role assignment create komutunu kullanarak web uygulamasına Key Vault Sırları Kullanıcısı rolüyle Key Vault erişimi vermek için web uygulamasının sistem tarafından atanan yönetilen kimliğinin benzersiz tanımlayıcısını (principal ID) kullanırsınız.

    #!/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"
    

Gizli Bilgileri Key Vault'ta Saklayın

Uygulamanızda gizli dizileri sabit kodlamaktan kaçınmak için bu adım MongoDB bağlantı dizesini ve web uygulamasının gizli dizi anahtarını Azure Key Vault'ta depolar. Bu gizli dizilere, kimlik bilgilerini kodda veya yapılandırmada depolamaya gerek kalmadan, web uygulaması tarafından yönetilen kimliği aracılığıyla çalışma zamanında güvenli bir şekilde erişilebilir.

Not

Bu öğretici anahtar kasasında yalnızca bağlantı dizesini ve gizli anahtarı depolasa da, isteğe bağlı olarak MongoDB veritabanı adı veya koleksiyon adı gibi diğer uygulama ayarlarını da Key Vault'ta depolayabilirsiniz.

  1. Bu adımda az cosmosdb keys list komutunu kullanarak MongoDB bağlantı dizesini alırsınız. Ardından az keyvault secret set komutunu kullanarak hem bağlantı dizesini hem de rastgele oluşturulan gizli anahtarı Key Vault'ta depolarsınız.

    #!/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"
    

Web uygulamasını Kay Vault sırlarını kullanacak şekilde yapılandırın

Gizli dizilere çalışma zamanında güvenli bir şekilde erişmek için web uygulamasının Azure Key Vault'ta depolanan gizli dizilere başvuracak şekilde yapılandırılması gerekir. Bu adım, Key Vault başvuruları kullanılarak, gizli değerleri uygulamanın ortamına sistem tarafından atanan yönetilen kimliği aracılığıyla ekleyerek gerçekleştirilir.

Bu yaklaşım gizli dizilerin sabit kodlamasını önler ve uygulamanın yürütme sırasında MongoDB bağlantı dizesi ve gizli anahtar gibi hassas değerleri güvenli bir şekilde almasını sağlar.

  1. Bu adımda az webapp config appsettings set komutunu kullanarak Key Vault gizli dizilerine başvuran uygulama ayarları eklersiniz. Bu, özellikle MongoConnectionString ve MongoSecretKey uygulama ayarlarını, Key Vault'ta depolanan ilgili gizli anahtarlara referans verecek şekilde ayarlar.

    #!/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"
    

ACR'den sürekli dağıtımı etkinleştirme

Sürekli dağıtımı etkinleştirmek, web uygulamasının Azure Container Registry'ye (ACR) her gönderildiğinde en son kapsayıcı görüntüsünü otomatik olarak çekmesine ve çalıştırmasına olanak tanır. Bu, el ile dağıtım adımlarını azaltır ve uygulamanızın güncel kalmasını sağlamaya yardımcı olur.

Not

Sonraki adımda, yeni bir görüntü gönderildiğinde web uygulamasını bilgilendirmek için ACR'ye bir web kancası kaydedeceksiniz.

  1. Bu adımda, ACR'den web uygulamasına sürekli dağıtımı etkinleştirmek için az webapp deployment container config komutunu kullanırsınız.

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

Sürekli dağıtım için bir ACR Web Kancası kaydet

Dağıtımları otomatikleştirmek için Azure Container Registry'ye (ACR) yeni bir kapsayıcı görüntüsü gönderildiğinde web uygulamasına bildirimde bulunan bir web kancası kaydedin. Web kancası, uygulamanın otomatik olarak en son sürümü çekmesine ve çalıştırmasına olanak tanır.

Azure Container Registry'de (ACR) yapılandırılan web kancası, msdocspythoncontainerwebapp deposuna her yeni görüntü gönderildiğinde web uygulamasının SCM uç noktasına (SERVICE_URI) bir POST isteği gönderir. Bu eylem, güncelleştirilmiş görüntüyü çekmek ve dağıtmak için web uygulamasını tetikler ve ACR ile Azure App Service arasındaki sürekli dağıtım işlem hattını tamamlar.

Not

Web kancası URI'sinin şu biçime uyması gerekir:
https://<app-name>.scm.azurewebsites.net/api/registry/webhook

ile /api/registry/webhook. URI hatası alırsanız yolun doğru olduğunu onaylayın.

  1. Bu adımda, az acr webhook create komutunu kullanarak web kancasını kaydedin ve push olaylarında tetiklenecek şekilde yapılandırın.

    #!/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
    
    

Siteye göz atın

Web uygulamasının çalıştığını doğrulamak için, App Service'inizin adıyla değiştirerek https://<website-name>.azurewebsites.net URL'yi açın <website-name>. Restoran inceleme örnek uygulamasını görmeniz gerekir. İlk kez yüklenmesi birkaç dakika sürebilir.

Site göründükten sonra, bir restoran eklemeyi ve uygulamanın düzgün çalıştığını onaylamak için bir inceleme göndermeyi deneyin.

Not

az webapp browse komutu Cloud Shell'de desteklenmez. Cloud Shell kullanıyorsanız bir tarayıcıyı el ile açın ve site URL'sine gidin.

Azure CLI'yi yerel olarak kullanıyorsanız, az webapp browse komutunu kullanarak siteyi varsayılan tarayıcınızda açabilirsiniz:

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

Not

az webapp browse komutu Cloud Shell'de desteklenmez. Bunun yerine bir tarayıcı penceresi açın ve web sitesi URL'sine gidin.

Dağıtım sorunlarını giderme

Örnek uygulamayı görmüyorsanız aşağıdaki adımları deneyin.

  • Kapsayıcı dağıtımı ve App Service ile Azure portalında bulunan Dağıtım Merkezi / Günlükler sayfasını her zaman denetleyin. Konteynerin alınarak çalıştırıldığını onaylayın. Kapsayıcının ilk çekme ve çalıştırma işlemi birkaç dakika sürebilir.
  • App Service'i yeniden başlatmayı deneyin ve bunun sorununuzu giderip çözmediğini denetleyin.
  • Programlama hataları varsa, bu hatalar uygulama günlüklerinde gösterilir. App Service'in Azure portalı sayfasında, sorunları tanılama ve çözme/Uygulama günlükleriseçin.
  • Örnek uygulama, MongoDB için Azure Cosmos DB bağlantısına dayanır. App Service'in doğru bağlantı bilgileriyle uygulama ayarlarına sahip olduğunu onaylayın.
  • App Service için yönetilen kimliğin etkinleştirildiğini ve Dağıtım Merkezinde kullanıldığını doğrulayın. Azure portalı sayfasındaki App Service'te App Service Dağıtım Merkezi kaynağına gidin ve Kimlik Doğrulaması'nin yönetilen kimlikolarak ayarlandığını onaylayın.
  • Web kancasının Azure Container Registry'de tanımlandığını denetleyin. Webhook, App Service'in kapsayıcı görüntüsünü çekmesine olanak tanır. Özellikle, Hizmet URI'sinin "/api/registry/webhook" ile bitip bitmediğini denetleyin. Eğer eklenmemişse ekleyin.
  • Farklı Azure Container Registry sku'ları web kancalarının sayısı gibi farklı özelliklere sahiptir. Mevcut bir kayıt defterini yeniden kullanıyorsanız şu mesajı görebilirsiniz: "Kayıt defteri SKU Basic için webhooks kaynak türü kotası aşıldı." Farklı SKU kotaları ve yükseltme işlemi hakkında daha fazla bilgi edinin: https://aka.ms/acr/tiers". Bu iletiyi görürseniz yeni bir kayıt defteri kullanın veya kullanımda olan kayıt defteri web kancalarının sayısını azaltın.

Sonraki adım