azure - 检索 ARM 模板中的当前版本以获取 secret

标签 azure azure-functions azure-keyvault

我得到了这个名为“StorageConnectionString”的 secret ,该 secret 从 ARM 插入到我的 Key Vault 中:

{
  "type": "Microsoft.KeyVault/vaults/secrets",
  "name": "[concat(variables('keyVaultName-v'),'/','StorageConnectionString')]",
  "apiVersion": "2018-02-14",
  "properties": {
    "contentType": "text/plain",
    "value": "OmittedStorageConntionString"
  },
  "dependsOn": [
    "[resourceId('Microsoft.KeyVault/vaults', variables('keyVaultName-v'))]"
  ]
}

有什么方法可以从 ARM 引用并获取插入 secret 的当前版本(或只是版本 ID)的 url?我想从环境变量中引用它,如下所示:https://azure.microsoft.com/en-us/blog/simplifying-security-for-serverless-and-web-apps-with-azure-functions-and-app-service/在“从 Key Vault 获取应用程序设置”部分下。我想在我的 Azure Function 中设置环境设置 @Microsoft.KeyVault(SecretUri=secret_uri_with_version)

如果这不可能,是否有其他方法来设置连接字符串?

最佳答案

这个问题是我最后的手段,就在我发布这篇文章后,我在这里找到了答案:https://learn.microsoft.com/en-us/azure/app-service/app-service-key-vault-references#reference-syntax (在文档中)“[concat('@Microsoft.KeyVault(SecretUri=',reference(variables('storageConnectionStringResourceId')).secretUriWithVersion, ')')]”

编辑 通过遵循前面提到的步骤,您实际上可以在 ARM 模板中引用该 Secret,并获取包含该版本的 Secret 的 url。

创建一个 secret :

{
  "type": "Microsoft.KeyVault/vaults/secrets",
  "name": "[concat(variables('keyVaultName-v'),'/', variables('queueStorageConnectionStringSecretName-v'))]",
  "apiVersion": "2018-02-14",
  "properties": {
    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=', variables('queueStorageName-v'), ';AccountKey=', listKeys(variables('storageAccountResourceId'),'2015-05-01-preview').key1)]"
  }

然后您可以在函数应用程序中引用它

    {
      "name": "StorageQueueConnectionString",
      "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('queueStorageConnectionStringSecretNameResourceId-v')).secretUriWithVersion, ')')]"
    }

然后,在您的函数中,您可以在绑定(bind)中引用 StorageQueueConnectionString

[Queue("queueName", Connection ="StorageQueueConnectionString")]
            ICollector<string> outputQueueItem

这样,您就不必在环境变量(或代码)中引用连接字符串,从而使您的应用程序更加安全。此示例需要在函数应用和 Vault 之间分配系统(或用户分配)身份。我目前正在尝试跳出,并且我已经编写了一些代码,可以在这里找到:https://github.com/mslot/Microservices 。代码不漂亮!我正在尝试很多与不同 Azure 实体之间的 key 保管库和绑定(bind)相关的事情。

外部编辑:

您必须使用 secret 的完整资源ID:

resourceId('sub','rg','Microsoft.KeyVault/vaults/secrets','vault_name','secret_name')

重现的最小模板:

{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [],
    "outputs": {
        "collection": {
            "type": "string",
            "value": "[reference('/subscriptions/xxx/resourceGroups/yyy/providers/Microsoft.KeyVault/vaults/zzz/secrets/www', '2018-02-14').secretUriWithVersion]"
        }
    }
}

关于azure - 检索 ARM 模板中的当前版本以获取 secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54013148/

相关文章:

Azure Function - 无法为运行时 : Python (M1 Mac incompatible architecture (have 'x86_64' , 需要 'arm64e' 启动新的语言工作线程 ))

java - azure java 使用 ACS 过滤器 - 如何?

android - Azure移动服务与Android Studio中的依赖项冲突

azure - 如何避免 url 中出现 azure 广告 token

Azure Functions 连接到本地 SQL Server

azure - 将字符串参数绑定(bind)到 Azure Function 中的 Enum 类型

将证书添加到 Key Vault 时出现 Azure 错误

c# - 如何从 Azure KeyVault 获取连接字符串?

azure - 从 Azure 管道任务访问 Microsoft.Azure.WebSites 资源提供程序(Microsoft Azure 应用服务)的服务主体

azure - 将调试器附加到 IIS 工作进程时出错