![](/img/trans.png)
[英]Terraform for AWS: Pass specific resource address based on AZ of the beanstalk instance
[英]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.