基于字符串类型stage变量创建Terraform资源不生效问题咨询
问题根因
你遇到的dev环境资源不创建的问题,核心是count参数的三元判断逻辑写反了。你当前配置的判断规则:
count = var.stage != "dev" ? 1 : 0
这段规则的含义是当环境不等于dev时创建1个资源,等于dev时创建0个资源,自然stage设置为dev时不会生成对应资源。修正逻辑只需把判断条件反转即可:
count = var.stage == "dev" ? 1 : 0
另外你当前配置内的IAM Policy还存在两个语法问题:一是Statement数组缺少闭合的],二是S3资源ARN中bucket名称前多了多余空格,实际生效时会导致权限不匹配。
关于Terraform条件判断的类型疑问
Terraform的条件判断不是仅支持布尔类型数据:
- 三元运算符
condition ? value_if_true : value_if_false中,condition位置只要最终能计算出布尔值(true/false)即可,支持任意类型的变量做比较运算生成布尔结果,比如字符串相等/不等判断、数字大小判断、集合包含判断等都可以作为条件使用 - 你当前的条件判断语法本身没有问题,只是逻辑写反才导致不符合预期
多环境配置优化建议
如果要同时适配dev/staging/production三个环境的不同策略,不需要为每个环境单独编写一套资源,用lookup函数配合映射表实现会更简洁,参考示例:
# 定义不同环境对应的bucket映射关系 locals { stage_bucket_map = { dev = "dev-bucket-pushed" staging = "staging-bucket-pushed" production = "prod-bucket-pushed" } } # 单套资源适配所有环境 resource "aws_iam_policy" "s3-policy" { name = "s3-bucket-policy-${var.stage}" description = "Access rights for cicd-user to Bucket on ${title(var.stage)}" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = [ "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:DeleteObject" ] Effect = "Allow" Resource = [ "arn:aws:s3:::${local.stage_bucket_map[var.stage]}", "arn:aws:s3:::${local.stage_bucket_map[var.stage]}/*" ] } ] }) } resource "aws_iam_group_policy_attachment" "attach_cicd-users_s3_policy" { group = aws_iam_group.cicd-users.name policy_arn = aws_iam_policy.s3-policy.arn }
示例中使用jsonencode代替 heredoc 格式编写policy,可以避免JSON语法错误,同时插值操作更便捷
内容的提问来源于stack exchange,提问作者user4654228
相关产品推荐
相关产品推荐

