terraform -ループを使用してフィルタの結果
20142 ワード
概要
今日のチュートリアルでは、よくコミュニティから得られるかなり一般的な質問を見てみましょう.また、それが可能であれば、Traraformの結果をフィルタリングする方法です.また、実際の世界の使用例を見て、どのようにしてフィルタを使用するかを見ることができます.
Torraformでのフィルタリングはfor loop式を使用して実現できます.terraformの
for
ループ構造はループを実行しますが、以下のようなデータ構造を操作するために使用することもできます.変換:データ構造の変更.
フィルタ:
if
式と組み合わせて望ましい項目だけにフィルターをかける.グループ:キーによって新しい
list
のグループ要素.フィルタリング結果
次の例の変数を見てみましょう.
variable "apps" {
type = list(object({
app_name = string
app_kind = string
app_require_feature = bool
}))
default = [
{
app_name = "App1"
app_kind = "Linux"
app_require_feature = false
},
{
app_name = "App2"
app_kind = "Linux"
app_require_feature = false
},
{
app_name = "App3"
app_kind = "Windows"
app_require_feature = true
},
{
app_name = "App4"
app_kind = "Windows"
app_require_feature = false
}
]
}
app_require_feature = true
だけにフィルターをかけたいなら、次のローカル変数のようにfor
ループを書くことができます.locals {
apps_that_require_feature = toset([for each in var.apps : each.app_name if each.app_require_feature == true])
}
output "result" {
value = local.apps_that_require_feature
}
これはif
に設定されたオブジェクトキーapp_names
を持っている"app_require_feature"
のセットを返します$ terraform apply
Outputs:
result = ["App3"]
ですから、同じ変数をフィルターしたいとしましょうが、今回はtrue
であるアプリを見るだけで、windows
ループを次のローカル変数のようにfor
式で書くことができます.locals {
windows_apps = toset([for each in var.apps : each.app_name if each.app_kind == "windows"])
}
output "result2" {
value = local.windows_apps
}
これはif
に設定されたオブジェクトキーapp_names
を持っている"app_kind"
のセットを返します$ terraform apply
Outputs:
result2 = ["App3", "App4"]
実世界例
このような
"windows"
構成を必要とする現実世界の使用例を取りましょう.私たちが4つの
for
で変数を持っていると言いますが、私たちは特定のストレージアカウントでstorage accounts
を設定したいだけです.次の例のように、private endpoints
という余分なオブジェクトを作成できます.## variables ##
variable "storage_config" {
type = list(object({
name = string
account_kind = string
account_tier = string
account_replication_type = string
access_tier = string
enable_https_traffic_only = bool
is_hns_enabled = bool
requires_private_endpoint = bool
}))
default = [
#V2 Storage (hot) without private endpoint
{
name = "pwd9000v2sa001"
account_kind = "StorageV2"
account_tier = "Standard"
account_replication_type = "LRS"
enable_https_traffic_only = true
access_tier = "Hot"
is_hns_enabled = false
requires_private_endpoint = false
},
#V2 Storage (cool) without private endpoint
{
name = "pwd9000v2sa002"
account_kind = "StorageV2"
account_tier = "Standard"
account_replication_type = "LRS"
enable_https_traffic_only = true
access_tier = "Cool"
is_hns_enabled = false
requires_private_endpoint = false
},
#ADLS2 Storage with private endpoint enabled
{
name = "pwd9000adls2sa001"
account_kind = "BlockBlobStorage"
account_tier = "Premium"
account_replication_type = "ZRS"
enable_https_traffic_only = false
access_tier = "Hot"
is_hns_enabled = true
requires_private_endpoint = true
},
#ADLS2 Storage without private endpoint
{
name = "pwd9000adls2sa002"
account_kind = "BlockBlobStorage"
account_tier = "Premium"
account_replication_type = "ZRS"
enable_https_traffic_only = false
access_tier = "Hot"
is_hns_enabled = true
requires_private_endpoint = false
}
]
}
それから、4つのストレージアカウントを以下のリソース設定で作成することができます.## storage resources ##
resource "azurerm_resource_group" "RG" {
name = "example-resources"
location = "uksouth"
}
resource "azurerm_storage_account" "SAS" {
for_each = { for n in var.storage_config : n.name => n }
#Implicit dependency from previous resource
resource_group_name = azurerm_resource_group.RG.name
location = azurerm_resource_group.RG.location
#values from variable storage_config objects
name = each.value.name
account_kind = each.value.account_kind
account_tier = each.value.account_tier
account_replication_type = each.value.account_replication_type
access_tier = each.value.access_tier
enable_https_traffic_only = each.value.enable_https_traffic_only
is_hns_enabled = each.value.is_hns_enabled
}
次のリソースブロックでは、現在プライベートエンドポイントを設定することができますが、key
のオブジェクトrequires_private_endpoint
を持つストレージアカウントに対してのみ、次のリソース設定のように"key"
に設定します.## private endpoint resources ##
resource "azurerm_private_endpoint" "SASPE" {
for_each = toset([for pe in var.storage_config : pe.name if pe.requires_private_endpoint == true])
name = "${each.value}-pe"
location = azurerm_resource_group.RG.location
resource_group_name = azurerm_resource_group.RG.name
subnet_id = data.azurerm_subnet.data_subnet.id
private_service_connection {
name = "${each.value}-pe-sc"
private_connection_resource_id = azurerm_storage_account.SAS[each.value].id
is_manual_connection = false
subresource_names = ["dfs"]
}
}
"requires_private_endpoint"
のリソースで"true"
を詳しく見るなら、以下のようにフィルタを使用します.for_each
このazurerm_private_endpoint
ループは、選択されたストレージアカウントのプライベートエンドポイントのリソースの作成をループするために使用できるストレージアカウント名の集合をフィルタリングして返します.ストレージアカウント名の値は、for_each = toset([for pe in var.storage_config : pe.name if pe.requires_private_endpoint == true])
にマッチするfor
で表されます.したがって、上記の例では、4つのストレージアカウントがすべて作成されます.
しかし、1つのストレージアカウントだけがプライベートエンドポイントを有効にするように設定されました.
あなたがこのポストを楽しんで、新しい何かを学んだことを願っています.❤️
著者
閉じるこの動画はお気に入りから削除されています🐙 GitHub🐧 | 👾
・・・アクションボタン
背景色:1 .重要
色:千円!重要
ボーダーカラー:くぼんだ0 cbb 58!重要
}
マルセル.エルフォロー
Microsoft DevOps MVP | Cloud Solutions & DevOps Architect | Technical speaker focussed on Microsoft technologies, IaC and automation in Azure. Find me on GitHub: https://github.com/Pwd9000-ML
Reference
この問題について(terraform -ループを使用してフィルタの結果), 我々は、より多くの情報をここで見つけました https://dev.to/pwd9000/terraform-filter-results-using-for-loops-4n75テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol