給定一些條件/過濾for_each陳述句,如何將剩余的物件用于下游依賴項?
注意:Terraform 0.13.7
例如,如果用戶沒有 s3 存盤桶 terraform 應創建一個并設定其通知策略。如果他們確實有一個存盤桶,那么 terraform 應該查找存盤桶并設定它的通知。
到目前為止,我已經嘗試像這樣格式化我的有效負載:
"snowpipes": {
. . .
"create_staging_bucket": true,
"staging_bucket": {
"name": "existing-bucket-deployment",
"url": "old-dirty-bucket",
"arn": "arn:aws:s3:::old-dirty-bucket"
},
. . .
}
然后像這樣構建我的 terraform:
resource "aws_s3_bucket" "staging_bucket" {
for_each = {for k, v in var.snowpipes : k => v if v.create_staging_bucket == true}
bucket = lower(each.value.staging_bucket.url)
}
resource "aws_s3_bucket_notification" "bucket_notification" {
for_each = var.snowpipes
bucket = aws_s3_bucket.staging_bucket[each.key].id
. . .
}
但后來我得到這樣的錯誤,表明給定的鍵被過濾掉了:
Error: Invalid index
on main.tf line 504, in resource "aws_s3_bucket_notification" "bucket_notification":
504: bucket = aws_s3_bucket.staging_bucket[each.key].id
|----------------
| aws_s3_bucket.staging_bucket is object with no attributes
| each.key is "existing-bucket-deployment"
The given key does not identify an element in this collection value.
不確定是否有辦法在 aresource和data物件之間來回交換?
uj5u.com熱心網友回復:
我通常建議通過做出關于創建存盤桶是否屬于其范圍的艱難決定來使共享模塊更簡單,然后如果您決定 S3 存盤桶不屬于其范圍,則讓呼叫模塊始終宣告自己的 S3 存盤桶它的范圍,但我也可以看到,有時以這種方式靈活是很方便的,這樣做的代價是配置中的一些額外復雜性。
讓我們首先展示我接下來要假設的變數宣告:
variable "snowpipes" {
type = map(object({
create_staging_bucket = bool
staging_bucket = object({
name = string
url = string
arn = string
})
# (and whatever else you need, immaterial to this question)
}))
}
接下來讓我們aws_s3_bucket為這些已create_staging_bucket設定的元素的子集宣告資源,這與您已經撰寫的內容相同:
resource "aws_s3_bucket" "staging_bucket" {
for_each = {
for k, v in var.snowpipes : k => v
if v.create_staging_bucket == true
}
bucket = lower(each.value.staging_bucket.url)
}
到目前為止,我希望我基本上只是重復了您已經擁有的內容。我的下一步是將此資源的結果合并到原始變數的設定中,以便創建所有暫存桶的平面圖,無論它們是否在此處創建:
locals {
staging_buckets = merge(
{ for k, sp in var.snowpipes : k => sp.staging_bucket }
{
for k, b in aws_s3_bucket.staging_bucket : k => {
name = b.bucket
url = b.bucket # (not sure about this, but following your example above)
arn = b.arn
}
}
}
}
現在我們回到一個映射,它具有與我們開始的所有相同的鍵 in var.snowpipes,其中一些元素只是逐字輸入中的內容,而其他元素是基于我們宣告的資源合成的。由于 的優先行為merge,在地圖鍵發生沖突的地方,它更喜歡使用第二個地圖中的鍵,而不是第一個地圖中的鍵。
我們可以將其用于存盤桶通知資源:
resource "aws_s3_bucket_notification" "bucket_notification" {
for_each = local.staging_buckets
bucket = each.value.name
# ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347662.html
標籤:亚马逊-s3 地形 terraform-provider-aws terraform0.12
