У меня есть шаблон CloudFormation, который запускает экземпляр центрального сервера с помощью OpsWorks (поэтому я определяю OpsWorks :: App, OpsWorks :: Instance, OpsWorks :: Layer и OpsWorks :: Stack). В другом месте шаблона CF запускается экземпляр EC2 для подчиненного узла, которому необходимо знать IP-адрес / DNS-имя центрального сервера, чтобы он мог инициировать обмен данными с сервером. Сервер Opsworks получает эластичный IP-адрес, но не тот, который я ему явно даю, вместо этого для уровня OpsWorks AutoAssignElasticIps установлено значение true.
Если бы один экземпляр EC2 ссылался на другой, я бы просто использовал {"Fn :: GetAtt": ["MyServerInstance", "PublicDnsName"]} для получения адреса. Но AWS :: OpsWorks :: Instance - это не то же самое, что AWS :: EC2 :: Instance (даже несмотря на то, что он создает экземпляр EC2), поэтому проверка шаблона завершается ошибкой с:
Ошибка проверки шаблона: ошибка шаблона: ресурс MyServerInstance не поддерживает тип атрибута PublicDnsName в Fn :: GetAtt
Есть ли другой способ узнать адрес запущенного экземпляра OpsWorks? Или можно получить AWS :: EC2 :: Instance из AWS :: OpsWorks :: Instance, чтобы затем я мог запросить у него PublicDnsName?
Это невозможно через CloudFormation, вы должны использовать кулинарную книгу на уровне OpsWorks.
Я использую такой: https://github.com/opscode-cookbooks/aws.
Вы также можете установить aws-cli и рецепт Chef и проанализировать детали оттуда (я использовал этот метод для начальной загрузки EC2 в NAT для VPC). Предполагается, что вы работаете «локально» или вам нужно будет запустить с другой машины ...