terraform -ループを使用してフィルタの結果


概要


今日のチュートリアルでは、よくコミュニティから得られるかなり一般的な質問を見てみましょう.また、それが可能であれば、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