Terraform多环境部署按环境动态分配S3访问权限实现方法
Terraform按环境动态授权S3桶权限实现方案
核心逻辑
不需要写多层嵌套的条件判断,通过环境-资源映射表的方式,根据当前执行时传入的var.environment参数,自动匹配对应环境的S3桶ARN作为策略资源,从根源上避免跨环境授权的问题。
具体改造步骤
- 在
locals块中单独维护各环境和对应S3桶ARN的映射关系,后续桶名变更、新增环境只需要修改这一处配置 - 替换原有硬编码的全量桶列表,直接从映射表中取当前环境对应的桶ARN生成策略
- 可选:给
environment变量加校验规则,避免传参错误导致匹配失败
改造后完整配置参考
# 可选:给环境变量加校验,拦截非法传参 variable "environment" { type = string description = "Deployment environment" validation { condition = contains(["dev", "qa", "production"], var.environment) error_message = "Valid environment values are dev, qa, production." } } module "service_accout_iam_role" { for_each = { for sa in local.service_accounts : sa.name => sa } source = "./service_account_iam_role" environment = var.environment eks_cluster_name = var.eks_cluster_name account_id = var.account_id region = var.region service_account_name = each.value.name namespace = each.value.namespace policies = each.value.policies } locals { # 统一维护各环境对应的S3桶ARN映射 env_s3_bucket_map = { dev = "arn:aws:s3:::my-dev-bucket" qa = "arn:aws:s3:::my-qa-bucket" production = "arn:aws:s3:::my-Prod-bucket" } service_accounts = [ { name = "my-account" namespace = "test123" policies = [ { name = "deleteS3" # 自动匹配当前环境的桶,需要授权桶内对象的话补充/*路径即可 resources = [ local.env_s3_bucket_map[var.environment], "${local.env_s3_bucket_map[var.environment]}/*" ] }, ] }, ] }
扩展说明
如果单个策略需要授权同环境下的多个S3桶,直接把映射表中对应环境的值改成列表格式即可,不需要调整其他逻辑:
env_s3_bucket_map = { dev = [ "arn:aws:s3:::my-dev-business-bucket", "arn:aws:s3:::my-dev-log-bucket" ] # qa、production环境配置逻辑和dev一致 }
这种方式比嵌套三目运算(var.environment == "dev" ? xxx : var.environment == "qa" ? xxx : xxx)维护成本低很多,后续新增环境只需要在映射表中加一行键值对,不需要修改策略生成的核心逻辑。
内容的提问来源于stack exchange,提问作者Beckham rodeo
相关产品推荐
相关产品推荐

