使用現有的資源

已完成

Bicep 檔案通常需要參考在其他位置建立的資源。 這些資源可能是以手動方式建立,也可能是由同事使用 Azure 入口網站所建立。 或者,也可能建立於另一個 Bicep 檔案中。 您需要參考這些資源的原因很多,例如:

  • 您正在將 SQL 資料庫新增至其他人員所建立的 Azure 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 表示此資源定義是已建立資源的參考,而該 Bicep 不應嘗試加以部署。

  • name 屬性是先前所部署儲存體帳戶的 Azure 資源名稱。

  • 您不需要指定 locationskuproperties,因為範本不會部署資源。 其只會參考現有的資源。 將其視為預留位置資源。

參考子資源

您也可以參考現有的子資源。 使用部署子資源時所使用的相同類型語法。 下列範例會說明如何參考現有的子網路,這是虛擬網路的子資源。 此範例會使用巢狀結構的子資源,如下所示:

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'
}

請注意,scope 會使用 resourceGroup() 關鍵字來參考包含該虛擬網路的資源群組。

您甚至可以參考不同 Azure 訂用帳戶內的資源,只要該訂用帳戶位於您 Microsoft Entra 租用戶中即可。 如果您的網路小組在不同的訂用帳戶中佈建虛擬網路,則範本可加以參考,如以下範例所示:

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

請注意,scope 會使用 resourceGroup() 關鍵字來參考 Azure 訂用帳戶識別碼 (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() 函式可讓您存取資源相關的敏感性資料。 這表示執行部署的使用者或服務主體,必須具備該資源的適當權限層級。 這通常是參與者內建角色,或指派適當權限的自訂角色。