ответ

5

Нам нужно было использовать частную библиотеку для одного из наших проектов PHP, которые мы развертывали с помощью эластичного бобового стека AWS (EB). Эта частная библиотека размещена на GitHub, хотя подобный git-хостинг (ваш собственный сервер, BitBucket и т. Д.), Вероятно, имеет аналогичную аутентификацию и может использовать это решение для развертывания.

Мы использовали SSH credentials, чтобы попасть в частный git-репозиторий. Поскольку мы используем GitHub, мы использовали Развертывание ключей GitHub (https://help.github.com/articles/managing-deploy-keys#deploy-keys) Эти ключи позволяют доступ только для чтения к определенному репозиторию, который идеально подходит для наших нужд. Оцените наилучшее решение для ваших нужд, GitHub имеет большие плюсы и минусы, перечисленные для каждого метода.

Наше выбранное решение включает ключ развертывания в репозиторий. Это немного дыра в безопасности. Мы имеем дело со всеми частными репозиториями, с (идеально) безопасными серверами, но это по-прежнему представляет собой угрозу безопасности.

Все это в конечном итоге стало чем-то вроде хлопот с тем, как стек PHP был развернут с помощью Elastic Beanstalk, а композитор.json автоматически запускался слишком рано, а ключи не были на месте заранее. Мы нашли обходное решение.

Предполагается, что у вас уже есть настройка развертывания, но они просто застревают при развертывании ключей. Мы использовали инструменты eb cli, предоставляемые AWS (eb init, eb branch, eb start и т. Д.), Чтобы все было в порядке, а также git hooks, git aws.push для развертывания.

После того, как у нас есть наши Deploy ключи, мы можем добавить нашу библиотеку к нашему composer.json файл, используя SSH адрес:

{ 
... 
"require": { 
     "repository/project": ">=1.0.0" 
}, 
... 
"repositories": [ 
    { 
     "type": "git", 
     "url": "[email protected]:repository/project.git" 
    } 
] 
} 

Настройка вашего .gitignore поэтому файл composer.lock привержен и в вашем хранилище, а также папки поставщика без его содержимое:

[remove composer.lock from file if it exists] 
vendor/* 

Мы предпочитаем держать файл composer.lock в хранилище в любом случае, как он запирает в т он использовал версию. Когда мы переходим в производственную среду, мы гарантируем, что приложение работает с теми же библиотеками, которые мы тестировали. Папка поставщика должна обманывать EB, чтобы не запускать процесс установки composer.phar. Нам нужно, чтобы мы подождали, пока у нас не будут ключи ssh.

Настройка ключей: я не смог найти хороший способ связать ключ и принять github.com как known_host через скрипты. Я закончил SSHing с управляемым сервером EB с программным обеспечением, развернутым наполовину, добавил файлы ключа id_rsa и id_rsa.pub в корневой каталог/.ssh/(с 400 perms помните!), Затем попробуйте ssh -T [email protected] (как рекомендует github). Это приведет к подсказке принять хост и добавить запись в файл ~ root/.ssh/known_hosts. Скопируйте содержимое этого файла туда, где вы работаете над проектом.

Мы создаем все сценарии установки в папке .ebextensions/ для настройки сервера Linux для развертывания. Эта папка удаляется (из того, что я могу сказать) с сервера после этапа предварительного развертывания. Мы используем 64-битное AMI-решение Amazon для PHP 5.5. Переместите ключи id_rsa и id_rsa.pub в новую папку .ebextensions.Также добавьте файл с именем known_hosts в папку с содержимым known_hosts, которое мы предоставили ранее. Теперь, когда у нас есть 3 файла нам нужно, мы должны создать конечный файл инструкции по развертыванию: 01-GitHub-Deploy-keys.config (имя файла, как вам нравится)

container_commands: 
    11-move-priv-key: 
     command: "mv ~root/.ssh/id_rsa ~root/.ssh/id_rsa.bak; cp .ebextensions/id_rsa ~root/.ssh/id_rsa; chmod 400 ~root/.ssh/id_rsa;" 
    12-move-pub-key: 
     command: "mv ~root/.ssh/id_rsa.pub ~root/.ssh/id_rsa.pub.bak; cp .ebextensions/id_rsa.pub ~root/.ssh/id_rsa.pub; chmod 400 ~root/.ssh/id_rsa.pub;" 
    12-known-hosts: 
     command: "mv ~root/.ssh/known_hosts ~root/.ssh/known_hosts.bak; cp .ebextensions/known_hosts ~root/.ssh/known_hosts; chmod 644 ~root/.ssh/known_hosts;" 
    20-install-composer: 
     command: "./composer.phar install;" 

Запомнить YAML файлы использования 4 пробела, а не вкладки! См. Документацию AWS о том, как эти команды container_commands работают: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-ec2.html#customize-containers-format-commands Они будут запускаться после выталкивания файлов из репозитория. Эти команды в разделе «container_commands» имеют рабочий каталог вашего проекта, поэтому предпочтительны локальные пути.

Добавить все эти файлы необходимо добавить и зафиксировать в репозитории. Запустите git aws.push для развертывания.

Для правильной проверки установки вам необходимо удалить сервер из стека решений EB и повторно добавить его. Я просто зашел в панель управления EC2 и нашел управляемый сервер для этого проекта и прекратил его. EB автоматически создаст новый для вас и прикрепит его, когда он будет готов. Дважды проверьте свои журналы, в частности раздел /var/log/cfn-init.log. Вероятно, лучше всего отключить SSH-доступ к серверам через группу безопасности на этом этапе. Я полагаю, что EB ограничивает входные данные для входа в SSH, но только для того, чтобы убедиться, что вы можете отключить доступ SSH вместе через брандмауэр/группы безопасности. Вам не нужно ssh в отдельных ящиках для конфигурации, поскольку они должны рассматриваться как изменчивые.

Это было написано как Q & A на 2014-02-20, пожалуйста, оставляйте любые комментарии или исправления.

Спасибо, - Сет

+0

Примечания: GitHub ключи Deploy фактически позволяют полный доступ на чтение/доступ к единому хранилищу –

+0

команд написать: removeHost: команда: 'SSH-keyscan -R github.com' addHost: команда: «SSH-keyscan -t rsa github.com> /root/.ssh/known_hosts ' – PachinSV

3

TLDR: Используйте ~/.composer/auth.json, GitHub-OAuth на composer.json, или создать собственный сценарий, как показано ниже:


Этот это мой файл 02-github-deploy-keys.config. Он работает прямо сейчас. Единственным обходным решением было отключить StrictHostKeyChecking. Но вы можете включить StrictHostKeyChecking после того, как этот скрипт запускается, если хотите.

Я добавил/продал (без каких-либо файлов) Git, чтобы остановить AWS от автозапуска Composer до того, как ключи были в порядке. Для этого я создал .gitignore файл внутри/поставщика, с этим:

* 
!.gitignore 

Я хранения ключей (id_rsa) на ведро S3, где я позволил «Авторизованный» людей, чтобы прочитать файл, но вы можете поместить файл в свой репозиторий github. Эти ключи были сгенерированы пользователем машины (https://developer.github.com/guides/managing-deploy-keys/#machine-users).

files: 
    "/home/ec2-user/sshgit/composer.sh": 
     mode: "00755" 
     owner: ec2-user 
     group: ec2-user 
     encoding: plain 
     content: | 
      if [ ! -f /home/ec2-user/id_rsa ] ; then 
       aws s3 cp s3://eb-files/id_rsa /home/ec2-user/id_rsa 
       chmod 0400 /home/ec2-user/id_rsa 
      fi 

      eval `ssh-agent -s` 
      ssh-add /home/ec2-user/id_rsa 

      echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config 

      export COMPOSER_HOME=/root 
      COMPOSER_HOME=/root 
      /opt/elasticbeanstalk/support/composer.phar install --no-interaction 

container_commands: 
    01-run-composer: 
     command: "/home/ec2-user/sshgit/composer.sh" 

Просто хотелось бы отметить, что есть более простой (может быть рискованнее) способ сделать это, добавив в composer.json:

"config": { 
    "github-oauth": { 
     "github.com": "YOUR-OAUTH-KEY" 
    } 
} 

И есть третий путь, который я did't тест , но вы можете создать ~/.composer/auth.json, и композитор, вероятно, поймет ваши токены там.

0

Я боролся с этим. У меня есть РЕПО в AWS CodeCommit, и он искал путь наименьшего сопротивления для его решения. Я пробовал ~/.composer/auth.json, но кажется, что композитор запускается, прежде чем я смогу получить файл на месте и т. Д. И т. Д.

Я пошел на подход, который включает каталог поставщика в моем репо (избавиться от папок .git внутри, чтобы он не обрабатывал их как подмодули), и все это затем публикуется в Elastic Beanstalk через zip-файл, включая это папка.

Смежные вопросы