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

亚历克斯

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

data "aws_iam_user" "labUser" {
  user_name = "gitlab_user"
}

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

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
}

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

马丁·阿特金斯

在 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]
       }
     },
   ]
 })
}

上面有一些不同的事情我想提请注意:

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果密钥不存在,则解码失败

如果文件不存在,则返回失败

如果不存在则进行更新吗?

Terraform 计划在错误地声称它们不存在的数据元素上失败

Postgres“如果不存在”失败,因为序列存在

写入数据存储区会失败吗?

如果文档引用不存在,新FlutterFire中的update()是否会失败?

在JavaScript中,如果“删除”不存在的属性会怎样?

如果记录不存在,PostgreSQL选择命令会变慢

如果文件不存在,则使TestNG通过测试失败

fs.appendFile,但如果路径不存在则失败

如果源目录不存在,则失败Gradle复制任务

Makefile - 如果目录不存在则失败 - 跨平台

如果物理层中的所有表都不存在于数据库中,OBIEE RPD 会起作用吗?

如果不存在PostgreSQL,可以模拟CREATE DATABASE吗?

如果不存在,可以更改表创建约束吗?

jQuery:如果不存在,添加div吗?

如果存在则更新特定列,如果不存在则不会失败

如果未选中复选框,值会失败吗?

如果景观太长,书本图形标题会失败吗?

当对象不存在时使用terraform失败安全读取s3_cucket_object

如果我尝试读取一个不存在的文件会抛出什么异常?

如果表不存在,为什么DROP TABLE IF EXISTS会引发MySQL警告?

如果不存在一行,SELECT FOR UPDATE是否会导致性能损失?

SSIS 事务:如果支持选项不存在,是否会创建新事务?

如果不存在,则创建模式会引发重复的键错误

如果我浏览到不存在的目录,我的文件会怎样?

如果分隔符不存在,cut是否会返回任何字段

如果页面上不存在目标元素,javascript 会忽略代码