이 문서에서는 리소스 속성이 특정 값을 반환할 때까지 Bicep 및 배포 스크립트를 사용하여 배포를 일시 중지하는 방법을 설명합니다. 이 기술을 사용하여 배포된 리소스가 준비되었음을 Azure Resource Manager 보고하지만 기본 리소스는 그렇지 않은 경우 배포가 성공하도록 할 수 있습니다. 이 경우 배포된 리소스는 아직 나머지 배포와 상호 작용할 준비가 되지 않았으므로 일시 중지가 필요합니다.
이 문서에서는 Azure Virtual WAN 시나리오를 사용하여 기술을 보여 줍니다. 다음 파일에는 리소스 검사 및 일시 중지 구현이 포함됩니다.
배포에 맞게 파일을 조정할 수 있습니다. 이를 돕기 위해 azResourceStateCheck.bicep 모듈이 매개 변수화됩니다. 이 dependsOn 속성은 orchestration.bicep에서 사용되어 vwanvhcs.bicep 모듈 배포가 azResourceStateCheck.bicep 모듈 배포에 따라 달라지도록 합니다.
Architecture
이 아키텍처의 Visio 파일을 다운로드하십시오.
이 아키텍처에 대한 GitHub의 코드 샘플을 검토하고 다운로드합니다.
배포를 위해 구독 범위에서 Resource Manager에 orchestration.bicep 파일을 제출하십시오.
Note
이 Bicep 파일과 이 예제에 사용되는 다른 파일은 infra/samples/deployment-scripts-property-check 디렉터리 가져올 수 있습니다. 리포지토리에 있는 파일의 부분 구성이 아키텍처 다이어그램의 오른쪽에 나타납니다.
orchestration.bicep 파일은 구독 범위에서 리소스 그룹을 만듭니다.
orchestration.bicep 파일은 Virtual WAN 및 스포크 가상 네트워크를 배포합니다.
orchestration.bicep은 리소스 그룹 범위에서 Virtual WAN 배포하는 vwan.bicep 모듈을 배포합니다.
orchestration.bicep은 리소스 그룹 범위에서 가상 네트워크를 배포하는 vnet.bicep 모듈을 배포합니다.
Virtual WAN 및 스포크 가상 네트워크는 Bicep 서로 독립적으로 간주하기 때문에 병렬로 배포됩니다. 종속성은 Bicep의 배포 순서를 결정합니다. 의존하는 리소스가 있기 전에 해당 리소스가 먼저 배포됩니다. 명시적 및 암시적 종속성을 포함하여 Bicep의 리소스 종속성에 대한 자세한 내용은 Bicep의 리소스 종속성을 참조하세요.
orchestration.bicep 파일은 리소스 그룹 범위에서 Virtual WAN 허브를 배포하는 vwanhub.bicep 모듈을 배포합니다. 허브는 Virtual WAN 암시적으로 의존합니다. 즉, 허브 배포는 Virtual WAN 배포가 완료된 후에만 발생합니다.
orchestration.bicep 파일은 azResourceStateCheck.bicep 모듈을 배포합니다. 이 모듈은 사용자 할당 관리 ID를 만들고 Azure RBAC(역할 기반 액세스 제어) 읽기 권한자 역할을 리소스 그룹에 할당합니다.
azResourceStateCheck.bicep 모듈은 배포 스크립트 리소스를 배포합니다.
배포 스크립트 리소스는 Resource Manager 인증에 사용자 할당 관리 ID를 사용합니다. 다음으로 리소스는 PowerShell 배포 스크립트 Invoke-AzResourceStateCheck.ps1을 실행합니다. 배포 스크립트에 대한 자세한 내용은 Bicep에서 배포 스크립트 사용을 참조하세요.
스크립트는 Virtual WAN 허브
routingState속성을 폴링하여 값이Provisioned인지 확인합니다.속성 값이 없
Provisioned으면 오케스트레이션.bicep 파일에 설정된 매개 변수로 지정된 기간 동안 스크립트가 일시 중지되고 azResourceStateCheck.bicep 모듈에 전달됩니다. 그런 다음 스크립트는routingState속성 값을 다시 확인합니다.스크립트는 일시 중지 및 검사 주기를 반복합니다. orchestration.bicep 파일의 매개 변수는 최대 반복 수를 결정합니다. 최대 반복 횟수 이후에 속성 값이
Provisioned않으면 스크립트는 예외를 생성하고 종료하므로 Bicep 배포의 나머지가 중지되고 실패합니다.속성 값이
Provisioned면 배포 스크립트가 성공 코드(0)와 함께 종료됩니다.
배포 스크립트가 성공하면 orchestration.bicep 파일은 vwanvhcs.bicep 모듈을 배포하여 스포크 가상 네트워크와 Virtual WAN 허브 간의 연결을 만듭니다.
orchestration.bicep에 있는 vwanvhcs.bicep 모듈의 정의에는
dependsOnvwanvhcs.bicep이 azResourceStateCheck.bicep 모듈의 성공적인 완료에 명시적으로 의존하게 하는 절이 있습니다. 따라서routingState속성이Provisioned인 경우에만 연결이 생성됩니다.단일 Virtual WAN 허브에 대해 병렬 배포가 지원되지 않으므로 vwanvhcs.bicep 모듈은 병렬이 아닌 순차적으로 Virtual WAN 허브 연결을 배포합니다. 일괄 처리 크기를
1설정하기 위해 모듈은 BicepbatchSize데코레이터@batchSize(1)사용합니다. 이 데코레이터는 연결이 한 번에 하나씩 배포되도록 합니다.
시나리오 세부 정보
이 아키텍처의 핵심 부분은 배포 스크립트 리소스를 배포하는 azResourceStateCheck.bicep 모듈과 PowerShell 파일인 Invoke-AzResourceStateCheck.ps1연결된 배포 스크립트입니다. 이 모듈은 배포 스크립트를 사용하여 리소스 속성의 값을 확인합니다. 이 예제에서 리소스는 Virtual WAN 허브입니다.
이 환경은 Bicep 모듈을 사용하는 단일 파일에서 배포되므로 dependsOn 사용하여 한 모듈이 다른 모듈에 명시적으로 의존하도록 할 수 있습니다. 이 예제에서는 dependsOn에 표시된 대로, vwanvhcs.bicep 모듈이 azResourceStateCheck.bicep 모듈에 의존하게 설정합니다.
orchestration.bicep에서 발췌한 다음 내용은 dependsOn 사용 예를 보여줍니다.
@description('The API version of the Azure Resource you need to use to check the state of a property.')
param parAzResourceApiVersion string = '2022-01-01'
@description('The property of the resource that you need to check. This is a property inside the `properties` bag of the resource that's captured from a GET call to the Resource ID.')
param parAzResourcePropertyToCheck string = 'routingState'
@description('The value of the property of the resource that you need to check.')
param parAzResourceDesiredState string = 'Provisioned'
@description('The duration that the deployment script waits between check or polling requests to check the property and its state, if it is not in its desired state. The duration defaults to `30` seconds.')
param parWaitInSecondsBetweenIterations int = 30
module modVWANHub 'modules/vwanHub.bicep' = {
scope: rsg
name: 'deployVWANHub'
params: {
region: region
regionNamePrefix: regionNamePrefix
defaultTags: defaultTags
vwanHubCIDR: vwanHubCIDR
vwanName: modVWAN.outputs.vwanName
}
}
module modVWANHubRouterCheckerDeploymentScript 'modules/azResourceStateCheck.bicep' = {
scope: rsg
name: 'deployVWANHubRouterChecker'
params: {
parLocation: region
parAzResourceId: modVWANHub.outputs.outVwanVHubId
parAzResourceApiVersion: parAzResourceApiVersion
parAzResourcePropertyToCheck: parAzResourcePropertyToCheck
parAzResourceDesiredState: parAzResourceDesiredState
parMaxIterations: parMaxIterations
parWaitInSecondsBetweenIterations: parWaitInSecondsBetweenIterations
}
}
module modVWanVhubVnetConnections 'modules/vwanVhcs.bicep' = {
dependsOn: [
modVWANHubRouterCheckerDeploymentScript
]
scope: rsg
name: 'deployConnectVnetsToVWANVHub'
params: {
vnets: vnets
regionNamePrefix: regionNamePrefix
}
}
배포된 Virtual WAN 허브는 routingState 속성 값이 Provisioned 때까지 사용할 준비가 되지 않았기 때문에 리소스 검사가 필요합니다. Virtual WAN 허브는 배포 엔진이 배포를 계속하도록 Resource Manager 성공적인 배포를 보고합니다. Virtual WAN 허브 라우터가 생성된 허브에 프로비전된 후 새 Virtual WAN 허브가 작동합니다. 이 프로세스는 약 15분이 걸립니다. 이 동작은 새 Virtual WAN 허브의 다음 스크린샷에서 볼 수 있습니다. 스크린샷은 허브 상태 Succeeded 와 라우팅 상태를 Provisioning보여 줍니다.
routingState 값이 Provisioned이 되기 전에 vwanvhcs.bicep 모듈을 배포하려고 하면 연결 생성에 실패하고 전체 배포가 실패하게 됩니다. 라우터가 프로비전될 때까지 재배포 시도도 실패합니다.
다음 스크린샷은 Virtual WAN 허브를 routingState 검사하는 동안 배포 스크립트 로그의 예를 보여 줍니다. 로그는 Provisioned이(가) 아닌 다른 값을 반환하는 속성에 대한 반복적인 검사를 보여줍니다.
다음 스크린샷은 값이 Provisioned로 변경되었음을 보여줍니다.
최대 반복 횟수 이후에도 값이 Provisioned로 변경되지 않으면, 스크립트에서 예외를 발생시켜 스크립트 리소스 실패를 리소스 관리자에게 알리게 됩니다. Resource Manager 배포 엔진이 실패하고 배포를 중지합니다. 예외는 문제 해결이 필요한 Azure 리소스에 문제가 있음을 시사하기 때문입니다. 자세한 내용은 다음 Invoke-AzResourceStateCheck.ps1 스크립트를 참조하세요.
[CmdletBinding()]
param (
[string]
$azResourceResourceId,
[string]
$apiVersion = "2022-05-01",
[string]
$azResourcePropertyToCheck = "provisioningState",
[string]
$azResourceDesiredState = "Provisioned",
[int]
$waitInSecondsBetweenIterations = 30,
[int]
$maxIterations = 30
)
$totalTimeoutCalculation = $waitInSecondsBetweenIterations * $maxIterations
$azResourcePropertyExistenceCheck = Invoke-AzRestMethod -Method GET -Path "$($azResourceResourceId)?api-version=$($apiVersion)"
if ($azResourcePropertyExistenceCheck.StatusCode -ne "200") {
$DeploymentScriptOutputs["azResourcePropertyState"] = "Not Found"
throw "Unable to get Azure Resource - $($azResourceResourceId). Likely it doesn't exist. Status code: $($azResourcePropertyExistenceCheck.StatusCode) Error: $($azResourcePropertyExistenceCheck.Content)"
}
$azResourcePropertyStateResult = "Unknown"
$iterationCount = 0
do {
$azResourcePropertyStateGet = Invoke-AzRestMethod -Method GET -Path "$($azResourceResourceId)?api-version=$($apiVersion)"
$azResourcePropertyStateJsonConverted = $azResourcePropertyStateGet.Content | ConvertFrom-Json -Depth 10
$azResourcePropertyStateResult = $azResourcePropertyStateJsonConverted.properties.$($azResourcePropertyToCheck)
if ($azResourcePropertyStateResult -ne $azResourceDesiredState) {
Write-Host "Azure Resource Property ($($azResourcePropertyToCheck)) is not in $($azResourceDesiredState) state. Waiting $($waitInSecondsBetweenIterations) seconds before checking again. Iteration count: $($iterationCount)"
Start-Sleep -Seconds $waitInSecondsBetweenIterations
$iterationCount++
}
} while (
$azResourcePropertyStateResult -ne $azResourceDesiredState -and $iterationCount -ne $maxIterations
)
if ($azResourcePropertyStateResult -eq $azResourceDesiredState) {
Write-Host "Azure Resource Property ($($azResourcePropertyToCheck)) is now in $($azResourceDesiredState) state."
$DeploymentScriptOutputs["azResourcePropertyState"] = "$($azResourceDesiredState)"
}
if ($iterationCount -eq $maxIterations -and $azResourcePropertyStateResult -ne $azResourceDesiredState) {
$DeploymentScriptOutputs["azResourcePropertyState"] = "Azure Resource Property ($($azResourcePropertyToCheck)) is still not in desired state of $($azResourceDesiredState). Timeout reached of $($totalTimeoutCalculation) seconds."
throw "Azure Resource Property ($($azResourcePropertyToCheck)) is still not in $($azResourceDesiredState) state after $($totalTimeoutCalculation) seconds."
}
Contributors
Microsoft는 이 문서를 유지 관리합니다. 이 문서를 작성한 기여자는 다음과 같습니다.
대표 저자:
- Jack Tracey | 선임 클라우드 솔루션 설계자
기타 기여자:
- 게리 맥마흔 | 선임 클라우드 솔루션 설계자
LinkedIn 비공개 프로필을 보려면, LinkedIn에 로그인하세요.
다음 단계
- Azure/CAE-Bits 리포지토리의 예제에 대한 파일
- Bicep에서 배포 스크립트 사용
- 학습 모듈: 배포 스크립트를 사용하여 Bicep 및 ARM 템플릿 확장
- 예외에 대해 알고 싶었던 모든 것
- Virtual WAN으로 마이그레이션
- Bicep의 리소스 종속성
- Bicep 설명서