Настройка частного доступа к 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 фаза.

  1. Запустите среду для приложения в AWS Elastic Beanstalk
  2. Необязательно: войдите в консоль Amazon EC2 и измените тип экземпляра на нужное значение
  3. Обновите имя пары ключей SSH, чтобы разрешить удаленный вход по SSH. (Я уверен, что должен быть способ указать тип экземпляра и имя пары ключей SSH при запуске среды)
  4. Найдите только что запущенный экземпляр в консоли EC2 или через интерфейс командной строки. Запишите полное доменное имя (FQDN) для этого экземпляра. Экземпляры EB похожи на любой другой экземпляр, который вы создали бы в Amazon EC2. Войдите через SSH к этому экземпляру.
  5. Выполните следующие команды, чтобы создать ключ SSH для root пользователь

    $ sudo su - root

    $ ssh-keygen -t rsa -C "some-email@yourdomain.com"

  6. редактировать .bash_profile явно начать ssh-agent и добавьте только что созданный ключ SSH. Добавьте следующие строки (это может показаться ненужным, я сделал это просто для уверенности)

    eval `ssh-agent

    Eval ssh-add ~/.ssh/id_rsa

  7. Обратите внимание на открытый ключ SSH, например: ~/.ssh/id_rsa.pub и добавьте его в набор SSH Keys для учетной записи Github, которая имеет доступ к частным репозиториям

  8. На данный момент ваш экземпляр имеет доступ к вашим личным репозиториям Github. Вы можете проверить это, выдав git clone в этих хранилищах, войдя в систему как root пользователь.

  9. Создайте AMI из этого экземпляра, используя стандартные методы

  10. Вернитесь к своей панели инструментов AWS Elastic Beanstalk и найдите Edit Configuration вариант в среде вашего приложения. в Server вкладку, найдите опцию, которая позволяет вам указать Custom AMI, Обновите это поле с помощью вновь созданного идентификатора AMI, например: ami-4324fd4,

  11. Сохранить конфигурацию, нажав 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 в качестве переменных среды в вашей среде эластичных бобов.

Другие вопросы по тегам