Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'interfaccia della riga di comando per sviluppatori di Azure (azd) supporta il provisioning a più livelli, che è possibile usare per definire più livelli di provisioning nel azure.yaml file. Ogni livello punta al proprio set di modelli IaC (Infrastructure as Code). La CLI esegue il provisioning dei livelli uno alla volta, seguendo l'ordine determinato dalle dipendenze tra di essi. È anche possibile configurare o rimuovere singoli livelli in modo indipendente.
Questa funzionalità risolve scenari di dipendenza complessi in cui le risorse in un livello dipendono dalle risorse di un altro livello. Invece di combinare IaC con script hook imperativi, il provisioning a più livelli mantiene tutto dichiarativo.
Annotazioni
Il provisioning a più livelli è attualmente una funzionalità beta. Altre informazioni sulla strategia di controllo delle versioni.
Quando usare il provisioning a più livelli
Utilizza il provisioning a più livelli quando una singola azd provision distribuzione non può soddisfare tutte le esigenze dell'infrastruttura in un unico passaggio. È consigliabile usare il provisioning a più livelli quando:
- Dipendenze circolari: alcune risorse devono fare riferimento ad altre risorse che devono essere create per prime, ad esempio una rete virtuale che deve esistere prima di poter configurare un endpoint privato.
- L'infrastruttura di base è diversa dall'infrastruttura dell'applicazione: è possibile gestire le risorse di rete, sicurezza o identità condivise separatamente dalle risorse per ogni applicazione.
- È necessaria la gestione indipendente del ciclo di vita: si aggiornano e si eliminano componenti dell'infrastruttura diversi in momenti diversi. Ad esempio, un livello di rete potrebbe essere di lunga durata, mentre un livello applicazione viene ridistribuito di frequente.
- Progetti Monorepo con gruppi di infrastruttura distinti: un singolo repository contiene più servizi indipendenti (ad esempio un hub eventi, un'app contenitore e un'app per le funzioni), ognuno con i propri modelli di infrastruttura.
Configurare i livelli in azure.yaml
Definire i livelli nella infra sezione del azure.yaml file. Ogni livello richiede un name e un path puntatore alla directory che contiene i modelli IaC per tale livello.
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
- name: application
path: ./infra/application
services:
api:
project: ./src/api
language: js
host: containerapp
Importante
Ordine di elaborazione dei livelli:azd provision elabora i livelli in base alle relative dipendenze. Per i layer Bicep e i provider personalizzati o di estensione, azd deduce automaticamente le dipendenze analizzando i file di parametri (*.bicepparam e *.parameters.json) alla ricerca di riferimenti a variabili di ambiente e output dei layer, e li ordina di conseguenza invece di seguire rigorosamente l'ordine indicato in azure.yaml. I livelli che non hanno dipendenze inferite o dichiarate vengono eseguiti nell'ordine in cui sono elencati.
azd down segue l'ordine inverso corrispondente, quindi i livelli dipendenti vengono rimossi prima che i livelli da cui dipendono. Usare la dependsOn proprietà per dichiarare l'ordinamento che azd non può dedurre.
Proprietà livello
Ogni livello supporta le proprietà seguenti:
| Proprietà | Obbligatorio | Descrzione |
|---|---|---|
name |
Sì | Nome univoco per il livello. Usare questo nome quando si prende di mira un livello specifico con i comandi. |
path |
Sì | Il percorso relativo alla directory contenente i template IaC per questo livello. |
module |
NO | Il nome del modulo nella directory del livello. Il valore predefinito è main. |
provider |
NO | Provider IaC per questo livello (bicep o terraform). Eredita dalla radice infra.provider se non viene specificata. |
dependsOn |
NO | Nomi di altri livelli da cui dipende questo livello. Usare questa proprietà quando l'ordinamento è importante, ma azd non può dedurre la dipendenza dai riferimenti ai parametri. |
Importante
Quando si definisce infra.layers, non è possibile dichiarare altre proprietà nella infra sezione (path, module, deploymentStacks) a livello radice. È necessario specificare tutte le configurazioni dell'infrastruttura all'interno di ogni livello.
Struttura di directory
Un progetto tipico che usa il provisioning a più livelli potrebbe avere la struttura di directory seguente:
my-app/
├── azure.yaml
├── infra/
│ ├── networking/
│ │ └── main.bicep
│ └── application/
│ └── main.bicep
└── src/
└── api/
└── ...
Ogni directory di livello contiene il proprio set completo di modelli IaC, proprio come farebbe la directory di azd un progetto standardinfra.
Eseguire la configurazione e gestire i livelli
È possibile effettuare il provisioning di tutti i livelli contemporaneamente o specificare un livello specifico in base al nome. Le sezioni seguenti descrivono i comandi comuni per il provisioning, la disinstallazione e l'aggiornamento dello stato del livello.
Effettuare il provisioning di tutti i livelli
Eseguire azd provision senza argomenti per effettuare il provisioning di tutti i livelli:
azd provision
azd elabora ogni livello uno alla volta, assicurandosi che un livello venga completato prima dell'inizio di qualsiasi livello che dipende da esso. Per i layer Bicep e i provider personalizzati o di estensione, azd deduce automaticamente le dipendenze dai riferimenti alle variabili di ambiente e all'output dei layer nei file *.bicepparam e *.parameters.json, pertanto l'ordine di esecuzione può differire dall'ordine elencato in azure.yaml. I livelli senza dipendenze inferite o dichiarate vengono elaborati nell'ordine elencato. Questo processo garantisce che le risorse dipendenti esistano prima che i livelli che vi facciano riferimento vengano distribuiti.
Eseguire il provisioning di un livello specifico
Per effettuare il provisioning solo di un livello specifico, passare il nome del livello come argomento:
azd provision networking
Questo comando distribuisce solo le risorse definite nel networking livello. La configurazione di un livello specifico è utile quando:
- Stai iterando su un singolo layer durante lo sviluppo.
- È necessario aggiornare un livello senza ridistribuire altri.
- Si sta configurando un nuovo livello sopra l'infrastruttura esistente.
Smontare tutti i livelli
Eseguire azd down senza argomenti per eliminare le risorse da tutti i livelli. Quando esistono più livelli, azd li elabora inverso dell'ordine di provisioning, quindi le risorse dipendenti vengono rimosse prima delle risorse di base da cui dipendono:
azd down
Smontare un livello specifico
Per rimuovere solo un livello specifico, passare il nome del livello come argomento:
azd down application
Questo comando rimuove solo le risorse distribuite dal application livello, lasciando intatti gli altri livelli.
Aggiornare lo stato dell'ambiente
È possibile aggiornare lo stato dell'ambiente da un livello specifico usando il --layer flag con azd env refresh:
azd env refresh --layer networking
Questo comando aggiorna le variabili di ambiente e gli output in base alla distribuzione più recente del livello specificato.
Esempio: Monorepo con più servizi
L'esempio seguente illustra il provisioning a più livelli per un monorepo che contiene un hub eventi, un'app contenitore che esegue più contenitori e un'app per le funzioni di 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}
Struttura di directory corrispondente:
logging-app/
├── azure.yaml
├── infra/
│ ├── eventhub/
│ │ └── main.bicep
│ ├── aca/
│ │ └── main.bicep
│ └── functionapp/
│ └── main.bicep
└── src/
└── function/
└── functionapp.csproj
Con questa configurazione è possibile:
- Effettuare il provisioning solo dell'infrastruttura di Hub eventi:
azd provision eventhub - Eseguire il provisioning solo dell'infrastruttura dell'applicazione contenitore:
azd provision aca - Configurare tutti gli elementi nell'ordine corretto:
azd provision - Rimuovere solo il livello Function App:
azd down functionapp
Esempio: Livelli di base e applicazione
Un modello comune separa l'infrastruttura condivisa o di base dall'infrastruttura per applicazione:
name: my-app
infra:
layers:
- name: base
path: ./infra/base
- name: app
path: ./infra/app
services:
web:
project: ./src/web
language: js
host: containerapp
Il base livello crea risorse condivise come rete, identità e monitoraggio. Il app livello crea le risorse specifiche dell'applicazione, ad esempio un ambiente dell'app contenitore e le app contenitore, che fanno riferimento alle risorse di base.
Durante lo sviluppo, è possibile effettuare il provisioning del livello di base una sola volta ed eseguire l'iterazione sul livello dell'applicazione:
azd provision base
azd provision app
azd provision app # re-provision only the app layer after changes
Esempio: Provider IaC misti
Ogni livello può usare un provider IaC diverso. Ad esempio, è possibile usare Bicep per la rete e Terraform per il livello dell'applicazione:
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
provider: bicep
- name: application
path: ./infra/application
provider: terraform
I provider non Bicep predefiniti (Terraform, Pulumi, ARM e il provider di test) non sono trasparenti all'inferenza delle dipendenze, perché azd non può analizzare i relativi input alla ricerca di riferimenti ad altri livelli. Usare una proprietà esplicita dependsOn ogni volta che si ordinano tra tali livelli o tra tali livelli e altri livelli, è importante:
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
provider: bicep
- name: application
path: ./infra/application
provider: terraform
dependsOn:
- networking
Considerazioni e limitazioni
- Quando si effettua il provisioning di tutti i livelli,
azdli elabora uno alla volta in base alle relative dipendenze. Per i layer Bicep e i provider personalizzati o di estensione,azddeduce automaticamente le dipendenze dai riferimenti alle variabili di ambiente e agli output dei layer nei file*.bicepparame*.parameters.json. I livelli senza dipendenze dedotti o dichiarati vengono eseguiti nell'ordine definito. - I provider integrati diversi da Bicep (Terraform, Pulumi, ARM e il provider di test) sono opachi ai fini dell'inferenza delle dipendenze. Usare una proprietà esplicita
dependsOnquando si ordinano tali livelli è importante. - L'esplicito
dependsOnè necessario anche quando l'ordine è importante, maazdnon può desumere la dipendenza dai riferimenti ai parametri. Ad esempio, usaredependsOnquando l'hook dipostprovisionun livello produce un valore utilizzato da un altro livello, perché i valori prodotti da hook non vengono visualizzati come riferimenti di output in*.bicepparamo*.parameters.jsonfile. - Quando si eliminano tutti i livelli,
azdli elabora nell'ordine inverso dell'ordine di provisioning.- Se più livelli distribuiscono le risorse nello stesso gruppo di risorse di Azure e si usa il comportamento di eliminazione predefinito basato su gruppo di risorse, le risorse condivise possono essere eliminate durante l'esecuzione di azd down.
- Per consentire il rilevamento indipendente e l'eliminazione dell'infrastruttura a più livelli, abilitare gli stack di distribuzione eseguendo il comando
azd config set alpha.deployment.stacks on.
- Non è possibile usare il flag durante il
--previewprovisioning di più livelli contemporaneamente. Specificare un<layer>nome per usare la modalità di anteprima. - I livelli operano in modo indipendente in termini di IaC. Per fare riferimento agli output di un livello in un altro livello, usare le variabili di ambiente che
azdimpostano dopo la distribuzione di ogni livello. Fare riferimento a tali variabili di ambiente in un file*.bicepparamo*.parameters.jsonconsente inoltre aazddi determinare l'ordinamento tra i livelli. - Tutte le funzionalità di provisioning standard
azd(memorizzazione nella cache dello stato della distribuzione, hook, parametri, Bicep o Terraform) funzionano all'interno di ogni singolo livello.- Gli hook a livello di comando ( ad esempio
preprovision, )postprovisionvengono richiamati una volta per ogni livello. Quando vengono definiti più livelli, gli hook vengono eseguiti per ciascun livello nell'ordine in cui i livelli vengono elaborati.
- Gli hook a livello di comando ( ad esempio