簡體   English   中英

Terraform - AWS - 創建多個實例 - 不同的 AZ(其中實例數大於 AZ 列表長度)

[英]Terraform - AWS - create multiple instances - different AZ (where instance count is greater than AZ list length)

我在使用 Terraform (v0.12) 使用計數變量和子網 ID 列表創建多個實例時遇到問題,其中計數大於子網 ID 列表的長度。

例如;

resource "aws_instance" "main" {
  count                     = 20
  ami                       = var.ami_id
  instance_type             = var.instance_type
  # ...
  subnet_id                 = var.subnet_ids_list[count.index]
}

我的計數是'20'並且length(var.subnet_ids_list)是2。它拋出以下錯誤:

count.index is 2
    var.instance_subnet_id is tuple with 2 elements

The given key does not identify an element in this collection value.

我試圖將“subnet_ids_list”作為逗號分隔的字符串並使用“split”,但它也給出了同樣的錯誤。

后來想到把 append 子網元素添加到“subnet_ids_list”,以使其變為“20”。 就像是;

Python 2.7
>>> subnet_ids_list = subnet_ids_list * 10

有人可以幫助我如何使用 Terraform 或任何其他方法來解決此問題。

原來喜歡;

subnet_ids_list = ["sub-1", "sub-2"]

轉換為 - 滿足提供給計數的值;

subnet_ids_list = ["sub-1", "sub-2", "sub-1", "sub-2",....., "sub-1", "sub-2",] (length=20).

我不想為此目的使用 AWS 自動縮放組。

每當您需要啟動新的 EC2 時,創建新子網是沒有意義的。 我建議您查看有關 VPC 和子網基礎知識的官方文檔: https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-subnet-basics

例如,如果您使用 CIDR 塊 10.0.0.0/24 創建 VPC,它支持 256 個 IP 地址。 您可以將此 CIDR 塊分成兩個子網,每個子網支持 128 個 IP 地址。 一個子網使用 CIDR 塊 10.0.0.0/25(用於地址 10.0.0.0 - 10.0.0.127),另一個子網使用 CIDR 塊 10.0.0.128/25(用於地址 10.0.0.128 - 10.0.0.255)。

在您的 Terraform 示例中,看起來您有 2 個子網(私有和公共?),因此在訪問 subnet_ids_list 時您的計數器必須是 0 或 1。 更好的解決方案是標記您的子網: https://www.terraform.io/docs/providers/aws/r/subnet.html#inner

您可能有另一個計數器來控制實例的數量。 希望能幫助到你!

編輯:根據您的評論,Map 將是控制實例/子網的更好數據結構。 鍵可以是實例或子網本身,例如{ "aws_instance" = "sub-1" }

參考: https://www.terraform.io/docs/configuration-0-11/variables.html#maps

如果您需要循環訪問鏈接文檔中提到的內容列表,則可以使用element function

該索引從零開始。 如果與空列表一起使用,此 function 會產生錯誤。

大多數情況下使用內置的索引語法 list[index]。 僅將此 function 用於下面描述的特殊附加“環繞”行為。

> element(["a", "b", "c"], 3)
a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM