如何参考存储和密钥保管库更新 Azure 函数应用程序的应用程序设置? - 带二头肌和模块

问题描述 投票:0回答:1

背景

这个想法是拥有一个小型“工作负载”/“管道”,其中包含一个函数应用程序,用于按计划的时间间隔调用某些第 3 方 API 并将响应写入 blob 存储。

所以就我需要/想要拥有的资源而言:

  • 功能应用程序的存储
  • 功能应用程序,其应用程序设置将其链接到上述存储
  • 数据存储,即 API 响应
  • 一个 keyvault,用于将数据存储的密钥作为秘密存储,访问策略允许函数应用程序访问 keyvault 秘密
  • 函数应用程序的更新设置,其中将包括对 keyvault 机密的引用

我非常想要一个可重复使用的模板,所以我尝试使用二头肌模块。到目前为止,这是我的 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 版本和资源类型。只是发泄我的挫败感...;) )

我尝试过的事情

  1. 我测试了使用空的初始应用程序设置进行部署(即应用程序设置作为

    FunctionApp.bicep
    的一部分)-我得到了相同的结果。

  2. 我创建为

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

这没有帮助。

  1. 我尝试将以下内容放入我的
    main.bicep
    中:
var dummy = storageAccount4func1r.identity.principalId
output dummy string = dummy

根据以下建议:https://learn.microsoft.com/en-us/azure/azure-resource-manager/troubleshooting/error-not-found?tabs=bicep#solution-4-get-management-来自资源的身份

但这并没有帮助。

azure azure-functions azure-resource-manager azure-bicep
1个回答
0
投票

您无法声明存储帐户资源,然后使用 existing 函数在同一个二头肌文件中检索相同的存储帐户。您收到的错误可能来自现有函数,因为您无法为其设置依赖项。 (即:它试图引用尚不存在的资源)。

尝试在 appSettings 之上的级别声明存储帐户,然后将 StorageAccount 名称传递到 appSettings bicep 文件。然后您可以使用那里的existing函数来检索您的存储帐户参考,它应该可以工作。

如果您发布您的二头肌文件,也可能更容易提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.