이 빠른 시작에서는 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@2025-06-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': '2025-06-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@2025-06-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': '2025-06-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
다음 단계