如何通过 terraform 获取 SecretManager 副本 ARN?

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

我已在 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,以及如何动态更改提供程序以指向其他区域。有人知道我怎样才能实现这一目标吗?

terraform terraform-provider-aws
1个回答
0
投票

我们需要结合一些不同的功能来解决这种情况。首先我们需要提供商别名。如果问题没有提供信息,我们将假设原始区域是

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
元参数无法在资源中使用。

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