![](/img/trans.png)
[英]How to use multiple AWS account to isolate terraform state between environment
[英]Unable to create dynamic terraform outputs for use in terraform_remote_state
我有以下用于创建各种 IAM 组的代码块
resource "aws_iam_group" "environment-access" {
count = "${length(var.environments)}"
name = "access-${element(var.environments, count.index)}"
}
variable "environments" {
default = ["production", "non-production"]
type = "list"
}
我想编写创建的 IAM 组的输出,以便通过 terraform_remote_state 获取每个组的 ARN 用作数据,它看起来如下所示
Outputs:
access-production = arn:aws:iam::XXXXXXX:group/basepath/access-production
access-non-production = arn:aws:iam::XXXXXXX:group/basepath/access-non-production
我在创建动态输出时遇到问题,因为我不确定如何根据最初创建的资源动态创建输出节,因为使用以下代码会产生引用未知资源“aws_iam_group.access-production”的错误。
output "access-production" {
value = "${aws_iam_group.access-production.arn}"
}
output "access-non-production" {
value = "${aws_iam_group.access-non-production.arn}"
}
此要求的一个初始问题是它要求具有单个动态环境列表但具有多个单独的输出值。 为了使这项工作有效,您需要使环境输入单独的值或生成描述环境的单个输出值。
# Variant with a fixed set of environments (v0.11 syntax)
variable "production_environment_name" {
type = "string"
default = "production"
}
variable "non_production_environment_name" {
type = "string"
default = "non-production"
}
resource "aws_iam_group" "production_access" {
name = "access-${var.production_environment_name}"
}
resource "aws_iam_group" "non_production_access" {
name = "access-${var.non_production_environment_name}"
}
output "access_production" {
value = "aws_iam_group.production_access.arn"
}
output "access_non_production" {
value = "aws_iam_group.non_production_access.arn"
}
# Variant with dynamic set of environments (v0.11 syntax)
variable "environments" {
type = "list"
default = ["production", "non_production"]
}
resource "aws_iam_group" "access" {
count = "${length(var.environments)}"
name = "access-${var.environments[count.index]}"
}
output "access" {
value = "${aws_iam_group.access.*.arn}"
}
这里的关键是输入变量和输出值必须具有相同的形式,这样我们才能在对象之间进行所有必要的引用。 在第二个示例中,环境名称作为列表提供,组 ARN 也作为列表提供,以便索引在两者之间对应。
您还可以使用output "access"
表达式的变体将两者与zipmap
结合起来,并获得以环境名称为键的映射,这可能会更方便调用者使用:
output "access" {
value = "${zipmap(var.environments, aws_iam_group.access.*.arn)}"
}
Terraform 0.12 中的新特性允许稍微整理一下。 这是生成地图的版本的惯用 Terraform 0.12 等效版本:
# Variant with dynamic set of environments (v0.12 syntax)
variable "environments" {
type = set(string)
default = ["production", "non_production"]
}
resource "aws_iam_group" "access" {
for_each = var.environments
name = "access-${each.key}"
}
output "access" {
value = { for env, group in aws_iam_group.access : env => group.arn }
}
除了具有一些略微不同的语法模式外,这个 0.12 示例还有一个额外的实际优势:Terraform 将跟踪那些地址为aws_iam_group.access["production"]
和aws_iam_group.access["non_production"]
的 IAM 组,因此位置var.environments
列表中的环境名称并不重要,并且可以添加和删除环境,而不会因为列表元素重新编号而潜在地干扰来自其他环境的组。
它通过使用资源for_each
实现这一点,这使得aws_iam_group.access
显示为对象映射,其中环境名称是键,而count
使其成为对象列表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.