使用現有的資源
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 資源名稱。您不需要指定
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'
}
請注意,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 的 IntelliSense 會列出每個資源可用的函式。 在下列螢幕擷取畫面中,您可以看到儲存體帳戶除了 listKeys()
之外,還提供名為 listAccountSas()
和 listServiceSas()
的函式:
重要
listKeys()
函式可讓您存取資源相關的敏感性資料。 這表示執行部署的使用者或服務主體,必須具備該資源的適當權限層級。 這通常是參與者內建角色,或指派適當權限的自訂角色。