我正在尝试使用 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"
}
}