web-dev-qa-db-ja.com

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は実際には無効ですか?

編集-以下のコード:

instance.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.

いずれにせよ、上記と同じCIDRブロックを使用しているにもかかわらず、現在はデフォルトのVPCを使用しておらず、問題が発生しなくなっていることがわかりました。そうは言っても、今は172.31.32.101ではなくIPアドレス172.31.0.6でジャンプホストを上げているので、問題が発生しないのかもしれません。

3
scrossan

この例の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"
  }
}
4
Martin Atkins