종속성을 지정하여 배포 순서 제어
다른 리소스가 이미 배포된 경우에만 Azure에 리소스 집합을 배포하려는 경우를 가정해 보겠습니다. 그러면 템플릿에서 한 리소스가 다른 리소스에 종속된다는 것을 표현해야 합니다.
고려해야 할 사항은 다음과 같습니다.
특정 항목이 존재해야 다른 항목을 배포할 수 있습니다.
VM(가상 머신)에서 로드해야 하는 비밀을 가져오기 위해 Azure Key Vault에 키 자격 증명 모음이 필요한 경우를 예로 들겠습니다. 해당 키 자격 증명 모음을 배포하는 경우 동일한 템플릿에서 해당 비밀을 동시에 배포할 수 있습니다. 그러나 키 자격 증명 모음을 비밀보다 먼저 배포해야 합니다. 따라서 비밀은 키 자격 증명 모음 존재에 ‘따라 다릅니다’. 이 종속성으로 인해 키 자격 증명 모음 및 비밀은 키 자격 증명 모음부터 시작하여 하나씩 순차적으로 배포됩니다.
Azure Resource Manager가 작동하는 방식을 신뢰할 수 있나요?
다른 리소스가 존재하는지 확인할 때 Azure PowerShell 또는 Azure CLI를 사용하여 리소스 존재 여부를 확인하는 방법을 먼저 생각할 수 있을 것입니다. 보다 자동화된 솔루션은 Resource Manager의 기본 제공 idempotency를 사용하는 것입니다. Resource Manager는 템플릿에 정의된 리소스가 클라우드에 이미 존재하는 것을 확인할 경우 해당 리소스를 다시 배포하지 않습니다. 이 방법이 유효하려면 Resource Manager가 확인을 수행하는 방식을 이해해야 합니다.
참고
기존 리소스 ID가 템플릿에 정의된 것과 일치하는 경우 Azure Resource Manager는 속성을 비교합니다. 속성이 정확하게 일치하는 경우 리소스는 그대로 유지됩니다. 일치하지 않으면 엔진이 변경 작업을 수행하고 리소스를 재배포할 수도 있습니다.
리소스를 다른 리소스 안에 중첩할 수 있습니다.
Azure Resource Manager 템플릿에서 리소스를 다른 리소스 안에 중첩할 수 있습니다. 리소스를 중첩하여 중첩된 리소스와 부모 리소스 간의 관계를 정의합니다.
Azure 리소스 간의 종속성을 정의하려면 어떻게 하나요?
예를 들어 스토리지 계정 등의 리소스가 이 리소스를 필요로 하는 다른 리소스보다 먼저 배포되도록 해야 한다고 가정해 보겠습니다. 종속 스토리지 계정이 있는지 어떻게 확인할 수 있나요?
스토리지 계정이 있는지 확인하기 위해 Azure PowerShell 또는 Azure CLI 명령을 실행하여 배포의 현재 상태를 검사하는 것으로 시작할 수 있습니다. 동일한 검사를 수행할 수 있는 Resource Manager 구문이 있는지 확인할 수도 있습니다.
Resource Manager 템플릿에는 dependsOn
이라는 구문이 있습니다. 이 구문을 사용하면 가리킨 리소스의 배포가 완료될 때까지 리소스가 대기합니다.
dependsOn 구문이란?
리소스 간의 배포 순서를 정의하는 데 사용할 수 있는 키-값 쌍입니다. 어떤 항목이 다른 항목보다 먼저 존재하는지 확인해야 하는 경우가 있습니다. 예를 들어 앱 이전에 데이터베이스가 존재해야 하거나 키 자격 증명 모음 이전에 비밀 리소스가 존재해야 할 수도 있습니다.
먼저 배포되어야 하는 리소스에 종속되는 다른 리소스에 dependsOn
구문을 배치합니다. 리소스는 둘 이상의 리소스에 종속될 수 있으므로 이 구문은 종속 리소스의 목록을 해당 값으로 예상합니다.
다음 예제는 ARM 템플릿에서 이러한 종속성을 JSON으로 표현할 수 있는 방법을 보여 줍니다.
"resources": [
{
"name": "<name of resource that needs to exist first>"
},
{
"name": "someResource",
"dependsOn": [
"<name of resource that needs to exist first>"
]
}
]
이 예제에서는 리소스 이름을 사용하여 종속 리소스를 지정하고 있습니다. 그러나 여러 리소스가 동일한 이름을 가질 수도 있습니다. 이러한 비교에서 원하는 결과를 얻으려면 대신 resourceId()
구문을 사용하여 고유한 리소스 식별자를 가져올 수 있습니다.
"dependsOn": [
"resourceId('Microsoft.Network/loadBalancers', variables('nameOfLoadBalancer')))"
]
위의 JSON 코드는 네임스페이스, 형식 및 변수 이름을 결합하여 고유 ID를 생성합니다. 이러한 방식으로 올바른 종속 리소스가 지정되었는지 확인할 수 있습니다.
자식 리소스란?
자식 리소스는 다른 리소스의 컨텍스트 내에만 존재하는 리소스입니다. 예를 들면 가상 머신 없이는 가상 머신 확장을 사용할 수 없습니다.
템플릿에서 부모-자식 관계에 대한 일반적인 코드는 다음과 같습니다.
"resources": [
{
"name": "parent-resource",
"resources": [{
"name": "child-resource"
}]
}
]
이 부모-자식 종속성은 부모가 자식보다 먼저 배포되는 종속성을 자동으로 만들지 않습니다. 종속성을 명시적으로 설정해야 합니다.
따라서 이러한 관계를 표현할 때 다음과 같이 dependsOn
구문을 추가해야 합니다.
"resources": [
{
"name": "parent-resource",
"resources": [{
"dependsOn": ["parent-resource"],
"name": "child resource"
}]
}
]