Amazon-Web-Services

為什麼我的 AWS 實例的私有 IP 在子網範圍之外?

  • October 3, 2017

我正在嘗試在具有 CIDR 172.31.32.0/20 的 eu-west-1a 子網的預設 VPC (CIDR 172.31.0.0/16) 中使用 Terraform 啟動具有私有 IP 地址 172.31.32.101 的實例。我通常可以毫無問題地做到這一點,但我越來越多地發現terraform apply失敗並出現以下錯誤:

* Error launching source instance: InvalidParameterValue: Address 172.31.32.101 does not fall within the subnet's address range
status code: 400, request id: []

我懷疑,因為這至少在某些時候有效,所以它是 AWS 或 Terraform 的問題,但我承認我對 CIDR 塊(尤其是末尾的 / x )的了解有點缺乏。但是,我檢查了這個子網計算器,發現我傳遞給實例的 IP 至少應該是有效的。

AWS 是否因其他原因而失敗,例如我試圖在太短的時間內引發太多實例,而 Terraform 給了我錯誤的錯誤?還是我傳遞的 IP 實際上無效?

編輯 - 下面的程式碼:

instances.tf:

resource "aws_instance" "mgmt-jump" {
 ami = "${lookup(var.amis, var.region)}"
 instance_type = "t2.micro"
 key_name = "${var.key_pair}"
 security_groups = ["${aws_security_group.mgmt-jump-sg.name}"]
 count = "${var.mgmt_jump_count}"
 private_ip = "${lookup(var.mgmt_jump_private_ips,count.index)}"
 tags {
   Name = "mgmt-jump-${count.index+1}"
   category = "dec"
   environment = "management"
   role = "jump"
 }
}

variables.tf:

variable "region" {
 default = "eu-west-1"
}

variable "amis" {
 default = {
   # AMIs for Ubuntu 14.04
   eu-west-1 = "ami-47a23a30"
   eu-west-2 = "ami-accff2b1"
 }
}

variable "mgmt_jump_count" {
 default = "1"
}

variable "mgmt_jump_private_ips" {
 default = {
   "0" = "172.31.32.101"
   "1" = "172.31.32.102"
 }
}

編輯 2:我執行以下命令以使用 AWS CLI 啟動實例,如果沒有試執行標誌,這將是成功的,所以我相信這可能是 Terraform 的問題。

➜  ~  aws ec2 run-instances --image-id ami-47a23a30 --private-ip-address 172.31.32.101 --instance-type t2.micro --dry-run

A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.

無論哪種方式,我現在都沒有使用預設 VPC,即使我使用與上述相同的 CIDR 塊,並且我發現我不再遇到問題了。話雖如此,我現在使用 IP 地址 172.31.0.6 而不是 172.31.32.101 提升我的跳轉主機,所以這可能就是我沒有遇到問題的原因。

範例中的aws_instance資源沒有subnet_id提供屬性,因此實例將啟動到您賬戶的目標區域的預設子網。預設子網可能不是您嘗試使用的子網,因此它具有不同的 IP 地址範圍。

要解決此問題,請確定適當的子網 ID 並subnet_id在聲明中添加一個屬性,然後從該security_groups屬性切換到該vpc_security_group_ids屬性:

resource "aws_instance" "mgmt-jump" {
 count = "${var.mgmt_jump_count}"

 ami           = "${lookup(var.amis, var.region)}"
 instance_type = "t2.micro"

 key_name      = "${var.key_pair}"
 subnet_id     = "subnet-xxxxxxx"

 vpc_security_group_ids = ["${aws_security_group.mgmt-jump-sg.id}"]

 private_ip = "${lookup(var.mgmt_jump_private_ips,count.index)}"

 tags {
   Name        = "mgmt-jump-${count.index+1}"
   category    = "dec"
   environment = "management"
   role        = "jump"
 }
}

引用自:https://serverfault.com/questions/716564