Por que o IP privado da minha instância da AWS está fora do intervalo da sub-rede?

2

Estou tentando iniciar uma instância com o endereço IP privado 172.31.32.101 usando o Terraform em minha VPC padrão (CIDR 172.31.0.0/16), na sub-rede eu-west-1a que tem o CIDR 172.31.32.0/ 20 Eu normalmente posso fazer isso sem nenhum problema, mas cada vez mais eu acho que terraform apply falha com o seguinte erro:

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

Eu suspeito que, como isso funciona pelo menos parte do tempo, é um problema com AWS ou Terraform, mas eu admito que meu conhecimento de blocos CIDR (especialmente o / x em o final) é um pouco deficiente. No entanto, eu verifiquei esta calculadora de sub-rede e vi que o IP estou passando para o instância pelo menos deve ser válida.

A AWS falhou por algum outro motivo, e. Eu estou tentando levantar muitos casos em um período muito curto de tempo, e Terraform está me dando o erro errado? Ou o IP que estou passando realmente é inválido?

EDIT - Código abaixo:

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"
  }
}

EDIT 2: Eu corri o seguinte comando para trazer a instância com o AWS CLI, o que teria sucesso se não fosse pelo sinalizador dry run, então acredito que isso pode ser um problema com o 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.

De qualquer maneira, não estou usando o VPC padrão agora, embora esteja usando os mesmos blocos CIDR descritos acima, e descobri que não encontro mais o problema. Dito isto, estou agora elevando meu host de salto com o endereço IP 172.31.0.6 em vez de 172.31.32.101, então talvez seja por isso que não estou encontrando o problema.

    
por scrossan 25.08.2015 / 11:14

1 resposta

4

O recurso aws_instance no exemplo não tem o atributo subnet_id fornecido, portanto, a instância será iniciada na sub-rede padrão da sua conta para a região de destino. É provável que a sub-rede padrão não seja aquela que você estava tentando usar e, portanto, tem um intervalo de endereços IP diferente.

Para corrigir isso, determine o id de sub-rede apropriado e adicione um atributo subnet_id à sua declaração e, em seguida, mude também do atributo security_groups para o atributo 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"
  }
}
    
por 07.08.2016 / 02:36