在PHP环境中使用Amazon AWS Elastic Beanstalk进行部署时,如何利用私有作曲程序存储库?特别使用GitHub(Q& A风格,回答以下)
答案 0 :(得分:6)
我们需要为我们通过AWS的Elastic Beanstalk(EB)部署的PHP项目使用私有库。这个私有库托管在GitHub上,虽然类似的git托管(您自己的服务器,BitBucket等)可能具有类似的身份验证,并且可以使用此解决方案进行部署。
我们使用 SSH凭据来获取私有git存储库。由于我们使用的是GitHub,因此我们使用 GitHub的部署密钥(https://help.github.com/articles/managing-deploy-keys#deploy-keys)这些密钥允许对特定存储库进行只读访问,这非常适合我们的需求。根据您的需求评估最佳解决方案,GitHub针对每种方法列出了很多优缺点。
我们选择的解决方案将部署密钥嵌入到存储库中。这有点安全漏洞。我们正在处理所有私人回购,具有(理想情况下)安全服务器,但这仍然存在一定的安全风险。
所有这一切最终都与使用Elastic Beanstalk部署PHP堆栈的方式有点麻烦,composer.json过早地自动运行并且密钥未事先就位。我们找到了解决方法。
这假设您已经进行了部署设置,但只是部署了密钥。我们使用AWS提供的eb cli工具(eb init,eb branch,eb start等)来完成工作,以及git hooks,git aws.push进行部署。
获得部署密钥后,我们可以使用SSH地址将我们的库添加到 composer.json 文件中:
{
...
"require": {
"repository/project": ">=1.0.0"
},
...
"repositories": [
{
"type": "git",
"url": "git@github.com:repository/project.git"
}
]
}
配置 .gitignore ,以便提交composer.lock文件,并将其提交到您的存储库以及没有它的内容的供应商文件夹中:
[remove composer.lock from file if it exists]
vendor/*
我们更喜欢将composer.lock文件保存在存储库中,因为它会锁定测试中使用的版本。当我们迁移到生产环境时,我们确保应用程序运行时使用我们测试的相同库。必须使用vendor文件夹来欺骗EB,而不是自动运行composer.phar安装过程。我们需要等到我们有ssh密钥到位。
设置密钥:我找不到联系密钥的好方法,并通过脚本接受github.com作为known_host。我最终通过半部署的软件SSH连接到EB托管服务器,将id_rsa和id_rsa.pub密钥文件添加到~root / .ssh /(记住400 perms!)然后尝试ssh -T git@github.com
(如github推荐的那样) )这将提示接受主机并在~root / .ssh / known_hosts文件中添加一个条目。将此文件的内容复制到您正在处理项目的位置。
我们正在 .ebextensions / 文件夹中创建所有设置脚本,以配置Linux服务器以进行部署。在部署前阶段之后,从服务器中删除此文件夹(据我所知)。我们正在使用PHP 5.5 64位Amazon AMI解决方案。将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限制登录到root,但只是为了确保您可能希望通过防火墙/安全组一起禁用SSH访问。您不应该将ssh分成单独的框进行配置,因为它们应该被视为易失性。
这是作为Q& A在2014-02-20,请发表任何评论或修正。
谢谢, - 赛斯
答案 1 :(得分:3)
TLDR:在composer.json上使用〜/ .composer / auth.json,github-oauth,或创建如下所示的自定义脚本:
这是我的02-github-deploy-keys.config文件。它现在正在运作。唯一的解决方法是禁用StrictHostKeyChecking。但是,如果您愿意,可以在此脚本运行后打开StrictHostKeyChecking。
我将/ vendor(没有任何文件)添加到Git,以便在密钥正常之前阻止AWS自动运行Composer。为此,我在/ vendor中创建了一个.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"
}
}
还有我测试过的第三种方式,但你可以创建一个〜/ .composer / auth.json,而作曲家可能会理解你的令牌。
答案 2 :(得分:0)
我为此苦苦挣扎。我在AWS CodeCommit中获得了回购,并且正在寻找解决问题的阻力最小的路径。我试过了〜/ .composer / auth.json,但看起来在我可以将文件放到原位等之前运行了编辑器。
我选择了一个方法,其中包含我的repo中的供应商目录(删除.git文件夹,以便它不会将它们作为子模块进行处理)然后整个内容通过zip文件发布到Elastic Beanstalk包括那个文件夹。