Bicep에서 자식 리소스의 이름과 종류 설정

자식 리소스는 다른 리소스의 컨텍스트 내에만 존재하는 리소스입니다. 예를 들어 가상 머신 없이는 가상 머신 확장이 존재할 수 없습니다. 확장 리소스는 가상 머신의 자식입니다.

각 부모 리소스는 특정 리소스 종류만 자식 리소스로 허용합니다. 리소스 종류의 계층 구조는 Bicep 리소스 참조에서 확인할 수 있습니다.

이 문서에서는 자식 리소스를 선언할 수 있는 다양한 방법을 보여 줍니다.

학습 리소스

단계별 참고 자료를 통해 하위 리소스에 대해 알아보려면 Bicep을 사용하여 하위 및 확장 리소스 배포를 참조하세요.

이름 및 유형 패턴

Bicep에서 부모 리소스 내에서 또는 부모 리소스 외부에서 자식 리소스를 지정할 수 있습니다. 리소스 이름 및 리소스 종류에 제공하는 값은 자식 리소스를 선언하는 방법에 따라 다릅니다. 그러나 전체 이름과 유형은 항상 동일한 패턴으로 확인됩니다.

하위 리소스의 전체 이름은 다음 패턴을 사용합니다.

{parent-resource-name}/{child-resource-name}

계층 구조에 세 개 이상의 수준이 있는 경우 상위 이름을 계속 반복합니다.

{parent-resource-name}/{child-level1-resource-name}/{child-level2-resource-name}

하위 리소스의 전체 유형은 다음 패턴을 사용합니다.

{resource-provider-namespace}/{parent-resource-type}/{child-resource-type}

계층에 두 개 이상의 수준이 있는 경우 상위 리소스 종류를 계속 반복합니다.

{resource-provider-namespace}/{parent-resource-type}/{child-level1-resource-type}/{child-level2-resource-type}

/ 문자 사이의 세그먼트를 계산하면 유형의 세그먼트 수는 항상 이름의 세그먼트 수보다 하나 더 많습니다.

부모 리소스 내에서

다음 예에서는 부모 리소스의 리소스 속성 내에 포함된 자식 리소스를 보여 줍니다.

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  <parent-resource-properties>

  resource <child-resource-symbolic-name> '<child-resource-type>' = {
    <child-resource-properties>
  }
}

중첩된 리소스 선언은 부모 리소스의 최상위 구문 수준에 표시되어야 합니다. 각 수준이 부모 리소스의 자식 종류인 경우 선언은 임의로 깊게 여러 번 중첩될 수 있습니다.

부모 리소스 종류 내에서 정의된 경우 유형 및 이름 값을 슬래시 없이 단일 세그먼트로 서식을 지정합니다. 다음 예에서는 파일 서비스에 대한 자식 리소스가 있는 스토리지 계정을 보여 주고 파일 서비스에는 파일 공유에 대한 자식 리소스가 있습니다. 파일 서비스의 이름은 default로 설정되고 해당 유형은 fileServices로 설정됩니다. 파일 공유의 이름은 exampleshare로 설정되고 유형은 shares로 설정됩니다.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }

  resource service 'fileServices' = {
    name: 'default'

    resource share 'shares' = {
      name: 'exampleshare'
    }
  }
}

전체 리소스 종류는 여전히 Microsoft.Storage/storageAccounts/fileServicesMicrosoft.Storage/storageAccounts/fileServices/shares입니다. Microsoft.Storage/storageAccounts/는 부모 리소스 종류와 버전에서 유추되므로 입력하지 않습니다. 중첩된 리소스는 선택적으로 <segment>@<version> 구문을 사용하여 API 버전을 선언할 수 있습니다. 중첩된 리소스가 API 버전을 생략하면 부모 리소스의 API 버전이 사용됩니다. 중첩된 리소스가 API 버전을 지정하는 경우 지정된 API 버전이 사용됩니다.

하위 리소스 이름은 defaultexampleshare로 설정되지만 전체 이름에는 상위 이름이 포함됩니다. examplestorage 또는 default는 상위 리소스에서 가정하기 때문에 제공하지 않습니다.

중첩된 리소스는 부모 리소스의 속성에 액세스할 수 있습니다. 동일한 부모 리소스의 본문 내에 선언된 다른 리소스는 기호 이름을 사용하여 서로를 참조할 수 있습니다. 부모 리소스는 포함된 리소스의 속성에 액세스할 수 없으면 순환 종속성이 발생합니다.

부모 리소스 외부의 중첩된 리소스를 참조하려면 포함하는 리소스 이름과 :: 연산자로 규정되어야 합니다. 예를 들어 자식 리소스에서 속성을 출력하려면 다음을 수행합니다.

output childAddressPrefix string = VNet1::VNet1_Subnet1.properties.addressPrefix

부모 리소스 외부에

다음 예에서는 부모 리소스 외부의 자식 리소스를 보여 줍니다. 부모 리소스가 동일한 템플릿에서 배포되지 않는 경우 또는 루프를 사용하여 둘 이상의 자식 리소스를 만들려는 경우 이 방법을 사용할 수 있습니다. 값이 부모의 기호 이름으로 설정된 자식의 부모 속성을 지정합니다. 이 구문을 사용하면 여전히 전체 리소스 종류를 선언해야 하지만 자식 리소스의 이름은 자식의 이름일 뿐입니다.

resource <parent-resource-symbolic-name> '<resource-type>@<api-version>' = {
  name: 'myParent'
  <parent-resource-properties>
}

resource <child-resource-symbolic-name> '<child-resource-type>@<api-version>' = {
  parent: <parent-resource-symbolic-name>
  name: 'myChild'
  <child-resource-properties>
}

부모 리소스 외부에 정의된 경우 부모 유형 및 이름을 포함하도록 슬래시를 사용하여 유형의 서식을 지정합니다.

다음 예제에서는 루트 수준에서 모두 정의된 스토리지 계정, 파일 서비스 및 파일 공유를 보여 줍니다.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'default'
  parent: storage
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'exampleshare'
  parent: service
}

자식 리소스 기호 이름을 참조하는 것은 부모 참조와 동일하게 작동합니다.

상위 외부의 전체 리소스 이름

상위 외부에 하위 리소스를 선언할 때 전체 리소스 이름 및 유형을 사용할 수도 있습니다. 자식 리소스에 대해 부모 속성을 설정하지 않습니다. 종속성을 유추할 수 없으므로 명시적으로 설정해야 합니다.

resource storage 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: 'examplestorage'
  location: resourceGroup().location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource service 'Microsoft.Storage/storageAccounts/fileServices@2022-09-01' = {
  name: 'examplestorage/default'
  dependsOn: [
    storage
  ]
}

resource share 'Microsoft.Storage/storageAccounts/fileServices/shares@2022-09-01' = {
  name: 'examplestorage/default/exampleshare'
  dependsOn: [
    service
  ]
}

Important

전체 리소스 이름 및 유형을 설정하는 것은 권장되는 접근 방식이 아닙니다. 다른 접근 방식 중 하나를 사용하는 것만큼 유형이 안전하지 않습니다. 자세한 내용은 Linter 규칙: 상위 속성 사용을 참조하세요.

다음 단계