如果数据中的用户不存在,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] 删除。
我来说两句