这个想法是拥有一个小型“工作负载”/“管道”,其中包含一个函数应用程序,用于按计划的时间间隔调用某些第 3 方 API 并将响应写入 blob 存储。
所以就我需要/想要拥有的资源而言:
我非常想要一个可重复使用的模板,所以我尝试使用二头肌模块。到目前为止,这是我的 IaC 项目的结构:
./main.bicep
./modules/AppServicePlan/ConsumptionPlan.bicep
./modules/FunctionApp/FunctionApp.bicep
./modules/KeyVault/KeyVault.bicep
./modules/KeyVault/Secret.bicep
./modules/Storage/StorageAccount.bicep
因此,我使用
StorageAccount.bicep
创建数据存储(来自 main.bicep
作为模块)以及函数存储(来自 FunctionApp.bicep
作为模块)。 FunctionApp.bicep
还创建应用程序服务计划资源,并分配初始应用程序设置(即 AzureWebJobsStorage
将其链接到功能存储的设置)。
我也在以类似的方式处理 keyvault。因此,我从
main.bicep
创建一个 keyvault 作为模块,传入函数应用程序的对象 id 作为参数,以便在 key Vault 访问策略中允许它获取和列出机密。
最后,我尝试更新功能应用程序中的应用程序设置,以包含对密钥库中秘密的引用。首先,我尝试使用新应用程序设置“扩展”的方法,如是否有解决方法来保留 Bicep 模板中未定义的应用程序设置?我无法使其工作。所以现在我正在尝试用一种更简单的方法来完全替换应用程序设置。但是我收到一条错误消息,指出找不到函数资源的存储(?)
"error\": {\r\n \"code\": \"ResourceNotFound\",\r\n \"message\": \"The Resource 'Microsoft.Storage/storageAccounts/<storageForFuncName>' under resource group '<resourceGroup>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix\"\r\n }\r\n}"}
如果我查看部署,所有子部署(包括用于存储功能的子部署)都成功,只有主部署失败并出现上述错误详细信息。事实上,除了更新的应用程序设置之外,所有资源都已创建。即使是有问题的功能的存储,甚至是我作为
FunctionApp.bicep
的一部分创建的初始应用程序设置,顺便说一句,它包含完全相同的 AzureWebJobsStorage
键值,当我尝试时,这会在 main.bicep
中出现问题创建更新的应用程序设置。
我该如何解决这个问题?或者我应该完全改变我的模块方法?
(顺便说一句,这是我的第一个 IaC 项目,我是二头肌新手,但我已经很恼火了,我需要做一些事情,比如必须使用
resource
和 existing
有效地重新声明资源,尽管如此是用 module
声明的,同时还必须特别提及 api 版本和资源类型。只是发泄我的挫败感...;) )
我测试了使用空的初始应用程序设置进行部署(即应用程序设置作为
FunctionApp.bicep
的一部分)-我得到了相同的结果。
我创建为
module
的每个资源我再次声明为 resource
并使用 existing
关键字,并将其添加到应用程序设置的依赖项中:
resource functionApp1AppSettings 'Microsoft.Web/sites/config@2022-09-01' = {
kind: 'string'
name: 'appsettings'
parent: functionApp1r // resource //https://github.com/Azure/bicep/issues/7328
properties: {
// these settings were created at the point of function app creation with the `FunctionApp.bicep`
AzureWebJobsFeatureFlags: 'EnableWorkerIndexing'
// the below line is the problematic one and the one giving error
AzureWebJobsStorage: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount4funcName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount4func1r.listKeys().keys[0].value}'
FUNCTIONS_EXTENSION_VERSION: '~4'
FUNCTIONS_WORKER_RUNTIME: 'python'
WEBSITE_TIME_ZONE: 'Europe/Amsterdam'
// this is the "new" setting we are trying to update the appsettings with
KV_SOME_SECRET: '@Microsoft.KeyVault(VaultName=${keyVaultName};SecretName=${secret.name})'
}
dependsOn: [
functionApp1 //module
kv //module
kvr //existing resource of the above
storageAccounts4func //module
storageAccount4func1r //existing resource of the above
]
}
这没有帮助。
main.bicep
中:var dummy = storageAccount4func1r.identity.principalId
output dummy string = dummy
但这并没有帮助。
您无法声明存储帐户资源,然后使用 existing 函数在同一个二头肌文件中检索相同的存储帐户。您收到的错误可能来自现有函数,因为您无法为其设置依赖项。 (即:它试图引用尚不存在的资源)。
尝试在 appSettings 之上的级别声明存储帐户,然后将 StorageAccount 名称传递到 appSettings bicep 文件。然后您可以使用那里的existing函数来检索您的存储帐户参考,它应该可以工作。
如果您发布您的二头肌文件,也可能更容易提供帮助。