如果数据不存在,terraform会失败吗?

Ale*_*lex 6 amazon-web-services terraform

如果数据中的用户不存在,terraform会失败吗?我需要通过数据块指定非生产环境中的用户:

data "aws_iam_user" "labUser" {
  user_name = "gitlab_user"
}
Run Code Online (Sandbox Code Playgroud)

然后我使用该用户授予用户权限:

resource "aws_iam_role" "ApiAccessRole_abc" {
 name = "${var.stack}-ApiAccessRole_abc"
 tags = "${var.tags}"
 assume_role_policy = <<EOF
{
 "Version": "2019-11-29",
 "Statement": [
   {
     "Action": "sts:AssumeRole",
  "Principal": {
    "AWS": [
    "${aws_iam_user.labUser.arn}"
    ]
  },
  "Effect": "Allow",
  "Sid": ""
 }
 ]
}
EOF
}
Run Code Online (Sandbox Code Playgroud)

生产环境中不存在该用户。如果该用户不存在,terraform 会崩溃吗?在两种环境中使用相同地形的好方法是什么?

Mar*_*ins 10

在 Terraform 中data,像您在此处所示的块既是一种获取数据的机制,也是作者(您)的断言,即期望存在特定的外部对象才能应用此配置。

对于您的情况,答案是确保对象存在的断言仅出现在它应该存在的情况下。对此的“大局”答案是查看模块组合指南,并考虑如果模块的这一部分并不总是它嵌入的模块的一部分,是否应该将其分解为单独的模块,但我会还展示了一个较小的解决方案,它使用条件表达式来获得您想要的行为,而无需任何重构:

variable "lab_user" {
  type    = string
  default = null
}

data "aws_iam_user" "lab_user" {
  count = length(var.lab_user[*])

  user_name = var.lab_user
}

resource "aws_iam_role" "api_access_role_abc" {
 count = length(data.aws_iam_user.lab_user)

 name = "${var.stack}-ApiAccessRole_abc"
 tags = var.tags
 assume_role_policy = jsonencode({
   Version   = "2019-11-29"
   Statement = [
     {
       Sid    = ""
       Action = "sts:AssumeRole"
       Effect = "Allow"
       Principal = {
         AWS = [data.aws_iam_user.lab_user[count.index].arn]
       }
     },
   ]
 })
}
Run Code Online (Sandbox Code Playgroud)

上面有几个不同的事情我想提请注意:

  • 我将实验室用户名设置为可选变量而不是硬编码值。然后,您可以通过为其分配不同的值来更改环境之间的行为lab_user,或者对于不需要“实验室用户”的环境完全不设置它。
  • data "aws_iam_user"我将计数设置为length(var.lab_user[*])。这里的运算[*]符要求 Terraform 将可能为空的字符串变量转换为包含零个或一个元素的列表,然后使用该列表的长度来决定要进行var.lab_user多少个查询。aws_iam_user如果var.lab_usernull,那么长度将为零,因此不会进行任何查询。
  • 最后,我将资源设置count为与数据结果aws_iam_role的长度相匹配aws_iam_user,以便在任何需要一个用户的情况下,也会创建一个角色。

如果您反思模块组合指南并得出结论,该实验室用户应该是单独模块中的一个单独关注点,那么您就可以从“gitlab user”模块本身中删除这种条件复杂性,而是让调用模块是否调用该模块取决于该环境是否需要这样的用户。效果是相同的,但决策将发生在配置的不同部分,因此它将实现不同的关注点分离。最终,哪种关注点分离最适合您的系统,是您需要根据您对系统的了解以及您期望系统未来如何发展的情况自行做出的权衡。