Рейтинг:0

AWS CloudFormation — два сетевых интерфейса, один с EIP

флаг in

Я новичок в AWS. Попытка создать экземпляр EC2 с двумя сетевыми интерфейсами, один из которых должен быть общедоступным, а другой — частным.

Вот что я пробовал в своем шаблоне YAML:

  1. Создайте VPC с двумя подсетями
  2. Создайте экземпляр только с частным сетевым интерфейсом
  3. Создайте второй (общедоступный) сетевой интерфейс как еще один объект YAML.
  4. Подключите второй сетевой интерфейс к экземпляру
  5. Создайте EIP и свяжите его со вторым сетевым интерфейсом.

Интерфейс общедоступной сети должен быть создан как отдельный объект, потому что мне нужно !Ref на него в разделе ассоциации EIP.

Характеристики:
[...]
  Хост1:
    Тип: «AWS::EC2::Экземпляр»
    Характеристики:
      ImageId: 'ami-02541b8af977f6cdd' # Amazon Linux x86
      Тип экземпляра: 't2.micro'
      AvailabilityZone: !Выберите [0, !GetAZs '']
      имя_ключа: !Ref имя_ключа
      Сетевые интерфейсы:
      - SubnetId: !Ref SubnetPrivate
        DeleteOnTermination: правда
        Индекс устройства: '0'
        Набор групп:
        - !Ref SecurityGroup
      Теги:
      - Ключ: Имя
        Значение: 'простой - host1'
  Хост1Eth1:
    Тип: «AWS::EC2::NetworkInterface»
    Характеристики:
      SubnetId: !Ref SubnetPublic
      Набор групп:
      - !Ref SecurityGroup
      Теги:
      - Ключ: Имя
        Значение: 'простой - host1 eth1'
  Host1Eth1Приложение:
    Тип: «AWS::EC2::NetworkInterfaceAttachment»
    Характеристики:
      DeleteOnTermination: правда
      Индекс устройства: 1
      NetworkInterfaceId: !Ref Host1Eth1
      Идентификатор экземпляра: !Ref Host1
  ЭластичныйIP:
    Тип: «AWS::EC2::EIP»
    Характеристики:
      Домен: vpc
    Зависит от: VPCGatewayAttachment
  ElasticIPАссоциация:
    Тип: «AWS::EC2::EIPAssociation»
    Характеристики:
      EIP: !Ref ElasticIP
      Идентификатор экземпляра: !Ref Host1
      NetworkInterfaceId: !Ref Host1Eth1

Полный файл YAML доступен здесь: https://gist.github.com/kmansoft/6b90b33bcf91eb0d493414ed6c3d9754

Проблема:

После создания стека EIP-адрес экземпляра указан как общедоступный IP-адрес в консоли, и для него есть DNS-имя. Однако я не могу подключиться к экземпляру с помощью SSH (ни по имени хоста, ни по IP).

Как ни странно, если я опускаю EIP из файла YAML и создаю и связываю его вручную с помощью консоли AWS, то все работает.

Любые предложения о том, как заставить общедоступный EIP работать с использованием YAML?


Обновление: я пытался добавить Зависит от: Host1Eth1Attachment к ElasticIPAssociation, чтобы убедиться, что порядок такой же, как при связывании EIP в консоли.

Получил эту ошибку:

К экземпляру i-020622d0cf13e5185 подключено несколько интерфейсов. Вместо этого укажите идентификатор интерфейса для операции.

хотя мой ElasticIPAssociation указывает NetworkInterfaceIdИдентификатор экземпляра).


Обновление 2: я попытался изменить свой ElasticIPAssociation быть таким:

  ElasticIPАссоциация:
    Тип: «AWS::EC2::EIPAssociation»
    Характеристики:
      EIP: !Ref ElasticIP
      NetworkInterfaceId: !Ref Host1Eth1
    Зависит от: Host1Eth1Attachment

удаление Идентификатор экземпляра. Получил другую ошибку:

InstanceId не найден в свойствах

Это странно, документация для AWS::EC2::EIPAассоциация Говорит, что Идентификатор экземпляра «Требуется: условно» — «Для EC2-VPC можно указать либо идентификатор экземпляра, либо идентификатор сетевого интерфейса, но не оба».

Похоже на ошибку CloudFormation?


Обновление 3

Это - из документации EC2 - работает.

  PublicEIPAассоциировать:
    Тип: «AWS::EC2::EIPAssociation»
    Характеристики:
      AllocationId: !GetAtt PublicEIP.AllocationId
      NetworkInterfaceId: !Ref InterfacePublic

Обратите внимание, что нет Идентификатор экземпляра здесь (что не сработало бы, потому что экземпляр имеет два сетевых интерфейса).

Также обратите внимание, что это использует идентификатор распределения и нет EIP сослаться на EIP.

Документы говорят об этом идентификатор распределения: «Это необходимо для EC2-VPC». За EIP он говорит: «Это необходимо для EC2-Classic». Я использую EC2-VPC, поэтому переключаюсь на идентификатор распределения имело смысл и, наконец, сработало.

Tim avatar
флаг gp
Tim
Ваш экземпляр прослушивает ssh на интерфейсе с EIP?
флаг in
Я думаю, что sshd прослушивает все адреса. Если я создаю EIP вручную в консоли, все работает. Я обновил вопрос - теперь проблема заключается в невозможности связать EIP с определенным сетевым интерфейсом.
Рейтинг:0
флаг gp
Tim

После быстрого теста я думаю, что вы, возможно, нашли ошибку. Могу ошибаться, долго не тратил. Самый простой способ сообщить об этой ошибке — перейти на Страница EIPAAssociation CloudFormation и оставить отзыв. Предложите написать по электронной почте в своем примере или сослаться на этот вопрос на SF.

Вы правы в том, что в документах говорится указать и InstanceID ИЛИ NetworkInterfaceID, но когда вы указываете только идентификатор интерфейса, он запрашивает идентификатор экземпляра. Если вы добавите InstanceID, вам будет предложено удалить его.

Небольшой момент: согласно документам, NetworkInterfaceID EIP должен ссылаться на «Идентификатор сетевого интерфейса». Возвращаемое значение !Ref для AWS::EC2::NetworkInterface — это имя, поэтому вам необходимо получить атрибут ID. Это было бы важно, если бы не ошибка в CloudFormation.

ElasticIPАссоциация:
  Тип: «AWS::EC2::EIPAssociation»
  Характеристики:
    EIP: !Ref ElasticIP
    Идентификатор экземпляра: !Ref Host1
    NetworkInterfaceId: !GetAtt Host1Eth1.Id

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.