為什麼我的 AWS 實例的私有 IP 在子網範圍之外?
我正在嘗試在具有 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" } }