我们需要为通过 AWS 的 Elastic Beanstalk (EB) 部署的 PHP 项目之一使用私有库。这个私有库托管在 GitHub 上,尽管类似的 git 托管(您自己的服务器、BitBucket 等)可能具有类似的身份验证,并且可以使用此解决方案进行部署。
We used SSH 凭证获取私有 git 存储库。由于我们使用的是 GitHub,因此我们使用GitHub 部署密钥 (https://help.github.com/articles/managing-deploy-keys#deploy-keys)这些密钥允许对特定存储库进行只读访问,这非常适合我们的需求。评估最适合您需求的解决方案,GitHub 列出了每种方法的优缺点。
我们选择的解决方案将部署密钥嵌入到存储库中。这是一个安全漏洞。我们正在处理所有私有存储库,并使用(理想情况下)安全的服务器,但这仍然存在一定的安全风险。
所有这一切最终都给 PHP 堆栈与 Elastic Beanstalk 的部署方式带来了一些麻烦,composer.json 过早自动运行,而且密钥事先没有就位。我们找到了一个解决方法。
这假设您已经有了部署设置,但只是停留在部署密钥上。我们使用 AWS 提供的 eb cli 工具(eb init、eb Branch、eb start 等)来启动和运行,并使用 git hooks、git aws.push 进行部署。
一旦我们有了部署密钥,我们就可以将我们的库添加到我们的作曲家.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 的好方法。我最终通过 SSH 连接到已部署一半软件的 EB 托管服务器,将 id_rsa 和 id_rsa.pub 密钥文件添加到 ~root/.ssh/ (记住 400 个权限!),然后尝试ssh -T [email protected]
(按照 github 的建议)这将提示接受主机并向 ~root/.ssh/known_hosts 文件添加一个条目。将此文件的内容复制到您正在处理项目的位置。
我们正在创建所有设置脚本.ebextensions/文件夹来配置 Linux 服务器以进行部署。在预部署阶段后,此文件夹将从服务器中删除(据我所知)。我们使用 PHP 5.5 64 位 Amazon AMI 解决方案。将 id_rsa 和 id_rsa.pub 密钥移至新的 .ebextensions 文件夹中。还添加一个名为已知主机到我们之前提供的包含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 进入各个盒子进行配置,因为它们应该被视为易失性的。
这是2014年2月20日写的问答,如有意见或修正请留言。
谢谢,-赛斯