Вопрос или проблема
Я пытаюсь настроить готовый шаблон terraform для проведения тестов производительности. Он создает два экземпляра EC2 в одной группе размещения кластера и предустанавливает множество инструментов. Я заранее не знаю SSH-открытые ключи пользователей и предпочел бы не требовать от пользователей копировать и вставлять открытые ключи в файл terraform перед его применением.
Для тестирования производительности мне потребуется копировать файлы туда и обратно на экземпляр, т.е. исходный код на экземпляры и flamegraphs или логи обратно на локальную машину. SSH является стандартным решением, но, как уже упоминалось, оно требует настройки SSH-открытых ключей. Другим вариантом было бы создание случайного S3-ведра и использование AWS CLI для копирования файлов туда и обратно, но это потребовало бы два этапа для копирования каждого файла, т.е. в S3, а затем либо на локальную машину, либо на EC2 экземпляр.
Мой вопрос: Есть ли способ копировать файлы, используя AWS CLI, например, SSM на EC2 экземпляр? Что-то, что требует только наличия AWS-учетных данных, т.е. что уже потребуется для выполнения terraform.
Вы можете просто использовать те же pem-ключи, которые вы использовали при создании экземпляра ec2, с командой scp для копирования файлов туда и обратно на экземпляр.
Вы можете. Этапы:
-
На экземпляре EC2 сначала нужно установить netcat:
sudo yum install nmap-ncat
-
Затем (по-прежнему на экземпляре) отправьте файл, который вы хотите загрузить, на слушающий экземпляр ncat:
nc -l localhost 5678 < <имя_файла>
-
На вашей локальной машине запустите tcp-туннель к экземпляру ec2, используя SSM:
aws ssm start-session --target <ec2_instance_id> \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["localhost"],"portNumber":["5678"], "localPortNumber":["5678"]}'
-
С вышеуказанными двумя командами, слушающими, на отдельном терминале вашей локальной машины загрузите файл:
nc localhost 5678 > <имя_выходного_файла>
. Это предполагает, что у вас также есть netcat доступен локально.
Номера портов (5678) должны быть свободны. Если вы получите ошибку, что порт уже используется, выберите другой номер порта.
Экземпляры netcat завершат работу, как только загрузка будет завершена. Вам нужно будет вручную выйти из туннеля ssm, нажав CTRL-c, когда он выбран.
Вы можете загрузить файл на экземпляр EC2 тем же образом, но поменяйте местами перенаправления ввода и вывода у netcat.
Однако туннель SSM был довольно медленным в моих тестах. Я получил скорость только около 700 КБ/с через туннель, хотя моё интернет-соединение и сеть экземпляра EC2 были намного быстрее.
Ответ или решение
Копирование файлов на/с EC2 инстанса с использованием SSM: Подробный гид
Вам нужно передавать файлы на и с EC2 инстанса, не используя SSH или S3? С помощью AWS Systems Manager (SSM) и netcat
(ncat) это возможно. Данная инструкция объясняет, как можно настроить SSM для передачи файлов с минимальными усилиями и без необходимости в SSH-ключах.
Предварительные требования
-
EC2 инстансы: Убедитесь, что ваши EC2 инстансы имеют установленный агент SSM и имеют соответствующие IAM-права, позволяющие выполнение SSM-команд.
-
Установленный netcat: Вам необходимо установить
netcat
на ваших инстансах. Это можно сделать с помощью команды:sudo yum install nmap-ncat
-
AWS CLI: Убедитесь, что AWS CLI настроен на вашем локальном компьютере с правильными учетными данными.
Шаги для передачи файлов
Передача файла с локального компьютера на EC2 инстанс
-
Запустите netcat для приема файла на EC2 инстансе. Выполните следующую команду в вашем SSH-сеансе к инстансу:
nc -l localhost 5678 > <имя_файла>
Здесь
<имя_файла>
— это имя файла, который вы хотите сохранить на инстансе. -
Создание TCP-туннеля через SSM. На локальной машине выполните команду:
aws ssm start-session --target <идентификатор_ec2> \ --document-name AWS-StartPortForwardingSessionToRemoteHost \ --parameters '{"host":["localhost"],"portNumber":["5678"], "localPortNumber":["5678"]}'
Замените
<идентификатор_ec2>
на идентификатор вашего EC2 инстанса. -
Перенос файла с локальной машины. Откройте новый терминал на локальной машине и выполните:
nc localhost 5678 < <путь_к_вашему_файлу>
Теперь файл будет передан на ваш инстанс.
Копирование файла с EC2 инстанса на локальную машину
-
Запустите netcat для отправки файла на EC2 инстансе. В вашем SSH-сеансе выполните команду:
nc -l localhost 5678 < <имя_файла_для_отправки>
-
Создание TCP-туннеля через SSM. На локальной машине выполните аналогичную команду (как и в предыдущем случае).
-
Загрузка файла на локальную машину. В новом терминале выполните:
nc localhost 5678 > <имя_входящего_файла>
После выполнения этих шагов файл будет скачан на ваш локальный компьютер.
Возможные проблемы и советы
- Скорость передачи: Обратите внимание, что скорость передачи по SSM может быть ниже ожидаемой. В таких случаях убедитесь, что ваше соединение стабильное и нет лишних загруженных ресурсов.
- Конфликт портов: Если вы получите сообщение об ошибке, что порт уже занят, попробуйте использовать другой номер порта.
- Завершение сеанса: После завершения передачи файлов не забудьте вручную завершить SSM-сеанс, нажав
CTRL+C
.
Заключение
Используя SSM и netcat
, вы сможете эффективно обмениваться файлами между вашим локальным компьютером и EC2 инстансом без необходимости использования SSH или S3. Этот подход предоставляет гибкость и упрощает процесс взаимодействия с EC2 инстансами, не требуя предварительной настройки SSH-ключей.