2017-03-20 10 views
0

terraformに多数のvpcサブネットをプロビジョニングする必要があるとします。各サブネットには、cidr、名前、および使用可能なゾーンがあります。ですから他の設定管理ツールでは、次のようなことをします:Terraformで反復可能なアイテムにアプローチする方法

[ 
    { 
     "name":"subnet1", 
     "cidr":"10.0.0.1/24", 
     "az":"us-west-1a" 
    }, 
    { 
     "name":"subnet2", 
     "cidr":"10.0.0.2/24", 
     "az":"us-west-1b" 
    } 
] 

そして、そのアレイで繰り返し処理します。

Terraformには、私が見る限り、アレイ/オブジェクトという概念はありません。だから、私はちょうどリストアイテムを使用する単一の属性の配列のために:

subnets: ["10.0.0.1/24","10.0.0.2/24"] 

しかし、それは私が私が欲しいのサブネットに名前を付けたり、配置することはできません。 私は、私もテラフォームに複数のリストを使用することができますような何かを知っている:

subnet_names: ["subnet1", "subnet2"] 
subnets: ["10.0.0.1/24","10.0.0.2/24"] 
subnet_az: ["us-west-1a", "us-west-1b"] 

をしかし、それは厄介なと直感に反するとして私を打ちます。私が見た最後のオプションは、文字列の醜いリストにtogehterすべてをマッシュすることで、その後、テラフォームにそれらを離れて分割:

things: ["subnet1__10.0.0.1/24__us-west-1a","subnet2__10.0.0.2/24__us-west-2a"] 

しかし、単に醜いのthats。

Terraformのアレイ/オブジェクトタイプのリピートはどのように処理できますか?今のところ私はすべてのものを明示的に定義しているため、単純なvpcの定義は300行になります:-(

+1

ここでそれを行う方法が見つかりました:https://blog.gruntwork.io/terraform-tips-tricks-loops-if-statements-and-gotchas-f739bbae55f9#.569pcl61d –

+0

Terraformのドキュメントには、単純なカウントの例がありますそれはあなたが探しているものに近いです。 https://www.terraform.io/docs/configuration/resources.html#using-variables-with-count – logicaldiagram

+0

imhoでは、オブジェクトを使用して設定を完全に制御することはできません。 – Trondh

答えて

1

あなたが今見たように、Terraformはあなたのような構造化データのリストをサポートしていません。

質問に表示されているように、複数のフラットな文字列リストを持つことは、この問題の一般的な解決策の1つです。これは機能しますが、これまでのように、どの値

より読みやすく保守性の高い結果をもたらす可能性のある別の方法は、aws_subnetリソースを、 fすべてのサブネットで常に同じ要素。そして、あなたは異なる値のみを提供し、サブネットごとに一度モジュールをインスタンス化することができます多くの場合

module "subnet1" { 
    source = "./subnet" 

    name = "subnet1" 
    cidr = "10.0.0.1/24" 
    az = "us-west-1a" 
} 

module "subnet2" { 
    source = "./subnet" 

    name = "subnet2" 
    cidr = "10.0.0.2/24" 
    az = "us-west-1b" 
} 

はAZSとCIDRブロック間の系統的関係のいくつかの並べ替えがあります。それが本当であれば、モジュールを使用してこれらの番号付け規則をエンコードすることもできます。たとえば、あなたのsubnetモジュールに:

variable "region_network_numbers" { 
    default = { 
    "us-west-1" = 0 
    "us-east-1" = 1 
    "us-west-2" = 2 
    } 
} 

variable "az_network_numbers" { 
    default = { 
    a = 1 
    b = 2 
    } 
} 

variable "base_cidr_block" { 
    default = "10.0.0.0/8" 
} 

variable "az" { 
} 

data "aws_availability_zone" "selected" { 
    name = "${var.az}" 
} 

resource "aws_subnet" "main" { 
    cidr_block = "${cidrsubnet(cidrsubnet(var.base_cidr_block, 8, var.region_network_numbers[data.aws_availability_zone.selected.region]), 4, var.az_network_numbers[data.aws_availability_zone.selected.name_suffix])}" 
    # ... 
} 

これにより、それはAZ名から体系的に生産さcidrnameで、モジュールにちょうどaz引数を提供するのに十分です。これは、the aws_availability_zone data sourceの例に示されているのと同じ一般的な考えであり、Terraformリポジトリ自体にはa more complete, elaborate example of thisがあります。

関連する問題