为什么我的 AWS 实例的私有 IP 超出了子网范围?

为什么我的 AWS 实例的私有 IP 超出了子网范围?

我正在尝试使用 Terraform 在我的默认 VPC(CIDR 172.31.0.0/16)中启动一个私有 IP 地址为 172.31.32.101 的实例,该实例位于具有 CIDR 172.31.32.0/20 的 eu-west-1a 子网中。我通常可以毫无问题地做到这一点,但我越来越多地发现它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 实际上无效?

编辑-代码如下:

实例.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"
  }
}

变量.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 来提升我的跳转主机,这可能是我没有遇到问题的原因。

答案1

示例中的资源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"
  }
}

相关内容