對于這項任務的幫助或任何想法,我將不勝感激。正如您在 locals.var 中看到的Application,Environment鍵有不同的值。但作為結果 JSON 檔案,這兩個鍵的這些值是相似的。如何設定正確的對應值?
我想value_tag應該動態設定。for_each- 創建大量檔案。Dynamically block看起來不適合這個。此外,我需要在一個 JSON 檔案中包含所有內容。
結果不正確
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"Application",
"Environment"
]
},
"StringEqualsIfExists": {
"aws:RequestTag/Application": [
"development",
"production"
],
"aws:RequestTag/Environment": [
"development",
"production"
]
}
}
}
]
}
正確的結果應該是這樣的
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"Application",
"Environment"
]
},
"StringEqualsIfExists": {
"aws:RequestTag/Application": [
"app-01",
"app-02"
],
"aws:RequestTag/Environment": [
"development",
"production"
]
}
}
}
]
}
locals {
enforce_tag = {
Environment = {
env01 = "development"
env02 = "production"
}
Application = {
app01 = "app-01"
app02 = "app-02"
}
}
}
data "template_file" "enforcetags" {
template = templatefile("${path.module}/enforcetags.tpl",
{
key_tag = [for key, value in local.enforce_tag : key]
value_tag = local.enforce_tag.Environment
}
)
}
模板檔案:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"ForAllValues:StringEquals": {
"aws:TagKeys": ${jsonencode([for key in key_tag : "${key}"
])
}
},
"StringEqualsIfExists": ${jsonencode(
{for key in key_tag: "aws:RequestTag/${key}" => value_tag
})
}
}
}
]
}
uj5u.com熱心網友回復:
你很接近,但缺少一些東西。首先是一些解釋,在下面您可以找到我認為可以解決您問題的方法。
有了這個:
value_tag = local.enforce_tag.Environment
你只接觸過Environment地圖,沒有參考Application地圖。相反,您可以使用它來傳遞這兩個地圖(2 個地圖的地圖):
value_tag = local.enforce_tag
為避免混淆,讓我們稱它們為:
enforce_tag包含以下內容的大地圖:- 第一個小地圖(用于環境)
- 第二個小地圖(用于應用)
然后為了在模板中正確使用它,在迭代標簽 ( Application, Environment) 時,您需要為相關標簽獲取相應的小地圖:
value_tag[key]
最后一件事是您似乎從未使用過小地圖中的鍵(即在您想要的輸出中沒有任何地方我可以看到env01或app02)。不過,也許您出于其他原因需要這種方式。如果是這樣,您只對小地圖的值感興趣。不是整個地圖,即
values(value_tag[key])
簡而言之,以下應該有效:
地形
data "template_file" "enforcetags" {
template = templatefile("${path.module}/enforcetags.tpl",
{
key_tag = [for key, value in local.enforce_tag : key]
value_tag = local.enforce_tag
}
)
}
模板片段
"StringEqualsIfExists": ${jsonencode(
{for key in key_tag: "aws:RequestTag/${key}" => values(value_tag[key])}
)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/370017.html
