Azure 개발자 CLI(azd)는 파일에서 여러 프로비저닝 계층을 정의하는 데 사용할 수 있는 azure.yaml 계층화된 프로비저닝을 지원합니다. 각 계층은 자체 IaC(Infrastructure as Code) 템플릿 집합을 가리킵니다. CLI는 계층을 정의하는 순서대로 순차적으로 프로비전합니다. 개별 계층을 독립적으로 프로비전하거나 분해할 수도 있습니다.
이 기능은 한 계층의 리소스가 다른 계층의 리소스에 의존하는 복잡한 종속성 시나리오를 해결합니다. IaC를 명령적 후크 스크립트와 혼합하는 대신 계층화된 프로비전은 모든 것을 선언적으로 유지합니다.
비고
계층화된 프로비전은 현재 베타 기능입니다. 버전 관리 전략에 대해 자세히 알아봅니다.
계층화된 프로비저닝을 사용하는 경우
단일 azd provision 배포가 한 단계에서 인프라 요구 사항을 모두 처리할 수 없는 경우 계층화된 프로비저닝을 사용합니다. 다음과 같은 경우 계층화된 프로비저닝을 사용하는 것이 좋습니다.
- 순환 종속성: 일부 리소스는 프라이빗 엔드포인트를 구성하기 전에 존재해야 하는 가상 네트워크와 같이 먼저 만들어야 하는 다른 리소스를 참조해야 합니다.
- 기본 인프라는 애플리케이션 인프라와 다릅니다. 공유 네트워킹, 보안 또는 ID 리소스를 애플리케이션별 리소스와 별도로 관리합니다.
- 독립적인 수명 주기 관리가 필요합니다. 다른 시간에 다른 인프라 구성 요소를 업데이트하고 분해합니다. 예를 들어 네트워킹 계층은 수명이 길지만 애플리케이션 계층은 자주 다시 배포됩니다.
- 고유한 인프라 그룹이 있는 Monorepo 프로젝트: 단일 리포지토리에는 각각 자체 인프라 템플릿이 있는 여러 독립 서비스(예: 이벤트 허브, 컨테이너 앱 및 함수 앱)가 포함됩니다.
azure.yaml에서 계층 구성
infra 섹션의 azure.yaml 파일에서 레이어를 정의합니다. 각 계층에는 해당 계층의 IaC 템플릿이 포함된 디렉터리를 가리키는 name와 path가 필요합니다.
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
- name: application
path: ./infra/application
services:
api:
project: ./src/api
language: js
host: containerapp
중요합니다
계층 처리 순서:azd provision 는 나열된 순서대로 계층을 위에서 아래로 처리합니다 azure.yaml.
azd down 는 레이어를 역순 으로 처리합니다(아래에서 위로). 계층을 정의하여 기본 리소스가 먼저 표시되고 그 다음에는 계층에 의존하는 계층이 표시됩니다. 이 순서를 사용하면 필요한 리소스 앞에 종속성을 만들고 해당 리소스 다음에 종속성을 제거할 수 있습니다.
계층 속성
각 계층은 다음 속성을 지원합니다.
| 재산 | 필수 | Description |
|---|---|---|
name |
예 | 레이어의 고유한 이름입니다. 명령을 사용하여 특정 계층을 대상으로 지정할 때 이 이름을 사용합니다. |
path |
예 | 이 계층에 대한 IaC 템플릿을 포함하는 디렉터리의 상대 경로입니다. |
module |
아니오 | 레이어 디렉터리 내의 모듈 이름입니다. 기본값은 main입니다. |
provider |
아니오 | 이 계층(bicep 또는 terraform)에 대한 IaC 공급자입니다. 루트를 지정하지 않으면 루트 infra.provider로부터 상속됩니다. |
중요합니다
정의infra.layers할 때는 루트 수준에서 섹션(infra, path, module, deploymentStacks)에 다른 속성을 선언할 수 없습니다. 각 계층 내에서 모든 인프라 구성을 지정해야 합니다.
디렉터리 구조
계층화된 프로비저닝을 사용하는 일반적인 프로젝트에는 다음과 같은 디렉터리 구조가 있을 수 있습니다.
my-app/
├── azure.yaml
├── infra/
│ ├── networking/
│ │ └── main.bicep
│ └── application/
│ └── main.bicep
└── src/
└── api/
└── ...
각 레이어 디렉터리에는 표준 azd 프로젝트의 infra 디렉터리처럼 고유한 전체 IaC 템플릿 집합이 포함되어 있습니다.
계층 프로비전 및 관리
모든 계층을 한 번에 프로비전하거나 이름으로 특정 계층을 대상으로 지정할 수 있습니다. 다음 섹션에서는 계층 상태를 프로비전, 중단 및 새로 고치는 일반적인 명령에 대해 설명합니다.
모든 계층 프로비저닝 수행
인수 없이 실행 azd provision 하여 다음과 같이 정의된 순서대로 모든 레이어를 순차적으로 프로비전합니다.azure.yaml
azd provision
azd 는 각 계층을 한 번에 하나씩 처리하여 두 번째 계층이 시작되기 전에 첫 번째 계층이 완료되도록 합니다. 이 프로세스는 해당 리소스를 참조하는 계층이 배포되기 전에 종속 리소스가 존재할 수 있도록 보장합니다.
특정 계층 프로비전
특정 계층만 프로비전하려면 레이어 이름을 인수로 전달합니다.
azd provision networking
이 명령은 계층에 정의된 리소스만 배포합니다 networking . 특정 계층 프로비전은 다음과 같은 경우에 유용합니다.
- 개발 중에 단일 계층에서 반복적으로 수정합니다.
- 다른 계층을 다시 배포하지 않고 한 계층을 업데이트해야 합니다.
- 기존 인프라를 기반으로 새 계층을 설정하고 있습니다.
모든 계층 분해
인수 없이 실행 azd down 하여 모든 계층에서 리소스를 제거합니다. 여러 계층이 있는 azd 경우 역순으로 처리하므로 종속 리소스가 종속된 기본 리소스 앞에 제거됩니다.
azd down
특정 계층 분해
특정 계층만 분해하려면 레이어 이름을 인수로 전달합니다.
azd down application
이 명령은 계층에 의해 application 배포된 리소스만 제거하고 다른 계층은 그대로 둡니다.
환경 상태 새로 고침
다음과 같은 --layer플래그를 사용하여 azd env refresh 특정 계층에서 환경 상태를 새로 고칠 수 있습니다.
azd env refresh --layer networking
이 명령은 지정된 계층의 최신 배포에 따라 환경 변수 및 출력을 업데이트합니다.
예: 여러 서비스가 있는 Monorepo
다음 예제에서는 이벤트 허브, 여러 컨테이너를 실행하는 컨테이너 앱 및 Azure Function App을 포함하는 monorepo에 대한 계층화된 프로비저닝을 보여 줍니다.
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}
해당 디렉터리 구조:
logging-app/
├── azure.yaml
├── infra/
│ ├── eventhub/
│ │ └── main.bicep
│ ├── aca/
│ │ └── main.bicep
│ └── functionapp/
│ └── main.bicep
└── src/
└── function/
└── functionapp.csproj
이 구성을 사용하면 다음을 수행할 수 있습니다.
- Event Hub 인프라만 프로비전합니다.
azd provision eventhub - 컨테이너 앱 인프라만 프로비전합니다.
azd provision aca - 모든 항목을 순서대로 프로비전합니다.
azd provision - 함수 앱 계층만 분해합니다.
azd down functionapp
예: 기본 및 애플리케이션 계층
일반적인 패턴은 공유 또는 기본 인프라를 애플리케이션별 인프라와 분리합니다.
name: my-app
infra:
layers:
- name: base
path: ./infra/base
- name: app
path: ./infra/app
services:
web:
project: ./src/web
language: js
host: containerapp
계층은 base 네트워킹, ID 및 모니터링과 같은 공유 리소스를 만듭니다. 계층은 app 기본 리소스를 참조하는 애플리케이션별 리소스(예: 컨테이너 앱 환경 및 컨테이너 앱)를 만듭니다.
개발하는 동안 기본 계층을 한 번 프로비전하고 애플리케이션 계층에서 반복할 수 있습니다.
azd provision base
azd provision app
azd provision app # re-provision only the app layer after changes
예: 혼합 인프라스트럭처 코드(IaC) 공급자
각 계층은 다른 IaC 공급자를 사용할 수 있습니다. 예를 들어 네트워킹에 Bicep을 사용하고 애플리케이션 계층에 Terraform을 사용할 수 있습니다.
name: my-app
infra:
layers:
- name: networking
path: ./infra/networking
provider: bicep
- name: application
path: ./infra/application
provider: terraform
고려사항 및 제한사항
- 모든 계층
azd을 프로비전할 때 정의한 순서대로 순차적으로 처리합니다. 기본 리소스가 먼저 프로비전되도록 레이어 순서를 계획합니다. - 모든 레이어를 분해할 때
azd는 역순서대로 처리합니다.- 여러 계층이 동일한 Azure 리소스 그룹에 리소스를 배포하고 기본 리소스 그룹 기반 삭제 동작을 사용하는 경우 azd를 실행할 때 공유 리소스가 삭제될 수 있습니다.
- 계층화된 인프라의 독립적인 추적 및 삭제를 허용하려면 명령
azd config set alpha.deployment.stacks on배포 스택을 사용하여 배포 스택을 사용하도록 설정하면 azd가 리소스 그룹 삭제에만 의존하는 대신 계층당 리소스를 추적할 수 있습니다.
- 여러 계층을
--preview한 번에 프로비전할 때는 플래그를 사용할 수 없습니다. 미리 보기 모드에서 사용할 이름을 지정하십시오. - 레이어는 IaC 측면에서 독립적으로 작동합니다. 다른 계층의 한 계층에서 출력을 참조하려면 각 계층의 배포 후에 설정하는 환경 변수
azd를 사용합니다. - 모든 표준
azd프로비저닝 기능(배포 상태 캐싱, 후크, 매개 변수, Bicep 또는 Terraform)은 각 개별 계층 내에서 작동합니다.- 명령 수준 후크(예:
preprovision,postprovision)는 계층당 한 번씩 호출됩니다. 여러 레이어가 정의되면 레이어가 처리되는 순서대로 각 레이어에 대해 후크가 실행됩니다.
- 명령 수준 후크(예: