基于条件阶段变量字符串的 Terraform 资源

Posted

技术标签:

【中文标题】基于条件阶段变量字符串的 Terraform 资源【英文标题】:Terraform resource based on condition stage variable string 【发布时间】:2021-12-12 21:40:37 【问题描述】:

我正在尝试在我的三个环境中的每个环境中为用户附加不同类型的策略: 开发、登台和生产。

环境信息以字符串格式存储为 terraform 变量,例如'开发'。

resource "aws_iam_policy" "s3-dev-policy" 
  count       = var.stage != "dev" ? 1 : 0
  name        = "s3-bucket-policy-$var.stage"
  description = "Access rights for cicd-user to Bucket on Dev"

  policy = <<EOF

    "Version": "2012-10-17",
    "Statement": [
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3::: dev-bucket-pushed",
                "arn:aws:s3::: dev-bucket-pushed/*"
            ]
        

EOF


resource "aws_iam_group_policy_attachment" "attach_cicd-users_s3_dev_group_policy" 
  count      = var.stage != "dev" ? 1 : 0
  group      = aws_iam_group.cicd-users.name
  policy_arn = aws_iam_policy.s3-dev-policy[count.index]


Terraform apply 不会抱怨语法,但即使阶段设置为“dev”,它也不会应用此资源。条件是否仅适用于布尔作为数据类型?

【问题讨论】:

如果你 100% 确定 var.stagedev,这应该可以工作 - 你确定 infra.尚未配置,并且 Terraform 正在跳过实际应用,因为没有可应用的内容? 没错。 terraform state list 可能会帮助您评估 Terraform 已经管理的内容。 另外 - 您确定政策文本是正确的吗?我不确定冒号后的空格,即::: 【参考方案1】:

您的条件不正确、政策存在语法错误arn 不正确等问题。一切都应该是:


resource "aws_iam_policy" "s3-dev-policy" 
  count       = var.stage == "dev" ? 1 : 0
  name        = "s3-bucket-policy111-$var.stage"
  description = "Access rights for cicd-user to Bucket on Dev"

  policy = <<EOF

    "Version": "2012-10-17",
    "Statement": [
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::dev-bucket-pushed",
                "arn:aws:s3:::dev-bucket-pushed/*"
            ]
        
       ] 

EOF



resource "aws_iam_group_policy_attachment" "attach_cicd-users_s3_dev_group_policy" 
  count      = var.stage == "dev" ? 1 : 0
  group      = aws_iam_group.cicd-users.name
  policy_arn = aws_iam_policy.s3-dev-policy[count.index].arn

【讨论】:

哈哈,谢谢条件确实不对。我的错。我还添加了arn。语法错误只是由于删除了示例中的某些内容。现在可以了。你提到的“其他问题”是什么? @mgloel 3::: dev-buck 中不应有空格。无论如何,如果我的回答有帮助,我们将不胜感激。

以上是关于基于条件阶段变量字符串的 Terraform 资源的主要内容,如果未能解决你的问题,请参考以下文章

在创建资源之前,我们可以在 Terraform 中匹配多个条件吗?

有条件地使用 terraform 配置 gcp vm 实例

Terraform 总是更新 iam_policy_document 的条件块

如何使用 terraform 设置资源健康警报条件

如何使用 Terraform 为 Elastic Beanstalk 环境定义条件(每个环境)设置?

Azure DevOps Pipelines 中的条件阶段执行