Как назначить экземпляру EC2 фиксированный IP-адрес в подсети?

#amazon-web-services #amazon-ec2 #amazon-cloudformation

#amazon-web-services #amazon-ec2 #aws-cloudformation

Вопрос:

Я использую CloudFormation для определения подсети и экземпляра EC2. Я хочу выделить конкретный частный IP-адрес экземпляру EC2 и попытался сделать это, используя определения ресурсов, подобные приведенным ниже.

Когда я пытаюсь развернуть свой шаблон, создание ресурса NetworkInterface завершается ошибкой с сообщением «Адрес находится в зарезервированном диапазоне адресов подсети». Я пытался решить эту проблему, но не добился прогресса. Как мне определить свою подсеть с диапазоном частных IP-адресов, которые я могу применить к своим экземплярам EC2?

Спасибо.

Примечание: весь шаблон содержит другие ресурсы, поэтому я попытался свести его к важным компонентам, поэтому приведенное ниже намеренно неполное.

 "SharedVPC": {
  "Type": "AWS::EC2::VPC",
  "Properties": {
      "CidrBlock": "10.10.0.0/16",
      "EnableDnsHostnames": true,
      "EnableDnsSupport": true,
      "InstanceTenancy": "default"
  }
},

"SharedVPCPrivateSubnet1": {
  "Type": "AWS::EC2::Subnet",
  "Properties": {
      "AvailabilityZone": "eu-west-1a",
      "CidrBlock": "10.10.129.0/24",
      "MapPublicIpOnLaunch": false,
      "VpcId": {
          "Ref": "SharedVPC"
      }
  }
},

"DbServerEC2Instance": {
  "Type": "AWS::EC2::Instance",
  "Properties": {
    "KeyName": "WindowsEC2",
    "InstanceType": "t2.micro",
    "AvailabilityZone": "eu-west-1a",
    "ImageId": {
      "Ref": "DbServerEC2ImageAMI"
    },
    "IamInstanceProfile": {
      "Ref": "EC2InstanceProfile"
    },
    "NetworkInterfaces": [{
      "NetworkInterfaceId": {
        "Ref": "DbServerEC2InstanceNetworkInterface"
      },
      "DeviceIndex" : "0"
    }]
  }
},

"DbServerEC2InstanceNetworkInterface": {
  "Type": "AWS::EC2::NetworkInterface",
  "Properties": {
    "Description": "eth0",
    "PrivateIpAddresses": [{
        "PrivateIpAddress": "10.10.129.2",
        "Primary": "true"
      },
      {
        "PrivateIpAddress": "10.10.129.3",
        "Primary": "false"
      }
    ],
    "SourceDestCheck": "true",
    "SubnetId": {
      "Ref": "SharedVPCPrivateSubnet1"
    }
  }
}
  

Ответ №1:

AWS резервирует первые 4 IP-адреса и последний IP-адрес подсети. Эти диапазоны в подсети недоступны.

В документации AWS указано следующее:

Первые четыре IP-адреса и последний IP-адрес в каждом блоке CIDR подсети недоступны для использования и не могут быть назначены экземпляру. Например, в подсети с блоком CIDR 10.0.0.0/24 зарезервированы следующие пять IP-адресов:

  • 10.0.0.0 : Сетевой адрес.
  • 10.0.0.1 : Зарезервировано AWS для маршрутизатора VPC.
  • 10.0.0.2 : Зарезервировано AWS. IP-адрес DNS-сервера является базовым для сетевого диапазона VPC плюс два. Для виртуальных серверов с несколькими блоками CIDR IP-адрес DNS-сервера находится в основном CIDR. Мы также резервируем базу каждого диапазона подсети плюс два для всех блоков CIDR в VPC. Дополнительные сведения см. в разделе DNS-сервер Amazon.
  • 10.0.0.3 : Зарезервировано AWS для будущего использования.
  • 10.0.0.255 : Широковещательный сетевой адрес. Мы не поддерживаем широковещательную передачу в VPC, поэтому мы резервируем этот адрес.

Комментарии:

1. Ах, я думал, что мне не хватает какой-то конфигурации в моей подсети, неудивительно, что я изо всех сил пытался ее найти — вопрос в том, чтобы задать правильный вопрос! Спасибо. Пробую сейчас.

2. Нет проблем, технически первый и последний фактически зарезервированы любой сетью. Остальные 3 относятся к AWS

3. Как только я отошел от зарезервированного диапазона, я обнаружил, что действительно могу выбирать из доступных IP-адресов и выделять их без необходимости сообщать AWS, что это было моим намерением, как я думал, мне нужно. Так что это здорово, спасибо за это простое объяснение 🙂

4. В шаблоне отсутствовал параметр DeviceIndex, поэтому я отредактировал свой вопрос, чтобы включить его; на всякий случай, если кто-нибудь попытается использовать мое определение экземпляра EC2