빠른 시작: Bicep으로 템플릿 사양 만들기 및 배포
이 문서의 내용
이 빠른 시작에서는 Bicep 파일로 템플릿 사양 을 만들고 배포하는 방법을 설명합니다. 조직의 사용자가 Microsoft Azure에서 리소스를 배포할 수 있도록 템플릿 사양이 리소스 그룹에 배포됩니다. 템플릿 사양을 사용하면 사용자에게 Bicep 파일을 변경할 수 있는 액세스 권한을 부여하지 않고도 배포 템플릿을 공유할 수 있습니다. 이 템플릿 사양 예제에서는 Bicep 파일을 사용하여 스토리지 계정을 배포합니다.
템플릿 사양을 만들 때 Bicep 파일은 JSON(JavaScript Object Notation)으로 변환됩니다. 템플릿 사양은 JSON을 사용하여 Azure 리소스를 배포합니다. 현재 Microsoft Azure Portal을 사용하여 Bicep 파일을 가져오고 템플릿 사양 리소스를 만들 수 없습니다.
필수 조건
이두박근 파일 만들기
로컬 Bicep 파일에서 템플릿 사양을 만듭니다. 다음 샘플을 복사하여 컴퓨터에 main.bicep 으로 저장합니다. 이 예에서는 C:\templates\main.bicep 경로를 사용합니다. 다른 경로를 사용할 수 있지만 명령을 변경해야 합니다.
다음 Bicep 파일은 PowerShell 및 CLI 탭에서 사용됩니다. Bicep 파일 탭은 Bicep과 JSON을 결합하여 템플릿 사양을 만들고 배포하는 다른 템플릿을 사용합니다.
@allowed([
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
])
@description('Storage account type.')
param storageAccountType string = 'Standard_LRS'
@description('Location for all resources.')
param location string = resourceGroup().location
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
output storageAccountNameOutput string = storageAccount.name
템플릿 사양 만들기
템플릿 사양은 Microsoft.Resources/templateSpecs 라는 리소스 형식입니다. 템플릿 사양을 만들려면 Azure CLI, Azure PowerShell 또는 Bicep 파일을 사용합니다.
이 예에서는 리소스 그룹 이름 templateSpecRG
를 사용합니다. 다른 이름을 사용할 수 있지만 명령을 변경해야 합니다.
템플릿 사양을 포함할 새 리소스 그룹을 만듭니다.
New-AzResourceGroup `
-Name templateSpecRG `
-Location westus2
해당 리소스 그룹에서 템플릿 사양을 만듭니다. 새 템플릿 사양에 storageSpec 라는 이름을 지정합니다.
New-AzTemplateSpec `
-Name storageSpec `
-Version "1.0" `
-ResourceGroupName templateSpecRG `
-Location westus2 `
-TemplateFile "C:\templates\main.bicep"
템플릿 사양을 포함할 새 리소스 그룹을 만듭니다.
az group create \
--name templateSpecRG \
--location westus2
해당 리소스 그룹에서 템플릿 사양을 만듭니다. 새 템플릿 사양에 storageSpec 라는 이름을 지정합니다.
az ts create \
--name storageSpec \
--version "1.0" \
--resource-group templateSpecRG \
--location westus2 \
--template-file "C:\templates\main.bicep"
Bicep 파일로 템플릿 사양을 만들 수 있지만 mainTemplate
은 JSON 형식이어야 합니다. JSON 템플릿은 표준 JSON 구문을 사용하지 않습니다. 예를 들어, 줄 끝 쉼표가 없고 큰 따옴표는 작은 따옴표로 대체되며 백슬래시(\
)는 식 내에서 작은 따옴표를 이스케이프하는 데 사용됩니다.
다음 템플릿을 복사하여 컴퓨터에 main.bicep 으로 저장합니다.
param templateSpecName string = 'storageSpec'
param templateSpecVersionName string = '1.0'
@description('Location for all resources.')
param location string = resourceGroup().location
resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2022-02-01' = {
name: templateSpecName
location: location
}
resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2022-02-01' = {
parent: createTemplateSpec
name: templateSpecVersionName
location: location
properties: {
mainTemplate: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
'contentVersion': '1.0.0.0'
'metadata': {}
'parameters': {
'storageAccountType': {
'type': 'string'
'defaultValue': 'Standard_LRS'
'metadata': {
'description': 'Storage account type.'
}
'allowedValues': [
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
]
}
'location': {
'type': 'string'
'defaultValue': '[resourceGroup().location]'
'metadata': {
'description': 'Location for all resources.'
}
}
}
'variables': {
'storageAccountName': '[format(\'{0}{1}\', \'storage\', uniqueString(resourceGroup().id))]'
}
'resources': [
{
'type': 'Microsoft.Storage/storageAccounts'
'apiVersion': '2023-04-01'
'name': '[variables(\'storageAccountName\')]'
'location': '[parameters(\'location\')]'
'sku': {
'name': '[parameters(\'storageAccountType\')]'
}
'kind': 'StorageV2'
'properties': {}
}
]
'outputs': {
'storageAccountNameOutput': {
'type': 'string'
'value': '[variables(\'storageAccountName\')]'
}
}
}
}
}
Azure PowerShell 또는 Azure CLI를 사용하여 새 리소스 그룹을 만듭니다.
New-AzResourceGroup `
-Name templateSpecRG `
-Location westus2
az group create \
--name templateSpecRG \
--location westus2
해당 리소스 그룹에서 템플릿 사양을 만듭니다. 템플릿 사양 이름 storageSpec 및 버전 번호 1.0
은 Bicep 파일의 매개 변수입니다.
New-AzResourceGroupDeployment `
-ResourceGroupName templateSpecRG `
-TemplateFile "C:\templates\main.bicep"
az deployment group create \
--resource-group templateSpecRG \
--template-file "C:\templates\main.bicep"
템플릿 사양 배포
템플릿 사양을 사용하여 스토리지 계정을 배포합니다. 이 예에서는 리소스 그룹 이름 storageRG
를 사용합니다. 다른 이름을 사용할 수 있지만 명령을 변경해야 합니다.
새 스토리지 계정을 포함하는 리소스 그룹을 만듭니다.
New-AzResourceGroup `
-Name storageRG `
-Location westus2
템플릿 사양의 리소스 ID를 가져옵니다.
$id = (Get-AzTemplateSpec -ResourceGroupName templateSpecRG -Name storageSpec -Version "1.0").Versions.Id
템플릿 사양을 배포합니다.
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG
Bicep 파일 배포와 동일하게 매개 변수를 제공합니다. 스토리지 계정 유형에 대한 매개 변수를 사용하여 템플릿 사양을 다시 배포합니다.
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG `
-storageAccountType Standard_GRS
새 스토리지 계정을 포함하는 리소스 그룹을 만듭니다.
az group create \
--name storageRG \
--location westus2
템플릿 사양의 리소스 ID를 가져옵니다.
id=$(az ts show --name storageSpec --resource-group templateSpecRG --version "1.0" --query "id")
참고 항목
템플릿 사양 ID를 가져와서 Windows PowerShell의 변수에 할당하는 것과 관련된 알려진 문제가 있습니다.
템플릿 사양을 배포합니다.
az deployment group create \
--resource-group storageRG \
--template-spec $id
Bicep 파일 배포와 동일하게 매개 변수를 제공합니다. 스토리지 계정 유형에 대한 매개 변수를 사용하여 템플릿 사양을 다시 배포합니다.
az deployment group create \
--resource-group storageRG \
--template-spec $id \
--parameters storageAccountType="Standard_GRS"
Bicep 파일을 사용하여 템플릿 사양을 배포하려면 모듈을 사용합니다. 모듈은 기존 템플릿 사양에 연결됩니다. 자세한 내용은 템플릿 사양의 파일 을 참조하세요.
다음 Bicep 모듈을 복사하여 컴퓨터에 storage.bicep 으로 저장합니다.
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:1.0' = {
name: 'deployVersion1'
}
모듈에서 <subscriptionId>
를 바꿉니다. Azure PowerShell 또는 Azure CLI를 사용하여 구독 ID를 가져옵니다.
(Get-AzContext).Subscription.Id
az account show --query "id" --output tsv
Azure PowerShell 또는 Azure CLI를 사용하여 스토리지 계정에 대한 새 리소스 그룹을 만듭니다.
New-AzResourceGroup `
-Name storageRG `
-Location westus2
az group create \
--name storageRG \
--location westus2
Azure PowerShell 또는 Azure CLI를 사용하여 템플릿 사양을 배포합니다.
New-AzResourceGroupDeployment `
-ResourceGroupName storageRG `
-TemplateFile "C:\templates\storage.bicep"
az deployment group create \
--resource-group storageRG \
--template-file "C:\templates\storage.bicep"
매개 변수를 추가하고 다른 스토리지 계정 형식으로 템플릿 사양을 다시 배포할 수 있습니다. 샘플을 복사하고 storage.bicep 파일을 바꿉니다. 그런 다음 템플릿 사양 배포를 다시 배포합니다.
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:1.0' = {
name: 'deployVersion1'
params: {
storageAccountType: 'Standard_GRS'
}
}
액세스 허가
조직의 다른 사용자가 템플릿 사양을 배포하도록 하려면 해당 사용자에게 읽기 액세스 권한을 부여해야 합니다. 공유하려는 템플릿 사양이 포함된 리소스 그룹에 대한 Microsoft Entra 그룹에 읽기 권한자 역할을 할당할 수 있습니다. 자세한 내용은 자습서: Azure PowerShell을 사용하여 Azure 리소스에 대한 그룹 액세스 권한 부여 를 참조하세요.
Bicep 파일 업데이트
템플릿 사양이 만들어진 후 Bicep 파일을 업데이트하기로 결정했습니다. PowerShell 또는 CLI 탭의 예를 계속하려면 샘플을 복사하고 main.bicep 파일을 바꿉니다.
매개 변수 storageNamePrefix
는 스토리지 계정 이름에 대한 접두사 값을 지정합니다. storageAccountName
변수는 접두사를 고유 문자열과 연결합니다.
@allowed([
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
])
@description('Storage account type.')
param storageAccountType string = 'Standard_LRS'
@description('Location for all resources.')
param location string = resourceGroup().location
@maxLength(11)
@description('The storage account name prefix.')
param storageNamePrefix string = 'storage'
var storageAccountName = '${toLower(storageNamePrefix)}${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
name: storageAccountName
location: location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
output storageAccountNameOutput string = storageAccount.name
템플릿 사양 버전 업데이트
수정된 템플릿에 대한 새 템플릿 사양을 만드는 대신 기존 템플릿 사양에 2.0
이라는 새 버전을 추가합니다. 사용자는 두 버전 중 하나를 배포하도록 선택할 수 있습니다.
템플릿 사양의 새 버전을 만듭니다.
New-AzTemplateSpec `
-Name storageSpec `
-Version "2.0" `
-ResourceGroupName templateSpecRG `
-Location westus2 `
-TemplateFile "C:\templates\main.bicep"
새 버전을 배포하려면 2.0
버전에 대한 리소스 ID를 가져옵니다.
$id = (Get-AzTemplateSpec -ResourceGroupName templateSpecRG -Name storageSpec -Version "2.0").Versions.Id
새 버전을 배포하고 storageNamePrefix
를 사용하여 스토리지 계정 이름에 대한 접두사를 지정합니다.
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG `
-storageNamePrefix "demo"
템플릿 사양의 새 버전을 만듭니다.
az ts create \
--name storageSpec \
--version "2.0" \
--resource-group templateSpecRG \
--location westus2 \
--template-file "C:\templates\main.bicep"
새 버전을 배포하려면 2.0
버전에 대한 리소스 ID를 가져옵니다.
id=$(az ts show --name storageSpec --resource-group templateSpecRG --version "2.0" --query "id")
새 버전을 배포하고 storageNamePrefix
를 사용하여 스토리지 계정 이름에 대한 접두사를 지정합니다.
az deployment group create \
--resource-group storageRG \
--template-spec $id \
--parameters storageNamePrefix="demo"
템플릿 사양의 새 버전을 만듭니다. 샘플을 복사하고 main.bicep 파일을 바꿉니다.
매개 변수 storageNamePrefix
는 스토리지 계정 이름에 대한 접두사 값을 지정합니다. storageAccountName
변수는 접두사를 고유 문자열과 연결합니다.
param templateSpecName string = 'storageSpec'
param templateSpecVersionName string = '2.0'
@description('Location for all resources.')
param location string = resourceGroup().location
resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2022-02-01' = {
name: templateSpecName
location: location
}
resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2022-02-01' = {
parent: createTemplateSpec
name: templateSpecVersionName
location: location
properties: {
mainTemplate: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
'contentVersion': '1.0.0.0'
'metadata': {}
'parameters': {
'storageAccountType': {
'type': 'string'
'defaultValue': 'Standard_LRS'
'metadata': {
'description': 'Storage account type.'
}
'allowedValues': [
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
]
}
'location': {
'type': 'string'
'defaultValue': '[resourceGroup().location]'
'metadata': {
'description': 'Location for all resources.'
}
}
'storageNamePrefix': {
'type': 'string'
'defaultValue': 'storage'
'metadata': {
'description': 'The storage account name prefix.'
}
'maxLength': 11
}
}
'variables': {
'storageAccountName': '[format(\'{0}{1}\', toLower(parameters(\'storageNamePrefix\')), uniqueString(resourceGroup().id))]'
}
'resources': [
{
'type': 'Microsoft.Storage/storageAccounts'
'apiVersion': '2023-04-01'
'name': '[variables(\'storageAccountName\')]'
'location': '[parameters(\'location\')]'
'sku': {
'name': '[parameters(\'storageAccountType\')]'
}
'kind': 'StorageV2'
'properties': {}
}
]
'outputs': {
'storageAccountNameOutput': {
'type': 'string'
'value': '[variables(\'storageAccountName\')]'
}
}
}
}
}
템플릿 사양에 새 버전을 추가하려면 Azure PowerShell 또는 Azure CLI를 사용하여 템플릿을 배포합니다.
New-AzResourceGroupDeployment `
-ResourceGroupName templateSpecRG `
-TemplateFile "C:\templates\main.bicep"
az deployment group create \
--resource-group templateSpecRG \
--template-file "C:\templates\main.bicep"
다음 Bicep 모듈을 복사하여 컴퓨터에 storage.bicep 으로 저장합니다.
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:2.0' = {
name: 'deployVersion2'
params: {
storageNamePrefix: 'demo'
}
}
모듈에서 <subscriptionId>
를 바꿉니다. Azure PowerShell 또는 Azure CLI를 사용하여 구독 ID를 가져옵니다.
(Get-AzContext).Subscription.Id
az account show --query "id" --output tsv
Azure PowerShell 또는 Azure CLI를 사용하여 템플릿 사양을 배포합니다.
New-AzResourceGroupDeployment `
-ResourceGroupName storageRG `
-TemplateFile "C:\templates\storage.bicep"
az deployment group create \
--resource-group storageRG \
--template-file "C:\templates\storage.bicep"
리소스 정리
이 빠른 시작에서 배포한 리소스를 정리하려면 두 리소스 그룹을 모두 삭제합니다. 리소스 그룹, 템플릿 사양 및 스토리지 계정이 삭제됩니다.
Azure PowerShell 또는 Azure CLI를 사용하여 리소스 그룹을 삭제합니다.
Remove-AzResourceGroup -Name "templateSpecRG"
Remove-AzResourceGroup -Name "storageRG"
az group delete --name templateSpecRG
az group delete --name storageRG
다음 단계