Linter 규칙 - 배포 리소스 없음
이 Linter 규칙은 템플릿에 루트 수준의 Microsoft.Resources/deployments
리소스가 포함된 경우 경고를 발생합니다.
Linter 규칙 코드
Bicep 구성 파일의 다음 값을 사용하여 규칙 설정을 사용자 지정합니다.
no-deployments-resources
솔루션
ARM 템플릿에서는 Microsoft.Resources/deployments
리소스를 사용하여 템플릿을 중첩하거나 연결하여 템플릿을 다시 사용하거나 모듈화할 수 있습니다. 자세한 내용은 Azure 리소스를 배포할 때 연결된 템플릿 및 중첩된 템플릿 사용을 참조하세요. 다음 ARM 템플릿은 중첩된 템플릿의 샘플입니다.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string",
"defaultValue": "[format('{0}{1}', 'store', uniqueString(resourceGroup().id))]"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2024-03-01",
"name": "nestedTemplate1",
"properties": {
"mode": "Incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-04-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
}
}
]
}
Bicep에서는 ARM 템플릿을 중첩하거나 외부 ARM 템플릿을 연결하는 데 Microsoft.Resources/deployments
리소스를 계속 사용할 수 있습니다. 그러나 여러 번 평가되는 방식 때문에 안전하지 않고 까다로운 동작으로 이어질 수 있기 때문에 좋은 생각은 아닙니다. 또한 Bicep 파일을 작성할 때 Visual Studio Code에서 유효성 검사 및 자체 완성이 거의 없으므로 작업하기가 어렵습니다. 템플릿에 루트 수준의 Microsoft.Resources/deployments
리소스가 포함되어 있으므로 다음 Bicep 파일이 이 테스트에 실패합니다.
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
resource nestedTemplate1 'Microsoft.Resources/deployments@2024-03-01' = {
name: 'nestedTemplate1'
properties:{
mode: 'Incremental'
template: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
contentVersion: '1.0.0.0'
resources: [
{
type: 'Microsoft.Storage/storageAccounts'
apiVersion: '2023-04-01'
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
]
}
}
}
이 문제를 해결하려면 Bicep CLI 디컴파일 명령을 사용할 수 있습니다. 예를 들어 앞의 ARM 템플릿을 다음 Bicep 파일로 분해할 수 있습니다.
main.bicep:
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
module nestedTemplate1 './nested_nestedTemplate1.bicep' = {
name: 'nestedTemplate1'
params: {
storageAccountName: storageAccountName
location: location
}
}
nested_nestedTemplate1.bicep:
param storageAccountName string
param location string
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
}
또한 모듈 문을 사용하여 ARM 템플릿을 참조할 수도 있습니다.
main.bicep:
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param location string = resourceGroup().location
module nestedTemplate1 './createStorage.json' = {
name: 'nestedTemplate1'
params: {
storageAccountName: storageAccountName
location: location
}
}
createStorage.json:
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string",
"defaultValue": "[format('{0}{1}', 'store', uniqueString(resourceGroup().id))]"
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]"
}
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-04-01",
"name": "[parameters('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "StorageV2"
}
]
}
다음 단계
Linter에 관한 자세한 내용은 Bicep Linter 사용을 참조하세요.