Экземпляры, созданные недавно AWS ECS, не имеют настроенного ssh авторизованного ключа - PullRequest
0 голосов
/ 31 октября 2019

Мы используем Amazon Elastic Compute Services для раскрутки кластера с автоматически масштабируемыми группами. До недавнего времени это работало нормально, и в целом оно все еще работает нормально ... За исключением того, что мы больше не можем подключаться к базовым экземплярам EC2, используя SSH с нашей парой ключей. Мы получаем ssh разрешение отклоненных ошибок, что является относительно (неделями) новым, и мы ничего не изменили. Напротив, мы можем раскрутить экземпляр EC2 напрямую и без проблем использовать SSH с той же парой ключей.

Что я сделал для исследования:

  1. Слить кластер ECS, отсоединенныйэкземпляр от него и остановил его.
  2. Отключил корневой том экземпляра и подключил его к другому экземпляру EC2.
  3. Заметил, что /home/ec2-user/.ssh не существует.
  4. Нашел следующую ошибку в экземпляре /var/log/cloud-init.log:
Oct 30 23:23:09 cloud-init[3195]: handlers.py[DEBUG]: start: init-network/config-ssh: running config-ssh with frequency once-per-instance
Oct 30 23:23:09 cloud-init[3195]: util.py[DEBUG]: Writing to /var/lib/cloud/instances/i-0e13e9da194d2624a/sem/config_ssh - wb: [644] 20 bytes
Oct 30 23:23:09 cloud-init[3195]: helpers.py[DEBUG]: Running config-ssh using lock (<FileLock using file '/var/lib/cloud/instances/i-0e13e9da194d2624a/sem/config_ssh'>)
Oct 30 23:23:09 cloud-init[3195]: util.py[WARNING]: Applying ssh credentials failed!
Oct 30 23:23:09 cloud-init[3195]: util.py[DEBUG]: Applying ssh credentials failed!
Traceback (most recent call last):
  File "/usr/lib/python2.7/site-packages/cloudinit/config/cc_ssh.py", line 184, in handle
    ssh_util.DISABLE_USER_OPTS)
AttributeError: 'module' object has no attribute 'DISABLE_USER_OPTS'
Oct 30 23:23:09 cloud-init[3195]: handlers.py[DEBUG]: finish: init-network/config-ssh: SUCCESS: config-ssh ran successfully
Изучил исходный код Python для /usr/lib/python2.7/site-packages/cloudinit. Это выглядит хорошо для меня;Я вижу ссылку в config / cc_ssh.py на ssh_util.DISABLE_USER_OPTS, и похоже, что ssh_util.py действительно содержит DISABLE_USER_OPTS в качестве переменной уровня файла. (Но я не главный программист на Python, поэтому мне может не хватать чего-то тонкого.) Любопытно, что скомпилированные версии ssh_util.py и cc_ssh.py датируются 16 октября, что вызывает все виды красных флаговпотому что мы не видели никаких проблем с ssh до недавнего времени. Но я загрузил uncompyle6 и декомпилировал эти файлы, и декомпилированные версии кажутся тоже нормальными.

Глядя на cloud-init, довольно ясно, что если ссылка на ssh_util.DISABLE_USER_OPTS выдает исключение, каталог .ssh не будет настроен для ec2-пользователя, поэтому я понимаю, что происходит.

Что я не понимаю, почему? Кто-нибудь еще испытывал проблемы с cloud-init с недавно созданными инстансами EC2 под ECS и нашел решение?

Для справки мы используем AMI amzn2-ami-ecs-hvm-2.0.20190815-x86_64-ebs (ami-0b16d80945b1a9c7d) в us-east-1, и мы, конечно, не видели эти проблемы еще 15 августа. Я предполагаю, что некоторые изменения в облачном инициализации, которые получает экземпляр через yum update, объясняют новое поведение иизмените даты записи скомпилированных модулей Python в cloud-init.

Я также должен добавить, что экземпляр EC2, который я развернул для монтирования корневого тома созданного ECS экземпляра, слегка отличается от cloud-initкод. В частности, модуль cc_ssh.py не ссылается на ssh_util.DISABLE_USER_OPTS, а скорее на локальную переменную DISABLE_ROOT_OPTS. Так что это все подозрительно.

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Я диагностировал эту проблему в определенном развертывании AWS на Amazon Linux2 AMI. Основной причиной является yum update , которое вызывает обновление cloud-init из user_data, которое выполняется в cloud-init во время запуска экземпляра AWS EC2.

Данные пользователя, связанные с конфигурацией запуска ECS, выполняются с помощью cloud-init. Наш код инициализации user_data включал «yum update». Amazon развернула новую версию cloud-init, 18.5-2amzn2, которая еще не настроена в образах AMI (у них есть версия 18.2-72-amzn2.07 cloud-init). Поэтому обновление yum обновит cloud-init до версии 18.5-2amzn2. Однако анализ кода Python для версии 18.5-2amzn2 показывает, что он включает в себя коммит (https://github.com/number5/cloud-init/commit/757247f9ff2df57e792e29d8656ac415364e914d), который добавляет атрибут к ssh_util, которого нет в предыдущей версии. Обычно yum производит согласованную установку cloud-init, как проверено в автономном экземпляре EC2. Однако, поскольку обновление происходит в cloud-init, так как оно уже выполняется, результаты противоречивы. Модуль ssh_util, по-видимому, не обновлен для работающего cloud-init, поэтому он не может предоставитьзначение "DISABLE_USER_OPTS", которое было добавлено в вышеупомянутом коммите.

0 голосов
/ 01 ноября 2019

Таким образом, проблема действительно заключалась в том, что команда yum-update вызывалась из cloud-init, который обновлял сам себя cloud-init во время использования.

Я должен отметить, что мы использовали Amazon EFS на нашемузлы, и следовали точным инструкциям, которые Amazon указывает на своей странице справки для использования EFS с ECS, которые включают вызов yum-update в сценарии пользовательских данных.

...