使用PHP与私有Composer存储库的AWS Elastic Beanstalk

fou*_*r43 7 php github amazon-web-services composer-php amazon-elastic-beanstalk

在PHP环境中使用Amazon AWS Elastic Beanstalk进行部署时,如何使用私有编写器存储库?特别使用GitHub(Q&A风格,回答如下)

fou*_*r43 6

我们需要为我们通过AWS的Elastic Beanstalk(EB)部署的PHP项目使用私有库.这个私有库托管在GitHub上,虽然类似的git托管(您自己的服务器,BitBucket等)可能具有类似的身份验证,并且可以使用此解决方案进行部署.

我们使用SSH凭据来获取私有git存储库.由于我们使用的是GitHub,我们使用了GitHub的Deploy Keys(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进行部署.

获得Deploy Keys后,我们可以使用SSH地址将库添加到composer.json文件中:

{
...
"require": {
        "repository/project": ">=1.0.0"
},
...
"repositories": [
    {
        "type": "git",
        "url":  "git@github.com:repository/project.git"
    }
]
}
Run Code Online (Sandbox Code Playgroud)

配置你的.gitignore,以便在你的存储库和没有它内容的vendor文件夹中提交composer.lock文件:

[remove composer.lock from file if it exists]
vendor/*
Run Code Online (Sandbox Code Playgroud)

我们更喜欢将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;"
Run Code Online (Sandbox Code Playgroud)

记住YAML文件使用4个空格,而不是标签!有关这些container_commands如何工作的信息,请参阅AWS文档: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-02-20的问答,请发表任何评论或修正.

谢谢, - 赛斯