Подтвердить что ты не робот

Настройка частного доступа Github с использованием эластичного бобового стека AWS и контейнера Ruby

Следуя недавнему руководству по настройке AWS Elastic Beanstalk для развертывания Ruby с помощью Git, я просто настроил среду Elastic Beanstalk с моего CI-сервера. Однако приложение не удалось запустить. Я просмотрел журналы, чтобы обнаружить, что bundle install не удалось найти сообщение об ошибке.

Извлечение git @github.com: example/private-repository.git Ошибка проверки ключа хоста. фатальный: удаленный конец неожиданно повесил трубку [Ошибка 31mGit: команда git clone '[email protected]: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 содержит ссылки на gemified plugins, размещенные на пару принадлежащих мне частных репозиториев на Github. Что-то вроде

gem 'somegemname',: git = > 'git @github.com: example/private-repository.git'

У меня возникли аналогичные проблемы с развертываниями Capistrano, которые были решены путем настройки ssh_options[:forward_agent] = true.

Контейнер Ruby AWS Elastic Beanstalk поддерживает пользовательскую конфигурацию через пользовательские .config файлы, помещенные под .ebextensions. Будет ли в этом случае помощь SSG для прямого агента? Существуют ли другие альтернативы для доступа к частному хранилищу Github при запуске среды с эластичным beanstalk?

Обновление 1: Я просто проверил для пользователя, с которым инициирован bundle install. Выяснилось, что script /opt/elasticbeanstalk/hooks/appdeploy/pre/10_bundle_install.sh запускает bundle install как root пользователя. Я попытался создать SSH-ключ в /root/.ssh и добавил его в ключ-ключ к ключам Github Deploy для этого репозитория. Пока не повезло. Теперь попробуем добавить SSH pub-key в мою учетную запись пользователя в Github, чтобы она применима ко всем частным репозиториям, доступным через мою учетную запись Github.

4b9b3361

Ответ 1

После хорошего дня усилий я, наконец, включил использование моей частной организации 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://[email protected]/myorganization/[email protected]

При запуске eb-deploy вы можете tail -f /var/log/eb-activity.log убедиться, что все выполняется гладко.

Ответ 2

Вот как я, наконец, это сделал. Все о настройке SSH-ключа для пользователя, который отвечает за фазу bundle install.

  • Запустите среду для приложения в AWS Elastic Beanstalk
  • Дополнительно - Войдите в консоль Amazon EC2 и измените тип экземпляра на желаемое значение
  • Обновить имя пары SSH для включения удаленного входа SSH. (Я уверен, что при запуске среды должен быть указан тип экземпляра и имя пары ключей SSH).
  • Ищите недавно запущенный экземпляр либо в консоли EC2, либо через CLI, обратите внимание на полное доменное имя (FQDN) для этого экземпляра. Экземпляры EB похожи на любой другой экземпляр, который вы создадите с помощью Amazon EC2. Войдите через SSH в этот экземпляр.
  • Выполните следующие команды для создания SSH-ключа для пользователя root

    $sudo su - root

    $ssh-keygen -t rsa -C "[email protected]"

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

    eval `ssh-agent

    eval ssh-add ~/.ssh/id_rsa

  • Обратите внимание на открытый ключ SSH E.g.: ~/.ssh/id_rsa.pub и добавьте его в набор SSH-ключей для учетной записи 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

Надеюсь, это поможет другим, кто застрял. Я был бы рад увидеть более грациозное решение, чем это.

Ответ 3

Если вы спешите, и ваше репо-приложение также является приватным, вы можете создать дополнительную учетную запись пользователя Github и назначить ей привилегии только для чтения для репо, содержащего драгоценный камень.

Затем передайте узел https url с новыми учетными данными:

gem 'somegemname', git: "https://username:[email protected]/example/privaterepository"

Ответ 4

Существует два подхода к аутентификации с помощью GitHub. Я рекомендую связать вашу личную учетную запись GitHub с частным репозиторией GitHub в любом случае.

Первый подход передает те же учетные данные ssh, которые вы используете локально для push, pull и т.д. из удаленного репозитория GitHub - вы загрузили свой открытый ключ для своей личной учетной записи и того, что использует GitHub. Чтобы эта работа работала на другом сервере, вам нужно запустить ssh-agent и использовать ssh-add, чтобы добавить свой ключ к агенту, - тогда ваши личные учетные данные GitHub могут использоваться для выполнения команд git.

Второй подход заключается в том, чтобы позволить удаленным серверам (серверам), к которым вы развертываетесь, иметь доступ к GitHub - это может быть эластичный beanstalk или ваш фактический сервер (ы). Создайте ключ ssh без пароля на сервере (ssh-keygen -t rsa, принимайте значения по умолчанию, или, возможно, EB имеет собственный способ), затем скопируйте сгенерированное содержимое открытого ключа и создайте новый "ключ развертывания", содержащий этот ключ в вашем репозитории GitHub - вам нужно быть администратором, который, как я полагаю, вы есть. Установленный ключ развертывания позволит пользователям EB регистрироваться на удаленном сервере и выполнять git pull и связанные с ним команды (только для чтения) с сервера.

Я думаю, что первый метод более изящный и более легко управляемый, поскольку количество серверов, которые вы развертываете, растет, но какой метод вы используете, может зависеть от вариантов EB.