我已在 SecretsManager 中配置一个密钥以包含另一个区域中的副本:
resource "aws_secretsmanager_secret" "api_token_secret" {
name = "system/api_token"
kms_key_id = var.kms_keys[var.primary_region].key_id
dynamic "replica" {
for_each = var.replica_regions
content {
region = replica.value
kms_key_id = var.kms_keys[replica.value].key_id
}
}
}
现在我需要为参数存储中的每个区域导出一个包含 Secret ARN 的参数。例如:
resource "aws_ssm_parameter" "api_token_secret_arn" {
name = "system/api_token/secret_arn"
value = aws_secretsmanager_secret.api_token_secret.arn
type = "SecureString"
}
resource "aws_ssm_parameter" "api_token_secret_arn" {
for_each = var.replica_regions
provider = ??
name = "system/api_token/secret_arn"
value = ??
type = "SecureString"
}
但是,我无法找到一种方法来获取为主秘密管理器创建的每个副本的 ARN,以及如何动态更改提供程序以指向其他区域。有人知道我怎样才能实现这一目标吗?
我们需要结合一些不同的功能来解决这种情况。首先我们需要提供商别名。如果问题没有提供信息,我们将假设原始区域是
us-east-1
,附加区域是 us-west-1
。
provider "aws" {
region = "us-east-1"
}
provider "aws" {
alias = "west"
region = "us-west-1"
}
现在我们需要确定默认提供商配置中的区域:
data "aws_region" "default" {}
区域名称随后可在导出的属性中使用
data.aws_region.default.name
。
接下来,我们利用提供商别名,利用副本秘密 ARN 除区域之外都是相同的事实,并调用 replace 函数将 ARN 中的原始区域字符串替换为副本区域:
resource "aws_ssm_parameter" "api_token_secret_arn" {
provider = aws.west
name = "system/api_token/secret_arn"
value = replace(aws_secretsmanager_secret.api_token_secret.arn, data.aws_region.default.name, "us-west-1")
type = "SecureString"
}
请注意,提供程序别名参数值无法使用变量进行插值,因此不幸的是,您的
for_each
元参数无法在资源中使用。