如何通过Terraform aws_secretsmanager_secret数据源批量获取指定前缀AWS密钥ARN
解决方案
完全可以实现,无需重复定义多个数据源块,按以下步骤操作即可:
步骤1:配置批量查询数据源
先通过data "aws_secretsmanager_secrets"批量筛选符合命名前缀的密钥,如果你需要获取每个密钥的更多属性(例如密钥描述、标签等),可以再通过for_each批量调用单密钥数据源。
# 批量拉取符合前缀的密钥基础信息 data "aws_secretsmanager_secrets" "db_creds" { filter { name = "name" values = ["db-credentials/${var.env-name}/"] } } # 可选:批量查询每个密钥的详细信息 data "aws_secretsmanager_secret" "db_creds_detail" { for_each = toset(data.aws_secretsmanager_secrets.db_creds.names) name = each.value }
步骤2:在DB Proxy资源的dynamic块中调用
直接遍历批量数据源返回的ARN列表即可生成auth配置,示例如下:
resource "aws_db_proxy" "example" { name = "your-db-proxy" engine_family = "MYSQL" # 替换为实际使用的数据库引擎 role_arn = aws_iam_role.proxy_role.arn vpc_subnet_ids = var.private_subnet_ids vpc_security_group_ids = [aws_security_group.proxy_sg.id] dynamic "auth" { # 直接使用批量数据源返回的ARN列表 for_each = data.aws_secretsmanager_secrets.db_creds.arns content { secret_arn = auth.value client_password_auth_type = "MYSQL_NATIVE_PASSWORD" # 按需调整认证方式 iam_auth = "DISABLED" # 按需调整是否开启IAM认证 } } }
如果需要用到密钥的其他属性,可以把for_each改为data.aws_secretsmanager_secret.db_creds_detail.values,通过auth.value.arn获取ARN即可。
注意事项
- 执行Terraform的身份需要拥有
secretsmanager:ListSecrets、secretsmanager:DescribeSecret权限,否则会查询失败 - 如果存在同名前缀但不符合命名规则的密钥,可以用Terraform的正则匹配函数对返回的列表做二次过滤
内容的提问来源于stack exchange,提问作者JimmyJazz
相关产品推荐
相关产品推荐

