기존 리소스 작업

완료됨

Bicep 파일은 다른 곳에서 만들어진 리소스를 참조해야 하는 경우가 많습니다. 이러한 리소스는 Azure Portal을 사용하는 동료가 수동으로 만들 수 있습니다. 또는 다른 Bicep 파일에서 만들어질 수도 있습니다. 다음과 같은 여러 가지 이유로 이러한 리소스를 참조해야 하는 경우가 있습니다.

  • 누군가가 이미 만든 Azure SQL 논리 서버 인스턴스에 SQL 데이터베이스를 추가하고 있습니다.
  • 다른 Bicep 모듈에 정의된 리소스에 대한 진단 설정을 구성하려 합니다.
  • 구독에 수동으로 배포된 스토리지 계정의 키에 안전하게 액세스해야 합니다.

Bicep은 이러한 상황에서 사용할 수 있는 existing 키워드를 제공합니다.

참고

이 단원의 명령은 개념을 설명하기 위해 표시된 것입니다. 명령을 아직 실행하지 마세요. 여기에서 학습하는 내용을 곧 연습할 예정입니다.

기존 리소스 참조

Bicep 파일 내에서 이미 존재하는 리소스를 정의할 수 있습니다. 선언은 일반 리소스 정의와 비슷하지만 몇 가지 큰 차이점이 있습니다. 기존 리소스 정의의 다음 예에서 정의는 toydesigndocs라는 스토리지 계정을 참조하세요. 스토리지 계정은 Bicep 템플릿이 리소스를 배포하는 것과 동일한 리소스 그룹에 있습니다.

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
  name: 'toydesigndocs'
}

이 정의를 구성하는 요소를 자세히 살펴보겠습니다.

  • 일반 리소스와 마찬가지로 resource 키워드, 기호 이름, 리소스 종류 및 API 버전을 포함합니다.

    참고

    기호 이름은 이 Bicep 파일 내에서만 사용됩니다. 하나의 Bicep 파일을 사용하여 이 리소스를 만들고 다른 Bicep 파일의 existing 리소스를 사용하여 이 리소스를 참조하는 경우 기호 이름이 일치할 필요는 없습니다.

  • existing 키워드는 이 리소스 정의가 이미 생성된 리소스의 참조이며 이 리소스를 배포하려고 시도하면 안 된다는 것을 Bicep에 알립니다.

  • name 속성은 이전에 배포된 스토리지 계정의 Azure 리소스 이름입니다.

  • 템플릿이 리소스를 배포하지 않으므로 location, sku 또는 properties를 지정할 필요가 없습니다. 단순히 기존 리소스를 참조할 뿐입니다. 자리 표시자 리소스라고 생각해도 좋습니다.

자식 리소스 참조

기존 자식 리소스도 참조할 수 있습니다. 자식 리소스를 배포할 때 사용한 것과 동일한 종류의 구문을 사용합니다. 다음 예제에서는 가상 네트워크의 자식 리소스인 기존 서브넷을 참조하는 방법을 보여줍니다. 이 예제에서는 다음과 같이 중첩된 자식 리소스를 사용합니다.

resource vnet 'Microsoft.Network/virtualNetworks@2024-05-01' existing = {
  name: 'toy-design-vnet'

  resource managementSubnet 'subnets' existing = {
    name: 'management'
  }
}

부모 리소스와 자식 리소스에 모두 existing 키워드가 적용되었습니다.

그런 다음, 다른 중첩된 자식 리소스에 사용하는 것과 동일한 :: 연산자를 사용하여 서브넷을 참조할 수 있습니다.

output managementSubnetResourceId string = vnet::managementSubnet.id

리소스 그룹 외부의 리소스 참조

종종 다른 리소스 그룹의 리소스를 참조해야 합니다. 예를 들어 중앙 집중식 리소스 그룹에 가상 네트워크가 있는 경우 가상 네트워크의 자체 리소스 그룹에 가상 머신을 배포하는 것이 좋습니다. 이 경우 scope 키워드를 사용하여 다른 리소스 그룹의 기존 리소스를 참조할 수 있습니다. 다음 예제에서는 networking-rg 리소스 그룹 내에 있는 toy-design-vnet이라는 가상 네트워크를 참조하는 방법을 보여줍니다.

resource vnet 'Microsoft.Network/virtualNetworks@2024-05-01' existing = {
  scope: resourceGroup('networking-rg')
  name: 'toy-design-vnet'
}

scoperesourceGroup() 키워드를 사용하여 가상 네트워크가 있는 리소스 그룹을 참조합니다.

구독이 Microsoft Entra 테넌트 내에 있으면 다른 Azure 구독의 리소스를 참조할 수도 있습니다. 네트워킹 팀이 다른 구독에서 가상 네트워크를 프로비전하는 경우 템플릿은 다음 예와 같이 이를 참조할 수 있습니다.

resource vnet 'Microsoft.Network/virtualNetworks@2024-05-01' existing = {
  scope: resourceGroup('A123b4567c-1234-1a2b-2b1a-1234abc12345', 'networking-rg')
  name: 'toy-design-vnet'
}

scoperesourceGroup() 키워드를 사용하여 Azure 구독 ID(A123b4567c-1234-1a2b-2b1a-1234abc12345) 및 가상 네트워크가 있는 리소스 그룹 이름을 참조합니다.

기존 리소스를 참조하는 방법을 배웠으므로, 템플릿에서 이 기능을 어떻게 사용하는지 살펴보겠습니다.

기존 리소스에 자식 및 확장 리소스 추가

existing 키워드와 parent 키워드의 조합을 사용하여 이미 존재하는 부모 리소스에 자식 리소스를 추가할 수 있습니다. 다음 예제 템플릿은 이미 존재하는 서버 내에 Azure SQL 데이터베이스를 만듭니다.

resource server 'Microsoft.Sql/servers@2024-05-01-preview' existing = {
  name: serverName
}

resource database 'Microsoft.Sql/servers/databases@2024-05-01-preview' = {
  parent: server
  name: databaseName
  location: location
  sku: {
    name: 'Standard'
    tier: 'Standard'
  }
}

기존 리소스에 확장 리소스를 배포해야 하는 경우 scope 키워드를 사용하면 됩니다. 다음은 existing 키워드 및 scope 키워드를 사용하여 이미 존재하는 스토리지 계정에 리소스 잠금을 추가하는 템플릿입니다.

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
  name: 'toydesigndocs'
}

resource lockResource 'Microsoft.Authorization/locks@2020-05-01' = {
  scope: storageAccount
  name: 'DontDelete'
  properties: {
    level: 'CanNotDelete'
    notes: 'Prevents deletion of the toy design documents storage account.'
  }
}

기존 리소스의 속성 참조

리소스가 다른 리소스의 속성을 참조해야 하는 경우가 종종 있습니다. 예를 들어 애플리케이션을 배포할 때 다른 리소스의 키 또는 연결 정보를 알아야 하는 경우가 있습니다. existing 키워드를 사용하면 참조하려는 리소스의 속성에 액세스할 수 있습니다.

출력을 통해 전달하는 대신 다른 리소스에서 이러한 방식으로 키를 조회하는 것이 가장 좋습니다. 항상 최신 데이터를 얻을 수 있을 뿐 아니라 출력은 키와 같은 보안 데이터를 처리하도록 설계되지 않았기 때문입니다.

리소스에 대한 정보에 액세스하는 방법은 얻으려는 정보의 유형에 따라 달라집니다. 안전하지 않은 속성인 경우 일반적으로 리소스의 properties만 사용합니다. 다음 예제 템플릿에서는 Azure Functions 애플리케이션을 배포하고, 이미 만들어진 Application Insights 인스턴스에 대한 액세스 세부 정보(계측 키)를 사용합니다.

resource applicationInsights 'Microsoft.Insights/components@2020-02-02' existing = {
  name: applicationInsightsName
}

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }
      ]
    }
  }
}

이 예제에서는 계측 키가 중요한 데이터로 간주되지 않으므로 리소스의 properties에서 계측 키를 사용할 수 있습니다. 리소스에 액세스하는 데 사용되는 자격 증명과 같은 보안 데이터에 액세스해야 하는 경우 다음 코드처럼 listKeys() 함수를 사용합니다.

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' existing = {
  name: storageAccountName
}

resource functionApp 'Microsoft.Web/sites@2024-04-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    siteConfig: {
      appSettings: [
        // ...
        {
          name: 'StorageAccountKey'
          value: storageAccount.listKeys().keys[0].value
        }
      ]
    }
  }
}

listKeys 함수는 keys 배열을 반환합니다. Bicep 코드는 keys 배열의 첫 번째 항목에서 value 속성을 검색합니다. 각 리소스 유형에는 listKeys() 함수에서 사용할 수 있는 다른 정보가 있습니다. Visual Studio Code에 대한 Bicep 확장은 각 리소스의 listKeys() 함수가 반환하는 데이터를 이해하는 데 도움이 되는 힌트를 제공합니다. 다음 스크린샷은 스토리지 계정에 대한 listKeys() 함수의 출력을 보여 줍니다.

Visual Studio Code에 대한 Bicep 확장의 스크린샷. IntelliSense는 스토리지 계정에 대한 listKeys 함수에서 반환된 여러 정보를 표시합니다.

일부 리소스는 다른 함수도 지원합니다. Visual Studio Code의 IntelliSense는 각 리소스에 사용할 수 있는 함수를 나열합니다. 다음 스크린샷에서는 스토리지 계정이 listKeys() 외에 listAccountSas()listServiceSas()라는 함수를 제공하는 것을 볼 수 있습니다.

Visual Studio Code에 대한 Bicep 확장의 스크린샷. IntelliSense는 스토리지 계정에 사용할 수 있는 몇 가지 함수를 표시합니다.

중요

listKeys() 함수를 사용하여 리소스에 대한 중요한 데이터에 액세스할 수 있습니다. 즉, 배포를 실행하는 사용자 또는 서비스 주체는 리소스에 대한 적절한 수준의 권한이 있어야 합니다. 일반적으로 기여자 기본 제공 역할 또는 적절한 권한을 할당하는 사용자 지정 역할입니다.