Я новичок в AWS. Попытка создать экземпляр EC2 с двумя сетевыми интерфейсами, один из которых должен быть общедоступным, а другой — частным.
Вот что я пробовал в своем шаблоне YAML:
- Создайте VPC с двумя подсетями
- Создайте экземпляр только с частным сетевым интерфейсом
- Создайте второй (общедоступный) сетевой интерфейс как еще один объект YAML.
- Подключите второй сетевой интерфейс к экземпляру
- Создайте 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, поэтому переключаюсь на идентификатор распределения
имело смысл и, наконец, сработало.