Настройка частного доступа к Github с помощью контейнера AWS Elastic Beanstalk и Ruby
Продолжая недавнее руководство по настройке AWS Elastic Beanstalk для развертывания Ruby с помощью Git, я просто настроил среду Elastic Beanstalk со своего CI-сервера. Однако приложение не удалось запустить. Я просмотрел логи и обнаружил, что bundle install
не удалось с сообщением об ошибке.
Загрузка git@github.com: example / private-repository.git Ошибка проверки ключа хоста. Неустранимый: удаленный конец неожиданно зависает [ошибка 31mGit: команда
git clone 'git@github.com:example/private-repository.git' "/var/app/ondeck/vendor/cache/ruby/1.9.1/cache/bundler/git/private-repository-e4bbe6c2b13bb62664e39e345c1b01d80017934c" --bare --no-hardlinks
в каталоге /var/app/ondeck не удалось.[0m
Gemfile
моего приложения Rails содержит ссылки на плагины с самоопределением, размещенные в паре моих собственных частных репозиториев на Github. Что-то вроде
gem 'somegemname',:git => 'git@github.com:example/private-repository.git'
Я сталкивался с подобными проблемами при развертывании Capistrano, которые были решены путем настройки ssh_options[:forward_agent] = true
,
Контейнер AWS Elastic Beanstalk Ruby поддерживает пользовательскую настройку через пользовательские .config
файлы, размещенные под .ebextensions
, Поможет ли в этом случае настройка форвардного агента SSH? Существуют ли другие альтернативы для доступа к частному репозиторию Github при запуске среды Elastic Beanstalk?
Обновление 1: я только что проверил пользователя, с которым bundle install
инициируется. Обнаружил, что скрипт /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh
начинается bundle install
как root
пользователь. Я попытался создать ключ SSH под /root/.ssh
и добавил его ключ публикации в ключи Github Deploy для этого хранилища. Пока не повезло. Теперь попробую добавить паб-ключ SSH в мою учетную запись пользователя на Github, чтобы он применялся ко всем частным репозиториям, доступным через мою учетную запись Github.
5 ответов
После хорошего рабочего дня я наконец-то включил использование личных репозиториев GitHub своей организации с Elastic Beanstalk, просто используя .config
файл. Я использую Python и pip
, но он также должен работать для других установщиков пакетов на EB.
rhetonik-х ssh-agent
+ssh-add
Подход не работал для меня вообще, поэтому я решил вместо этого настроить файл конфигурации ssh.
Вот мой .ebextensions/3-pip-install-from-github.config
файл:
files:
"/root/.ssh/config":
owner: root
group: root
mode: "000600"
content: |
Host github.com
User git
Hostname github.com
IdentityFile /root/.ssh/github
"/root/.ssh/known_hosts":
owner: root
group: root
mode: "000644"
content: |
#
# paste output of `ssh-keyscan -H github.com` here
#
commands:
01-command:
command: sudo aws s3 cp s3://bucket-with-your-github-ssh-key/github /root/.ssh
02-command:
command: sudo chmod 600 /root/.ssh/github
Грубые инструкции:
Установите корзину S3, доступную для вашего экземпляра EB. Внутри этого хранилища храните ключ SSH, позволяющий получить доступ к репозиторию GitHub, к которому вы хотите получить доступ через
pip
,npm
,bundle
и т. д. Используйтеsudo aws s3 cp
скопировать этот ключ на ваш экземпляр EB при развертывании.sudo
необходимо, потому что сценарии EB используютroot
и неec2-user
,Этот файл конфигурации ebextensions также создает 2 файла на вашем экземпляре EB.
/root/.ssh/config
говоритssh
(вызываетсяpip
а такжеgit
) использовать ключ, который вы скопировали с S3. Вставка выводаssh-keyscan -H github.com
в/root/.ssh/known_hosts
предварительно проверим, чтоssh
на вашем EB экземпляр фактически общается с GitHub, чтобы избежать MITM-атак. Это лучше, чем отключитьStrictHostKeyChecking
в/root/.ssh/config
,
Вот мой requirements.txt
файл для pip
:
Beaker==1.7.0
Flask==0.10.1
Jinja2==2.7.3
MarkupSafe==0.23
# [...]
git+ssh://git@github.com/myorganization/myprivaterepo.git@0.0.142
Во время бега eb-deploy
, вы можете tail -f /var/log/eb-activity.log
чтобы убедиться, что все идет гладко.
Вот как я наконец это сделал. Это все о настройке ключа SSH для пользователя, который отвечает за bundle install
фаза.
- Запустите среду для приложения в AWS Elastic Beanstalk
- Необязательно: войдите в консоль Amazon EC2 и измените тип экземпляра на нужное значение
- Обновите имя пары ключей SSH, чтобы разрешить удаленный вход по SSH. (Я уверен, что должен быть способ указать тип экземпляра и имя пары ключей SSH при запуске среды)
- Найдите только что запущенный экземпляр в консоли EC2 или через интерфейс командной строки. Запишите полное доменное имя (FQDN) для этого экземпляра. Экземпляры EB похожи на любой другой экземпляр, который вы создали бы в Amazon EC2. Войдите через SSH к этому экземпляру.
- Выполните следующие команды, чтобы создать ключ SSH для
root
пользователь$ sudo su - root
$ ssh-keygen -t rsa -C "some-email@yourdomain.com"
редактировать
.bash_profile
явно начатьssh-agent
и добавьте только что созданный ключ SSH. Добавьте следующие строки (это может показаться ненужным, я сделал это просто для уверенности)eval `ssh-agent
Eval
ssh-add ~/.ssh/id_rsa
Обратите внимание на открытый ключ SSH, например:
~/.ssh/id_rsa.pub
и добавьте его в набор SSH Keys для учетной записи Github, которая имеет доступ к частным репозиториямНа данный момент ваш экземпляр имеет доступ к вашим личным репозиториям Github. Вы можете проверить это, выдав
git clone
в этих хранилищах, войдя в систему какroot
пользователь.Создайте AMI из этого экземпляра, используя стандартные методы
Вернитесь к своей панели инструментов AWS Elastic Beanstalk и найдите
Edit Configuration
вариант в среде вашего приложения. вServer
вкладку, найдите опцию, которая позволяет вам указатьCustom AMI
, Обновите это поле с помощью вновь созданного идентификатора AMI, например:ami-4324fd4
,Сохранить конфигурацию, нажав
Apply Changes
, AWS Elastic Beanstalk начнет развертывать новые экземпляры в вашей среде и завершать работу старых. Это сделано для того, чтобы все ваши автоматически масштабируемые экземпляры имели ключ SSH в белом списке, необходимый для частного доступа к Github.
После того, как вышеуказанные шаги будут выполнены, вы можете продолжить и развернуть приложение Rails с git aws.push
Надеюсь, что это помогает другим, кто застрял. Я был бы рад увидеть более изящное решение, чем это.
Если вы спешите, и ваше хранилище приложений также является частным, вы можете создать дополнительную учетную запись пользователя Github и назначить ей привилегии только для чтения для хранилища, содержащего гем.
Затем предоставьте сборщику URL-адрес https с учетными данными новой учетной записи:
gem 'somegemname', git: "https://username:password@github.com/example/privaterepository"
Существует два подхода к аутентификации с помощью GitHub. Я рекомендую связывать вашу личную учетную запись GitHub с частным репозиторием GitHub в любом случае.
Первый подход передает те же учетные данные ssh, которые вы используете локально для передачи, извлечения и т. Д. Из удаленного репозитория GitHub - вы загрузили свой открытый ключ для своей личной учетной записи, и это то, что использует GitHub. Чтобы это работало при работе на другом сервере, вам нужно иметь ssh-agent
работает и использует ssh-add
чтобы добавить свой ключ к агенту - тогда ваши личные учетные данные GitHub могут быть использованы для выполнения команд git.
Второй подход - разрешить удаленному серверу (-ам), на котором вы развертываете, доступ к GitHub - это может быть эластичный beanstalk или ваш реальный сервер (-ы). Создайте пароль без пароля на сервере (ssh-keygen -t rsa
, примите значения по умолчанию, или, возможно, у EB есть свой собственный путь), затем скопируйте сгенерированное содержимое открытого ключа и создайте новый "ключ развертывания", содержащий этот ключ, в вашем репозитории GitHub - вы должны быть администратором, который, я полагаю, вам являются. Установленный ключ развертывания позволит пользователям EB заходить на удаленный сервер и делать git pull
и связанные команды (только для чтения) с сервера.
Я думаю, что первый метод более элегантен и более прост в управлении, поскольку число серверов, на которые вы развертываете, растет, но какой метод вы используете, может зависеть от параметров EB.
Удалите частные репозитории Github из вашего файла needs.txt и создайте сценарий для их установки с использованием переменных среды для имен пользователей и паролей.
файл: project-root / install-extra-requirements.sh
#!/bin/sh
source /opt/python/run/venv/bin/activate
python ".extra-requirements.py"
файл: project-root /.extra-needs.py
import os
def main():
github_username = os.environ['GITHUB_USERNAME']
github_password = os.environ['GITHUB_PASSWORD']
repository = "git+https://%s:%s@github.com/yourgithubrepo" % (github_username, github_password)
os.system("pip install %s" % repository)
if __name__ == '__main__':
main()
файл: project-root/.ebextensions/002_container.config
container_commands:
01_install_extra_requirements:
command: './install-extra-requirements.sh'
Теперь вы можете просто установить GITHUB_USERNAME и GITHUB_PASSWORD в качестве переменных среды в вашей среде эластичных бобов.