Самый простой способ — настройка ключа с использованием механизма cloud-init (спасибо за подсказку yusman). Но он не работает если права на директорию
/home
повреждены или дистрибутив не поддерживает директивы cloud-init.Второй способ — создание образа (Amazon Machine Image) с существующего инстанса и последующий запуск нового инстанса на его основе, но с созданием ключа. Таким образом фактически будет клонирована существующая машина с той лишь разницей, что на последнем этапе возможно создать новые ключи. Создание образа может занять длительное время для инстанса с дисками большого объема, и вам придется настраивать все сервисы, завязанные на эту машину заново. Поэтому данный способ в большинстве случаев займет больше времени.
В официальной документации от Amazon описывается и другой способ. Он позволяет восстановить доступ и свести к минимуму издержки на перенастройку сервисов (по сравнению со вторым способом), которые завязаны на инстанс, к которому потерян доступ. В статье дается его пошаговое описание.
Внимание! Этот способ работает только для инстансов, в которых в качестве корневого устройства используется блочное хранилище (Amazon Elastic Block Store), и не работает для локального хранилища инстансов (Amazon EC2 Instance Store).
Чтобы узнать, какой тип корневого устройства используется у вас, откройте Amazon EC2 консоль, перейдите в Instances, выберите инстанс и проверьте значение параметра Root device type в панели с детальной информацией.
Если на вашей машине EBS, то данный способ подходит для вас.
Шаг 1. Подготовка
Для начала необходимо сохранить некоторую информацию, чтобы не пришлось отвлекаться и не переходить на другие экраны (тем более это будет очень неудобно). Все данные можно найти в детальной информации инстанса (как туда попасть вы уже знаете). Запишите следующие настройки:
- Instance ID
- AMI ID
- EBS ID
- Root device
- Availability zone
Для инстанса, запущенного в VPC, сохраните значение VPC ID.
Для EC2-classic: eсли для инстанса создан эластичный IP-адрес (Elastic IP), то необходимо сохранить и его значение.
Изображение кликабельно
Для получения идентификатора блочного хранилища (EBS ID) необходимо кликнуть по названию Root device.
Шаг 2. Создание временного инстанса
Следующий этап — создание инстанса, с помощью которого вы будете восстанавливать ключи на оригинальном инстансе. Можно пропустить этот шаг, если у вас есть другой запущенный инстанс, находящийся в той же зоне (Availability zone), что и восстанавливаемый, и при этом он создан с использованием такого же AMI или версия операционной системы на нем позволит подключить диск с оригинального инстанса и скопировать на него ключи SSH. Если такого инстанса нет, то выполните следующие действия:
- Перейдите в консоль EC2 (на дашборд или в меню Instances) и нажмите Launch Instance
- На странице выбора AMI (Choose an Amazon Machine Image) выберите такой, который использовался для создания оригинального инстанса (его вы записывали на первом шаге — AMI ID). Если по какой-то причине этот AMI недоступен, можно создать образ с оригинального инстанса и использовать его либо выбрать такой тип AMI, к которому бы можно было подключить корневой диск восстанавливаемого инстанса
- На странице выбора типа инстанса (Choose an Instance Type) выберите самый дешевый из доступных типов
- На странице с детальной информацией (Configure Instance Details) укажите такую же зону (Availability Zone), как в нашем инстансе. Если он запущен в VPC, выберите в пункте Network аналогичную VPC и укажите подсеть (subnet) в данной зоне.
При этом настройки Network Interfaces нет необходимости менять.
- На странице редактирования хранилища (Add Storage) никаких изменений не требуется
- На странице тэгов (Add Tags) добавьте имя для временного инстанса, чтобы его было легко идентифицировать и потом не тратить время на сверку Instance ID и EBS ID, так как на страницах, где надо будет определить с каким инстансом или томом вы работаете, в названии будет фигурировать это значение.
- Жмите Review and Launch, а затем Launch
- Последний этап — выбор существующей пары ключей либо создание новой. Загрузите файл ключа (pem) и не забудьте сделать бэкап, чтобы все операции не пришлось выполнять заново.
- После того, как сохранили файл, запустите инстанс кнопкой Launch Instances
Шаг 3. Подключение корневого диска с восстанавливаемой машины к временному инстансу
Сначала необходимо отключить диск от оригинального инстанса и подключить его к временному. Так как это корневой диск, перед его отключением оригинальный инстанс придется остановить.
- Перейдите в консоль EC2 в раздел Instances и выберите оригинальный инстанс (его можно определить по записанному ранее Instance ID либо по имени, которое отличается от того которое вы указали при создании временного инстанса).
Далее в меню Actions — Instance State — Stop.
Внимание! Когда останавливается инстанс, все данные на локальных хранилищах (Amazon EC2 Instance Store) стираются. Если у вас есть данные на таких томах, позаботьтесь об их сохранности, перенеся их на постоянное хранилище, если это необходимо.
- После того как инстанс остановлен, переходите в раздел Elastic Block Store — Volumes и выбирайте корневой том оригинального инстанса. Его можно определить по сохраненному Volume ID либо основываясь на информации из колонки Attachment Information, в которой содержится название инстанса.
Далее в меню Actions — Detach Volume - Подключите этот том к временному инстансу. Для этого выберите его снова, далее в меню Actions — Attach Volume и в появившемся диалоговом окне укажите ваш временный инстанс.
После чего нажимайте Attach. В случае, если оригинальный инстанс создавался через AWS Marketplace AMI и раздел содержит коды AWS Marketplace, вы получите ошибку, в которой говорится о том, что нельзя подключить раздел с кодами к работающему инстансу.
В этом случае остановите наш временный инстанс и заново выполните действия по подключению корневого тома оригинального инстанса к временному инстансу. Вторая попытка должна быть удачной.
- Теперь вы должны увидеть, что оба диска подключены к временному инстансу.
- Если вы останавливали инстанс, запустите его:
- Перейдите в раздел Instances в навигационной панели
- Выберите временный инстанс
- Далее в меню Actions — Instance State — Start.
Шаг 4. Подготовка ключей для подключения к инстансу по SSH
Пользователям Linux нет необходимости генерировать какие-то дополнительные ключи. Необходимо лишь дать права на чтение этого файла:
chmod 400 my-keypair.pem
- Откройте PuTTYgen (устанавливается вместе с PuTTY)
- Выберите в параметрах RSA 2048 бит
- Загрузите сохраненный pem-ключ нажав Load (Load an existing private key file)
- Укажите парольную фразу (key passphrase) и подтвердите её (confirm passphrase). Это делать не обязательно, но так безопасней. Разница будет лишь в том, что при подключении с использованием этого ключа всегда будет предлагаться ввести эту фразу, чтобы подтвердить вход
- Сохраните файл с тем названием, которое вы указали при создании пары ключей (KeyPair) в процессе создания временного инстанса (название совпадает с именем pem-ключа)
Ключ готов.
Шаг 5. Подключение к временному инстансу по SSH
Подключитесь по 22 порту с использованием ключа. Имя пользователя зависит от того, какой AMI использовался при создании инстанса. Его вы записывали в самом начале. Возможны следующие имена пользователей:
- Amazon Linux 2 или Amazon Linux AMI — ec2-user
- Centos AMI — centos
- Debian AMI — admin или root
- Fedora AMI — ec2-user или fedora
- RHEL AMI — ec2-user или root
- SUSE AMI — ec2-user или root
- Ubuntu AMI — ubuntu
- Для остальных, если имена ec2-user и root не работают — обратитесь к поставщику AMI
Название хоста, к которому надо подключаться, — user@aws-host.amazon.com, где user — имя, которое описано выше, а aws-host.amazon.com — ip-адрес вашего инстанса, который можно найти на вкладке детальной информации (с неё вы в самом начале сохраняли параметры). Параметр называется IPv4 Public IP. Обратите внимание, что если вы не используете Elastic IP, при каждом старте инстанса у него будет новый ip-адрес.
- Запустите PuTTY
- В поле Host Name адрес в формате имя_пользователя@ip-адрес
- Перейдите в раздел Connection — SSH — Auth и загрузите ppk-ключ (Private key file for authentication)
- Нажмите Open и затем согласитесь доверять серверу
- Если вы указывали парольную фразу (passphrase) при создании ppk-ключа, введите её, чтобы подтвердить вход:
Using username "ubuntu". Authenticating with public key "imported-openssh-key" Passphrase for key "imported-openssh-key":
- Вы на сервере.
Шаг 6. Копирование ключей с временного инстанса на оригинальный
Смонтируйте том, который вы подключили к временному инстансу, чтобы вы могли получить доступ к его файловой системе.
/dev/sdf
(может отображаться по-разному на вашем инстансе), используйте следующие операции для монтирования тома в /mnt/tempvol
:- Определите названия разделов подключенного диска:
[user ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvda 202:0 0 10G 0 disk L-xvda1 202:1 0 10G 0 part / xvdf 202:80 0 10G 0 disk L-xvdf1 202:81 0 10G 0 part
/dev/xvda1
и/dev/xvdf1
— разделы дисков. У/dev/xvdf1
не указана точка монтирования (MOUNTPOINT), значит это раздел диска, который мы подключили ранее.
- Создайте временную директорию для монтирования раздела:
[user ~]$ sudo mkdir /mnt/tempvol
- Смонтируйте раздел в созданный каталог:
[user ~]$ sudo mount /dev/xvdf1 /mnt/tempvol
Скопируйте SSH-ключи с временного инстанса на смонтированный раздел.
Внимание! Используйте имя пользователя, которое указано в командной строке. Это необходимо, так как несмотря на то, что вы успешно подключились со стандартным именем пользователя, которое зависит от операционной системы (описано в шаге 5), в AMI из AWS Marketplace оно может быть другим после входа. Например, для AMI WordPress Certified by Bitnami при входе по SSH используется стандартный логин для Ubuntu —
ubuntu
. Однако имя пользователя после входа в систему — bitnami
ubuntu
, используйте следующую команду для копирования:[user ~]$ cp .ssh/authorized_keys /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
Если у вас нет прав на редактирование файлов в
/mnt/tempvol
, то скопируйте файлы с использованием sudo
и проверьте права, чтобы удостовериться, что вы сможете зайти на оригинальный инстанс:- Проверьте права на файл:
[user ~]$ sudo ls -l /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
total 4
-rw------- 1 200 500 392 Aug 15 00:06 authorized_keys
В примере, 200 — это ID пользователя и 500 — ID группы.
- Перезапустите команду копирования ключей с использованием
sudo
:
[user ~]$ sudo cp .ssh/authorized_keys /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
- Проверьте, не изменились ли права на файл:
[user ~]$ sudo ls -l /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
Если права изменились, восстановите их:
[user ~]$ sudo chown 200:500 /mnt/tempvol/home/ubuntu/.ssh/authorized_keys
Отмонтируйте раздел:
[user ~]$ sudo umount /mnt/tempvol
Шаг 7. Запуск инстанса с восстановленным доступом по SSH
- В консоли EC2 выберите диск, который вы подключали к временному, и в меню: Actions — Detach Volume. Дождитесь, пока состояние (state) диска станет available (можете использовать кнопку Refresh для обновления информации).
Не забудьте предварительно остановить инстанс, если раздел содержит коды AWS Marketplace.
- Для этого же диска перейдите в меню Actions — Attach Volume
- Выберите оригинальный инстанс и укажите имя корневого диска, которое вы записали в самом начале.
Изображение кликабельно
Нажмите Attach
- Запустите инстанс
- Для EC2-classic: если для оригинального инстанса был настроен Elastic IP, переассоциируйте его с ним:
- Перейдите в раздел Elastic IP на навигационной панели
- Выберите адрес Elastic IP, который вы записали в самом начале
- Далее Actions — Associate address
- Выберите ID оригинального инстанса и нажмите Associate
Шаг 8. Проверка доступа
Подключитесь к инстансу с восстановленным доступом с помощью созданного ключа.
Если имя новой пары ключей отличается от того, который был ранее, убедитесь, что вы подключаетесь с использованием нового приватного ключа.
Шаг 9. Завершающий этап
Если вы создавали новый временный инстанс для того, чтобы выполнить все операции, а не использовали уже существующий, остановите его, если он вам больше не нужен:
- Перейдите в раздел Instances на навигационной панели
- Выберите временный инстанс
- Далее в меню Actions — Instance State — Terminate
Таким образом вы восстановили доступ к Linux Amazon EC2 инстансу.
Комментарии (9)
yusman
15.08.2018 17:35Есть более простой способ зайти на машину, оффициально видео от AWS www.youtube.com/watch?v=XfOsytNUq1w
Xordal Автор
15.08.2018 19:31Спасибо, добавил в статью, как самый простой способ. Но у него есть несколько ограничений, которые не являются проблемой в остальных способах:
- Не работает в случае, если повреждены права на директорию
/home
- Не работает, если дистрибутив не поддерживает cloud-init директивы (не уверен, что в амазоне такие есть)
begemoth3663
16.08.2018 10:22Не знаю, а чего вы [с амазоном] решили, что user-data будет исполняться НЕ первый бут?
- Не работает в случае, если повреждены права на директорию
celebrate
15.08.2018 21:13Помню, я как-то на целой пачке машин Ансиблом сделал ошибку синтаксиса в одном из /etc/sudoers.d файлов. Я уже серьезно думал, что машины придется удалять. К счастью там крутился Кубернетес и привилегированные контейнеры спасли меня.
vanyas
16.08.2018 10:10Амазазон так и не сделал нормальную «физическую» (vnc к примеру) консоль к виртуалке, чтобы можно было к примеру бутнуться в single-user mode?
begemoth3663
16.08.2018 10:25стильно/модно/молодёжно — vnc консоль…
по COM-порту что трудно было сделать?
ан нет: вывод в COM-порт дают, ввод — балалайка...
begemoth3663
16.08.2018 10:39n.b. слава богам, что у автора в подписи не devops…
непонятно, как такая проблема вообще может возникать (что совершенно не значит, что похожее не приходилось решать — но это было сознательное погружение в дебри).
Immutable Infrastructure.
EC2 instance — расходный материал: прибили, развернули terraform'ом, всё.
по желанию — накатили нужное "горячо любимым" ansible'ом.Xordal Автор
16.08.2018 11:05На самом деле ситуация была такая: собрался поковырять Wordpress (до этого никогда его не трогал, т.к. работаю с .net-стеком) и в процессе создания инстанса по мануалу не сделал ключ умышленно (как и написано в инструкции), чтобы разобраться как его потом добавить.
На следующем экране предстоит настроить параметры использования пар ключей. Пары ключей определяют возможность подключения к инстансам EC2 с помощью терминальной программы, используя Secure Shell (SSH). Выберите вариант Proceed without a key pair и установите флажок, подтверждающий, что вы знаете, что этот ключ понадобится вам для доступа к инстансу EC2.
Собственно, в результате и появилось это пошаговое руководство. Оно рассчитано на новичков, которые по тому же самому мануалу от Amazon создадут инстанс, а потом понадобиться получить к нему доступ.
Softer
Главное чтобы хранилище не было эфемерным… Как сейчас не знаю, но когда-то поймался на таком…
Кстати этот способ работает не только для AWS (например если grub и bios под паролем ;) ) :)