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 Cloud Shell veya Azure CLI yüklü yerel bir makinede Azure CLI komutları çalıştırabilirsiniz.

Önemli

Bu öğreticideki tüm CLI tabanlı adımlar için Azure Cloud Shell kullanın çünkü:

  • Azure hesabınızla önceden kimlik doğrulamasıyla gelir, böylece kimlik doğrulaması sorunlarıyla karşılaşmazsınız
  • Tüm gerekli 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
  • Portaldan Azure hizmetlerine doğrudan erişim sağlar; yerel Docker veya ağ kurulumu gerekmez
  • Yerel güvenlik duvarı veya ağ yapılandırma 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 roller aracılığıyla erişimi yönetmek için rol tabanlı erişim denetimini (RBAC) kullanacak şekilde yapılandırın. 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

Gizli anahtarlara erişmeye yönelik herhangi bir girişimden önce rolleri atayabilmenizi sağlamak için Key Vault’u önceden oluşturun. Bu yaklaşım, rol atamalarında yayılma gecikmelerini önlemeye de 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. RBAC etkin bir Azure Key Vault oluşturmak için az keyvault create komutunu kullanın.

    #!/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 uygulaması, kapsayıcıya alınmış uygulamanızı çalıştırır ve Azure Container Registry’ye (ACR) ve Azure Key Vault’a güvenli biçimde kimlik doğrulaması yapmak için kullandığı sistem tarafından atanan yönetilen kimlikle donatılmıştır.

Bu adımda aşağıdaki görevleri tamamlayın:

  • 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 erişimi atamadan önce web uygulamasını oluşturmanız 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. Uygulamanızın işlem ortamını sağlamak için az appservice plan create komutunu kullanın.

    #!/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. Web uygulamasını oluşturmak için az webapp create komutunu kullanın. 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 kullanmaya çalışması, ancak yönetici kimlik bilgilerinin varsayılan olarak devre dışı bırakılmasıdır. Bu iletiyi güvenle göz ardı edebilirsiniz. Sonraki adım, web uygulamasını ACR ile kimlik doğrulaması yapmak için yönetilen kimliğini kullanacak şekilde yapılandırmaktadır.

Kimliği doğrulanmış kullanıcıya Key Vault Secrets Officer rolünü atama

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, kasada gizli anahtarlar oluşturma ve yönetme izni verir.

Bu adımda, betik bu rolü şu anda kimliği doğrulanmış 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 kullanarak, kimlik temelinde güvenli, denetlenebilir bir erişim sağlarsınız, bu nedenle sabit kodlanmış kimlik bilgilerini kullanmanız gerekmez.

Not

Kullanıcı gizli dizileri Key Vault'a kaydetmeye çalışmadan önce, Key Vault Gizli Dizi Sorumlusu rolünü atayın. Bu atamayı yapmak için Key Vault kapsamına alınmış az role assignment create komutunu kullanın.

  1. rolü Key Vault kapsamında atamak için az role assignment create komutunu kullanın.

    #!/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 (ACR) içindeki görüntüleri güvenli bir şekilde çekmek için web uygulamasını sistem tarafından atanan yönetilen kimliğini kullanacak şekilde yapılandırın. Yönetilen kimlik kullanarak yönetici kimlik bilgilerine ihtiyacınız yoktur ve güvenli, kimlik bilgisi olmayan dağıtımı destekleyebilirsiniz.

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 ana kimliğini (benzersiz nesne kimliği) alın. 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ştirin. Ardından az role assignment create komutunu kullanarak AcrPull rolünü web uygulamasının yönetilen kimliğine atayın. 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 Secrets User rolünü web uygulamasının sistem tarafından atanan yönetilen kimliğine atayın.

  1. Bu adımda, web uygulamasına Key Vault Secrets User rolüyle Key Vault'a erişim izni vermek için, web uygulamasının sistem tarafından atanan yönetilen kimliğinin benzersiz tanımlayıcısını (ana kimlik) az role assignment create komutuyla kullanın.

    #!/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 depolayın

Uygulamanızda gizli dizileri sabit kodlamaktan kaçınmak için MongoDB bağlantı dizesi ve web uygulamasının gizli dizi anahtarını Azure Key Vault depolayın. Web uygulaması, yönetilen kimliği aracılığıyla çalışma zamanında bu gizli dizilere güvenli bir şekilde erişebilir, bu nedenle kimlik bilgilerini kod veya yapılandırmada depolamanız gerekmez.

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. MongoDB bağlantı dizesi almak için az cosmosdb keys list komutunu kullanın. Ardından az keyvault secret set komutunu kullanarak hem bağlantı dizesi hem de rastgele oluşturulan gizli anahtarı Key Vault depolayın.

    #!/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ı Key Vault gizli anahtarlarını kullanacak şekilde yapılandırma

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

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. Key Vault gizli anahtarlarına başvuru yapan uygulama ayarlarını eklemek için az webapp config appsettings set komutunu kullanın. Özellikle, MongoConnectionString ve MongoSecretKey uygulama ayarlarını, Key Vault’ta depolanan ilgili gizli anahtarlara başvuracak biçimde yapılandırın.

    #!/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ştirdiğinizde, Azure Container Registry (ACR) uygulamasına her gönderdiğinizde web uygulaması otomatik olarak en son kapsayıcı görüntüsünü çeker ve çalıştırır. Bu özellik, 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ı kaydedersiniz.

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

    #!/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ını kaydedin

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ını kullanarak uygulama otomatik olarak en son sürümü çeker ve çalıştırır.

Azure Container Registry (ACR) içinde yapılandırdığınız web kancası, depoya yeni bir görüntü gönderildiğinde msdocspythoncontainerwebapp 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. Web kancasını kaydetmek ve bunu olaylarında tetiklenecek şekilde yapılandırmak için push komutunu kullanı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 yerel olarak kullanıyorsanız, siteyi varsayılan tarayıcınızda açmak için az webapp browse komutunu kullanın:

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 için her zaman Azure portalındaki Dağıtım Merkezi / Günlükleri sayfasını denetleyin. Konteynerin indirildiğini ve çalıştığını doğrulayı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 iletiyi görebilirsiniz: "Kayıt defteri SKU Basic için kaynak türü web kancaları için kota 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