Katmanlı sağlama

Azure Geliştirici CLI'sı (azd), dosyanızda azure.yaml birden çok sağlama katmanı tanımlamak için kullanabileceğiniz katmanlı sağlamayı destekler. Her katman kendi Kod Olarak Altyapı (IaC) şablonları kümesine işaret eder. CLI, katmanları birer birer sağlar ve aralarındaki bağımlılıklara göre sıralanır. Ayrıca tek tek katmanları bağımsız olarak sağlayabilir veya yok edebilirsiniz.

Bu özellik, bir katmandaki kaynakların başka bir katmandaki kaynaklara bağımlı olduğu karmaşık bağımlılık senaryolarını çözer. IaC'yi zorlayıcı kanca betikleriyle karıştırmak yerine, katmanlı sağlama her şeyi deklaratif şekilde tutar.

Uyarı

Katmanlı temin şu anda beta aşamasında bulunan bir özelliktir. Sürüm oluşturma stratejisi hakkında daha fazla bilgi edinin.

Katmanlı sağlama ne zaman kullanılır?

Tek azd provision bir dağıtım tüm altyapı gereksinimlerinizi tek adımda karşılayamazsa katmanlı sağlamayı kullanın. Aşağıdaki durumlarda katmanlı sağlamayı kullanmayı göz önünde bulundurun:

  • Döngüsel bağımlılıklar: Bazı kaynakların, özel uç noktanın yapılandırılabilmesi için önce var olması gereken bir sanal ağ gibi, önce oluşturulması gereken diğer kaynaklara başvurması gerekir.
  • Temel altyapı, uygulama altyapısından farklıdır: Paylaşılan ağ, güvenlik veya kimlik kaynaklarını uygulama başına kaynaklardan ayrı olarak yönetirsiniz.
  • Bağımsız yaşam döngüsü yönetimi gereklidir: Farklı altyapı bileşenlerini farklı zamanlarda güncelleştirip yok edebilirsiniz. Örneğin, bir uygulama katmanı sık sık yeniden dağıtılırken ağ katmanı uzun ömürlü olabilir.
  • Ayrı altyapı gruplarına sahip monorepo projeleri: Tek bir depo, her biri kendi altyapı şablonlarına sahip birden çok bağımsız hizmet (Olay Hub'ı, Kapsayıcı Uygulaması ve İşlev Uygulaması gibi) içerir.

azure.yaml'de katmanları yapılandırma

Dosyanızın infra bölümünün altında azure.yaml katmanlar tanımlayın. Her katman için name bir ve bu katman için IaC şablonlarını içeren dizine işaret eden bir path gerekir.

name: my-app
infra:
  layers:
    - name: networking
      path: ./infra/networking
    - name: application
      path: ./infra/application
services:
  api:
    project: ./src/api
    language: js
    host: containerapp

Önemli

Katman işleme sırası:azd provision katmanları bağımlılıklarına göre işler. Bicep katmanları ve özel veya uzantı sağlayıcıları için, azd ortam değişkeni ve katman çıkış başvuruları için parametre dosyalarını (*.bicepparam ve *.parameters.json) tarayarak bağımlılıkları çıkarsar ve katmanlarını içinde azure.yamllistelenen sırayı kesinlikle takip etmek yerine uygun şekilde sıralar. Çıkarılan veya bildirilmiş bağımlılıkları olmayan katmanlar listelendikleri sırayla çalışır. azd down karşılık gelen ters sırayı izler, böylece bağımlı katmanlar bağımlı oldukları katmanlardan önce kaldırılır. azd'in çıkaramadığı sıralamayı bildirmek için dependsOn özelliğini kullanın.

Katman özellikleri

Her katman aşağıdaki özellikleri destekler:

Mülkiyet Gerekli Description
name Evet Katman için benzersiz bir ad. Komutlarla belirli bir katmanı hedeflerken bu adı kullanın.
path Evet Bu katman için IaC şablonlarını içeren dizinin göreli yolu.
module Hayı Katmanın dizinindeki modülün adı. Varsayılan olarak main değerini alır.
provider Hayı Bu katman için IaC sağlayıcısı (bicep veya terraform). Belirtmezseniz kökten infra.provider devralır.
dependsOn Hayı Bu katmanın bağlı olduğu diğer katmanların adları. Sıralama önemliyse ancak azd parametre başvurularından bağımlılığı çıkaramıyorsa bu özelliği kullanın.

Önemli

Tanımladığınızda infra.layers, kök düzeyinde infra bölümü üzerinde diğer özellikleri (path, module, deploymentStacks) bildiremezsiniz. Her katmandaki tüm altyapı yapılandırmasını belirtmeniz gerekir.

Dizin yapısı

Katmanlı sağlama kullanan tipik bir proje aşağıdaki dizin yapısına sahip olabilir:

my-app/
├── azure.yaml
├── infra/
│   ├── networking/
│   │   └── main.bicep
│   └── application/
│       └── main.bicep
└── src/
    └── api/
        └── ...

Her katman dizini, standart azd bir projenin infra dizininde olduğu gibi kendi eksiksiz IaC şablonları kümesini içerir.

Katmanları sağlama ve yönetme

Tüm katmanları aynı anda sağlayabilir veya belirli bir katmanı ada göre hedefleyebilirsiniz. Aşağıdaki bölümlerde katman durumunu sağlama, kaldırma ve yenilemeye yönelik yaygın komutlar açıklanmaktadır.

Tüm katmanları sağlama

Tüm katmanları oluşturmak için azd provision komutunu argüman olmadan çalıştırın:

azd provision

azd, her katmanı tek tek işler ve bir katmanın, ona bağımlı herhangi bir katman başlamadan önce tamamlanmasını sağlar. Bicep katmanları ile özel veya uzantı sağlayıcıları için azd, *.parameters.json ve *.bicepparam dosyalarındaki ortam değişkeni ve katman çıktısı başvurularından bağımlılıkları çıkarır; bu nedenle yürütme sırası, azure.yaml içinde listelenen sıradan farklı olabilir. Çıkarılan veya bildirilen bağımlılıkları olmayan katmanlar listelenen sırada çalışır. Bu süreç, bağımlı kaynakların, bunlara başvuran katmanlar dağıtılmadan önce mevcut olduğunu garanti eder.

Belirli bir katmanı sağlama

Yalnızca belirli bir katmanı sağlamak için, katman adını parametre olarak geçirin.

azd provision networking

Bu komut yalnızca katmanda networking tanımlanan kaynakları dağıtır. Belirli bir katmanı sağlamak aşağıdaki durumlarda kullanışlıdır:

  • Geliştirme sırasında tek bir katmanda yineleme yapıyorsun.
  • Başkalarını yeniden dağıtmadan bir katmanı güncelleştirmeniz gerekir.
  • Mevcut altyapının üzerine yeni bir katman ayarlıyorsunuz.

Tüm katmanları yırtın

Kaynakları tüm katmanlardan kaldırmak için bağımsız değişken olmadan komutunu çalıştırın azd down . Birden çok katman mevcut olduğunda, azd bunları sağlama sırasının tersine işler, böylece bağımlı kaynaklar bağımlı oldukları temel kaynaklardan önce kaldırılır:

azd down

Belirli bir katmanı sökme

Belirli bir katmanı kaldırmak için katman adını parametre olarak geçirin:

azd down application

Bu komut yalnızca katman tarafından application dağıtılan kaynakları kaldırır ve diğer katmanları olduğu gibi bırakır.

Ortam durumunu yenileme

--layer bayrağını kullanarak azd env refresh ile ortam durumunu belirli bir katmandan yenileyebilirsiniz.

azd env refresh --layer networking

Bu komut, ortam değişkenlerini ve çıkışlarını belirtilen katmanın en son dağıtımına göre güncelleştirir.

Birden çok hizmet içeren bir monorepo örneği

Aşağıdaki örnekte Event Hub, birden çok kapsayıcı çalıştıran bir Container App ve Azure Function App içeren bir monorepo için katmanlı sağlama gösterilmektedir:

name: logging-app
infra:
  layers:
    - name: eventhub
      path: ./infra/eventhub
    - name: aca
      path: ./infra/aca
    - name: functionapp
      path: ./infra/functionapp
services:
  functionapp:
    resourceName: ${site_name}
    language: dotnet
    project: ./src/function/functionapp.csproj
    host: appservice
    resourceGroup: ${rg_name}

karşılık gelen dizin yapısı:

logging-app/
├── azure.yaml
├── infra/
│   ├── eventhub/
│   │   └── main.bicep
│   ├── aca/
│   │   └── main.bicep
│   └── functionapp/
│       └── main.bicep
└── src/
    └── function/
        └── functionapp.csproj

Bu yapılandırmayla şunları yapabilirsiniz:

  1. Yalnızca Event Hub altyapısını sağlayın: azd provision eventhub
  2. Yalnızca Container App altyapısını sağlayın: azd provision aca
  3. Her şeyi sırayla sağlayın: azd provision
  4. Yalnızca İşlev Uygulaması katmanını yırtın: azd down functionapp

Örnek: Temel ve uygulama katmanları

Ortak bir desen, paylaşılan veya temel altyapıyı uygulama başına altyapıdan ayırır:

name: my-app
infra:
  layers:
    - name: base
      path: ./infra/base
    - name: app
      path: ./infra/app
services:
  web:
    project: ./src/web
    language: js
    host: containerapp

Katman base ağ, kimlik ve izleme gibi paylaşılan kaynaklar oluşturur. Katman, app temel kaynaklara başvuran uygulamaya özgü kaynakları (Kapsayıcı Uygulaması ortamı ve kapsayıcı uygulamaları gibi) oluşturur.

Geliştirme sırasında temel katmanı bir kez sağlayıp uygulama katmanında yineleyebilirsiniz:

azd provision base
azd provision app
azd provision app  # re-provision only the app layer after changes

Örnek: Karma IaC sağlayıcıları

Her katman farklı bir IaC sağlayıcısı kullanabilir. Örneğin, ağ için Bicep ve uygulama katmanı için Terraform kullanabilirsiniz:

name: my-app
infra:
  layers:
    - name: networking
      path: ./infra/networking
      provider: bicep
    - name: application
      path: ./infra/application
      provider: terraform

Bicep dışındaki yerleşik sağlayıcılar (Terraform, Pulumi, ARM ve test sağlayıcısı), bağımlılık çıkarımı açısından opaktır; çünkü azd, diğer katmanlara yapılan başvuruları bulmak için bunların girdilerini çözümleyemez. Bu katmanlar arasında veya bu katmanlar ile diğer katmanlar arasında her sıralamada açık dependsOn bir özellik kullanın:

name: my-app
infra:
  layers:
    - name: networking
      path: ./infra/networking
      provider: bicep
    - name: application
      path: ./infra/application
      provider: terraform
      dependsOn:
        - networking

Dikkat edilmesi gerekenler ve sınırlamalar

  • Tüm katmanları sağladığınızda, azd bağımlılıklarına göre bunları birer birer işler. Bicep katmanları ile özel veya uzantı sağlayıcıları için azd, *.parameters.json ve *.bicepparam dosyalarındaki ortam değişkeni ve katman çıktısı başvurularından bağımlılıkları çıkarır. Çıkarılma veya bildirilmiş bağımlılıkları olmayan katmanlar, tanımladığınız sırayla çalışır.
  • Yerleşik Bicep dışındaki sağlayıcılar (Terraform, Pulumi, ARM ve test sağlayıcısı) bağımlılık çıkarımı açısından opaktır. Bu katmanları içeren sıralama önemli olduğunda açık bir dependsOn özelliği kullanın.
  • Ayrıca sıralama önemli olduğunda da açık dependsOn gereklidir, ancak azd parametre başvurularından bağımlılığı çıkaramaz. Örneğin, bir katmanın dependsOn kancası başka bir katmanın kullandığı bir değer ürettiğinde postprovision kullanın; çünkü kancanın ürettiği değerler *.parameters.json veya *.bicepparam dosyalarında çıktı başvuruları olarak görünmez.
  • Tüm katmanları yok ettiğinizde, azd bunları sağlama sırasının tersinde işler.
    • Birden çok katman kaynakları aynı Azure kaynak grubuna dağıtırsa ve varsayılan kaynak grubu tabanlı silme davranışını kullanırsanız, azd down çalıştırılırken paylaşılan kaynaklar silinebilir.
    • Katmanlı altyapının bağımsız izlenmesine ve silinmesine izin vermek için komutunu azd config set alpha.deployment.stacks onçalıştırarak dağıtım yığınlarını etkinleştirin.
  • Birden çok katman aynı anda sağlanırken --preview bayrağını kullanamazsınız. Önizleme modunu kullanmak için bir <layer> ad belirtin.
  • Katmanlar IaC açısından bağımsız olarak çalışır. Bir katmanın çıktısına başka bir katmanda başvurmak için, her katmanın dağıtımından sonra ayarlanan azd ortam değişkenlerini kullanın. Bu ortam değişkenlerine bir *.parameters.json veya *.bicepparam dosyasında başvurmak, azd’nin katmanlar arasındaki sıralamayı çıkarsamasına da olanak tanır.
  • Tüm standart azd sağlama özellikleri (dağıtım durumu önbelleğe alma, kancalar, parametreler, Bicep veya Terraform) her bir katmanda çalışır.
    • Komut düzeyi kancaları (örneğin, preprovision, postprovision) katman başına bir kez çağrılır. Birden çok katman tanımlandığında, katmanlar işlenirken her katman için kancalar çalıştırılır.

Sonraki Adımlar