Provisi berlapis

Azure Developer CLI (azd) mendukung provisi berlapis, yang dapat Anda gunakan untuk menentukan beberapa lapisan provisi dalam file Anda azure.yaml . Setiap lapisan menunjuk ke serangkaian templat Infrastruktur sebagai Kode (IaC) sendiri. CLI menyediakan lapisan satu per satu, diurutkan oleh dependensi di antara mereka. Anda juga dapat menyediakan atau meruntuhkan lapisan individual secara mandiri.

Fitur ini memecahkan skenario dependensi kompleks di mana sumber daya dalam satu lapisan bergantung pada sumber daya dari lapisan lain. Alih-alih mencampur IaC dengan skrip kait imperatif, provisi berlapis membuat semuanya tetap deklaratif.

Nota

Penyediaan berlapis adalah fitur beta saat ini. Pelajari selengkapnya tentang strategi penerapan versi.

Kapan menggunakan provisi berlapis

Gunakan penyediaan berlapis saat satu azd provision penyebaran tidak dapat menangani semua kebutuhan infrastruktur Anda dalam satu langkah. Pertimbangkan untuk menggunakan provisi berlapis saat:

  • Dependensi melingkar: Beberapa sumber daya perlu mereferensikan sumber daya lain yang harus dibuat terlebih dahulu, seperti jaringan virtual yang harus ada sebelum titik akhir privat dapat dikonfigurasi.
  • Infrastruktur dasar berbeda dari infrastruktur aplikasi: Anda mengelola jaringan bersama, keamanan, atau sumber daya identitas secara terpisah dari sumber daya per aplikasi.
  • Diperlukan manajemen siklus hidup independen: Anda memperbarui dan meruntuhkan komponen infrastruktur yang berbeda pada waktu yang berbeda. Misalnya, lapisan jaringan mungkin berumur panjang, sementara lapisan aplikasi sering disebarkan ulang.
  • Proyek monorepo dengan grup infrastruktur yang berbeda: Satu repositori berisi beberapa layanan independen (seperti Event Hub, Aplikasi Kontainer, dan Aplikasi Fungsi), masing-masing dengan templat infrastrukturnya sendiri.

Konfigurasikan layer dalam azure.yaml

Tetapkan lapisan-lapisan di bawah bagian infra dalam file azure.yaml Anda. Setiap lapisan memerlukan name dan path menunjuk ke direktori yang berisi templat IaC untuk lapisan tersebut.

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

Penting

Urutan pemrosesan lapisan:azd provision memproses lapisan berdasarkan dependensinya. Untuk lapisan Bicep dan penyedia kustom atau ekstensi, azd menyimpulkan dependensi dengan memindai file parameter (*.bicepparam dan *.parameters.json) untuk variabel lingkungan dan referensi output lapisan, dan mengurutkan lapisan yang sesuai alih-alih secara ketat mengikuti urutan yang tercantum dalam azure.yaml. Lapisan yang tidak memiliki dependensi yang disimpulkan atau dinyatakan berjalan dalam urutan yang tercantum. azd down mengikuti urutan terbalik yang sesuai, sehingga lapisan dependen dihapus sebelum lapisan yang mereka andalkan. dependsOn Gunakan properti untuk mendeklarasikan pengurutan yang azd tidak dapat menyimpulkan.

Properti lapisan

Setiap lapisan mendukung properti berikut:

Harta benda Diperlukan Deskripsi
name Yes Nama unik untuk lapisan. Gunakan nama ini saat menargetkan lapisan tertentu dengan perintah.
path Yes Jalur relatif ke direktori yang berisi templat IaC untuk lapisan ini.
module Tidak. Nama modul dalam direktori lapisan. Secara default menjadi main.
provider Tidak. Penyedia IaC untuk lapisan ini (bicep atau terraform). Mewarisi dari akar infra.provider jika Anda tidak menentukannya.
dependsOn Tidak. Nama lapisan lain yang bergantung pada lapisan ini. Gunakan properti ini ketika urutan penting, tetapi azd tidak dapat menentukan ketergantungan dari referensi parameter.

Penting

Saat Anda menentukan infra.layers, Anda tidak dapat mendeklarasikan properti lain di infra bagian (path, module, deploymentStacks) di tingkat akar. Anda harus menentukan semua konfigurasi infrastruktur dalam setiap lapisan.

Struktur direktori

Proyek umum yang menggunakan provisi berlapis mungkin memiliki struktur direktori berikut:

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

Setiap direktori lapisan berisi serangkaian templat IaC lengkapnya sendiri, sama seperti direktori proyek azd standarinfra.

Pengadaan dan mengelola lapisan

Anda dapat menyediakan semua lapisan sekaligus atau menargetkan lapisan tertentu berdasarkan nama. Bagian berikut menjelaskan perintah umum untuk penyediaan, pembongkaran, dan penyegaran kondisi lapisan.

Memprovisikan semua lapisan

Jalankan azd provision tanpa argumen untuk menyediakan semua lapisan:

azd provision

azd memproses setiap lapisan satu per satu, memastikan bahwa lapisan selesai sebelum lapisan apa pun yang bergantung padanya dimulai. Untuk lapisan Bicep dan penyedia kustom atau ekstensi, azd menyimpulkan dependensi dari variabel lingkungan dan referensi output lapisan dalam *.bicepparam file dan *.parameters.json , sehingga urutan eksekusi dapat berbeda dari urutan yang tercantum dalam azure.yaml. Lapisan tanpa dependensi yang disimpulkan atau dinyatakan berjalan dalam urutan yang tercantum. Proses ini menjamin bahwa sumber daya dependen ada sebelum lapisan yang mereferensikannya disebarkan.

Memprovisikan lapisan tertentu

Untuk memprovisikan hanya lapisan tertentu, berikan nama lapisan sebagai argumen:

azd provision networking

Perintah ini hanya menyebarkan sumber daya yang ditentukan dalam networking lapisan. Penyediaan lapisan tertentu berguna saat:

  • Anda melakukan iterasi pada satu lapisan selama pengembangan.
  • Anda perlu memperbarui satu lapisan tanpa menyebarkan ulang lapisan lain.
  • Anda sedang menyiapkan lapisan baru di atas infrastruktur yang ada.

Merobek semua lapisan

Jalankan azd down tanpa argumen untuk menghapus sumber daya dari semua lapisan. Ketika beberapa lapisan ada, azd memprosesnya secara terbalik dari urutan provisi, sehingga sumber daya dependen dihapus sebelum sumber daya dasar bergantung pada:

azd down

Merobek lapisan tertentu

Untuk merobek lapisan tertentu saja, teruskan nama lapisan sebagai argumen:

azd down application

Perintah ini hanya menghapus sumber daya yang disebarkan oleh application lapisan, membiarkan lapisan lain tetap utuh.

Merefresh kondisi lingkungan sistem

Anda dapat menyegarkan status lingkungan dari lapisan tertentu dengan menggunakan --layer flag dengan azd env refresh:

azd env refresh --layer networking

Perintah ini memperbarui variabel dan output lingkungan berdasarkan penyebaran terbaru dari lapisan yang ditentukan.

Contoh: Monorepo dengan beberapa layanan

Contoh berikut menunjukkan provisi berlapis untuk monorepo yang berisi Event Hub, Aplikasi Kontainer yang menjalankan beberapa kontainer, dan Aplikasi Fungsi Azure:

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}

Struktur direktori yang sesuai:

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

Dengan konfigurasi ini, Anda dapat:

  1. Hanya sediakan infrastruktur Event Hub: azd provision eventhub
  2. Sediakan hanya infrastruktur Kontainer Aplikasi: azd provision aca
  3. Sediakan semuanya secara tertata: azd provision
  4. Membongkar hanya lapisan Function App: azd down functionapp

Contoh: Lapisan dasar dan aplikasi

Pola umum memisahkan infrastruktur bersama atau dasar dari infrastruktur per aplikasi:

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

Lapisan ini base membuat sumber daya bersama seperti jaringan, identitas, dan pemantauan. Lapisan app membuat sumber daya khusus aplikasi (seperti lingkungan Aplikasi Kontainer dan aplikasi kontainer) yang mereferensikan sumber daya dasar.

Selama pengembangan, Anda dapat memprovisikan lapisan dasar sekali dan melakukan iterasi pada lapisan aplikasi:

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

Contoh: Penyedia IaC campuran

Setiap lapisan dapat menggunakan penyedia IaC yang berbeda. Misalnya, Anda dapat menggunakan Bicep untuk jaringan dan Terraform untuk lapisan aplikasi:

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

Penyedia bawaan non-Bicep (Terraform, Pulumi, ARM, dan penyedia pengujian) tidak transparan bagi inferensi dependensi, karena azd tidak dapat menganalisis inputnya untuk mendeteksi referensi ke lapisan lain. Gunakan properti eksplisit dependsOn setiap kali urutan di antara lapisan-lapisan tersebut, atau di antara lapisan-lapisan tersebut dan lapisan lainnya, penting:

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

Pertimbangan dan keterbatasan

  • Saat Anda menyediakan semua lapisan, azd memprosesnya satu per satu berdasarkan dependensinya. Untuk lapisan Bicep dan penyedia kustom atau ekstensi, azd menentukan dependensi dari variabel lingkungan dan referensi output lapisan dalam file *.bicepparam dan *.parameters.json. Lapisan tanpa dependensi yang disimpulkan atau dinyatakan berjalan dalam urutan yang Anda tentukan.
  • Penyedia non-Bicep bawaan (Terraform, Pulumi, ARM, dan penyedia pengujian) tidak transparan untuk inferensi dependensi. Gunakan properti eksplisit dependsOn jika urutan yang melibatkan lapisan tersebut penting.
  • Pernyataan eksplisit dependsOn juga diperlukan saat urutan penting tetapi azd tidak dapat menyimpulkan dependensi dari referensi parameter. Misalnya, gunakan dependsOn ketika kait satu lapisan postprovision menghasilkan nilai yang digunakan lapisan lain, karena nilai yang dihasilkan kait tidak muncul sebagai referensi output dalam *.bicepparam atau *.parameters.json file.
  • Saat Anda membongkar semua lapisan, azd memprosesnya dalam urutan kebalikan dari urutan provisi.
    • Jika beberapa lapisan menyebarkan sumber daya ke dalam grup sumber daya Azure yang sama dan Anda menggunakan perilaku penghapusan berbasis grup sumber daya default, sumber daya bersama dapat dihapus saat menjalankan azd down.
    • Untuk memungkinkan pelacakan dan penghapusan setiap lapisan infrastruktur secara independen, aktifkan stack deployment dengan menjalankan perintah azd config set alpha.deployment.stacks on.
  • Anda tidak dapat menggunakan --preview bendera saat menyediakan beberapa lapisan sekaligus. Tentukan nama <layer> untuk menggunakan mode pratinjau.
  • Lapisan beroperasi secara independen dalam hal IaC. Untuk mereferensikan output dari satu lapisan di lapisan lain, gunakan variabel lingkungan yang azd diatur setelah setiap penyebaran lapisan. Mereferensikan variabel lingkungan tersebut dari *.bicepparam file atau *.parameters.json juga memungkinkan azd menyimpulkan pengurutan di antara lapisan.
  • Semua fitur provisi standar azd (penyimpanan sementara status penyebaran, hook, parameter, Bicep, atau Terraform) berfungsi di setiap lapisan secara individu.
    • Kait tingkat perintah (misalnya, , preprovisionpostprovision) dipanggil sekali per lapisan. Ketika beberapa lapisan didefinisikan, kait dijalankan untuk setiap lapisan sesuai dengan urutan pemrosesan lapisan tersebut.

Langkah selanjutnya

referensi skema azure.yaml