我正在尝试构建ARM和Bicep模板,以便在Azure SQL server (和数据库)上启用BYOK/CMK/TDE。
我面临的挑战是模板期望将KeyVault Key 版本作为输入传递进来。我真的很想避免这种情况,因为版本最终可能会改变,而且它不是我想要作为输入参数来维护的值。
到目前为止,我尝试的是为SQL创建这2种资源:
Microsoft.Sql/servers/keys@2022-05-01-preview
Microsoft.Sql/servers/encryptionProtector@2022-05-01-previewencryptionProtector看起来非常简单,它只使用服务器/密钥资源。这就是我被困的地方。
它需要KV键版本的“名称”字段,我希望它能够从Microsoft.KeyVault/vaults/ key现有资源中获得。但是,它只有以下属性:
keyVaultKey.properties.keyUriWithVersion我的下一个选择是解析该值,例如:
var sqlServerKeyName = '${keyVaultName}_${keyVaultKeyName}_${last(split(keyVaultKey.properties.keyUriWithVersion, '/'))}'但这导致了警告:
在分配"Microsoft.Sql/servers/keys“类型的"name”属性时使用他的表达式,该类型需要在部署开始时计算的值。您所引用的变量在开始时无法计算("keyVaultKeyName“-> "keyVaultKey")。可以在开头计算的keyVaultKey属性包括"apiVersion“、"id”、"name“、"type”
所以我的问题是:可以从Bicep/ARM模板获取KV密钥版本吗?如果是--如何获得?还是通常不建议这样做(特别是在透明数据加密的情况下)?
最后,如果没有基于ARM/Bicep的解决方案,我认为下一个最佳解决方案可能是尝试通过powershell检索最新版本,然后将其作为输入传递。关于这种方法有什么建议/例子吗?
注意:、KeyVault和Keys是在单独的部署中创建的,因此我不能为此使用KV部署输出。
发布于 2022-10-27 18:06:56
错误只是资源的名称:必须在部署启动时计算值,这在您的情况下是不可能的,因为名称是从另一个资源生成的。
您需要通过另一个模块调用它:
// sqlserver-keyvault-encryption.bicep
param sqlServerName string
param keyVaultName string
param keyName string
param keyVersion string
param keyUri string
resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' existing = {
name: sqlServerName
}
// Create sql server key from key vault
resource sqlServerKey 'Microsoft.Sql/servers/keys@2022-05-01-preview' = {
name: '${keyVaultName}_${keyName}_${keyVersion}'
parent: sqlServer
properties: {
serverKeyType: 'AzureKeyVault'
uri: keyUri
}
}
// Create the encryption protector
resource propector 'Microsoft.Sql/servers/encryptionProtector@2022-05-01-preview' = {
name: 'current'
parent: sqlServer
properties: {
serverKeyType: 'AzureKeyVault'
serverKeyName: sqlServerKey.name
}
}然后可以从父模块调用它:
param sqlServerName string
param keyVaultName string
param keyName string
resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = {
name: keyVaultName
}
resource keyVaultKey 'Microsoft.KeyVault/vaults/keys@2022-07-01' existing = {
name: keyName
parent: keyVault
}
module encryption 'sqlserver-keyvault-encryption.bicep' = {
name: 'sqlserver-keyvault-encryption'
params: {
sqlServerName: sqlServerName
keyVaultName: keyVault.name
keyName: keyVaultKey.name
keyVersion: last(split(keyVaultKey.properties.keyUriWithVersion, '/'))
keyUri: keyVaultKey.properties.keyUriWithVersion
}
}https://stackoverflow.com/questions/74222622
复制相似问题