![](/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.