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

AWS Elastic Beanstalk使用PHP和私有Composer存储库,php,github,amazon-web-services,composer-php,amazon-elastic-beanstalk,Php,Github,Amazon Web Services,Composer Php,Amazon Elastic Beanstalk,在PHP环境中部署Amazon AWS Elastic Beanstalk时,如何利用私有编写器存储库?特别是使用GitHub(Q&A风格,回答如下)我们需要为我们通过AWS的Elastic Beanstalk(EB)部署的一个PHP项目使用一个私有库。这个私有库托管在GitHub上,尽管类似的git托管(您自己的服务器、BitBucket等)可能具有类似的身份验证,并且可以使用此解决方案进行部署 我们使用SSH凭据访问私有git存储库。因为我们使用的是GitHub,所以我们使用了GitHub的

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

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

我们使用SSH凭据访问私有git存储库。因为我们使用的是GitHub,所以我们使用了GitHub的部署密钥(deploykeys),这些密钥允许对特定存储库进行只读访问,这非常适合我们的需要。评估适合您需求的最佳解决方案,GitHub列出了每种方法的优缺点

我们选择的解决方案将部署密钥嵌入到存储库中。这有点安全漏洞。我们正在处理所有私人回购协议,使用(理想情况下)安全的服务器,但这仍然有一点安全风险

所有这些最终都会对使用Elastic Beanstalk部署PHP堆栈的方式造成一些麻烦,composer.json过早地自动运行,而且密钥事先没有到位。我们找到了解决办法

这假设您已经有了部署设置,但只是停留在部署密钥上。我们使用AWS提供的eb cli工具(eb init、eb branch、eb start等)来启动和运行,以及git hook、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文件保存在存储库中,因为它锁定在测试中使用的版本中。当我们移动到生产环境时,我们确保应用程序使用我们测试的相同库运行。需要供应商文件夹才能诱使EB不自动运行composer.phar安装过程。我们需要等待ssh密钥到位

设置密钥:我找不到一个好方法来关联密钥并通过脚本接受github.com作为已知的\u主机。最后,我使用半部署的软件对EB托管服务器进行了SSHing,将id_rsa和id_rsa.pub密钥文件添加到~root/.ssh/(记住400次!),然后尝试
ssh-Tgit@github.com
(正如github建议的那样)这将提示接受主机并向~root/.ssh/known_hosts文件添加一个条目。将此文件的内容复制到您正在处理项目的位置

我们正在.ebextensions/文件夹中创建所有安装脚本,以配置Linux服务器进行部署。在预部署阶段之后,此文件夹将从服务器中删除(据我所知)。我们使用的是PHP5.5 64位AmazonAMI解决方案。将id_rsa和id_rsa.pub密钥移动到新的.ebextensions文件夹中。另外,将名为known_hosts的文件添加到包含前面提供的known_hosts内容的文件夹中。现在我们有了所需的3个文件,我们需要创建一个最终的部署说明文件:01-github-deploy-keys.config(根据需要命名文件)

记住YAML文件使用4个空格,而不是制表符!请参阅AWS文档了解这些container_命令的工作原理:它们将在从存储库中提取文件后运行。“container_commands”部分中的这些命令具有项目的工作目录,因此首选本地路径

添加所有需要添加并提交到存储库的文件。运行git aws.push进行部署

为了正确测试设置,您需要从EB解决方案堆栈中删除服务器并重新添加。我只是进入EC2控制面板,找到这个项目的托管服务器并终止它。EB将自动为您创建一个新的,并在准备好后连接。仔细检查日志,特别是/var/log/cfn init.log部分。此时最好关闭通过安全组对服务器的SSH访问。我相信EB限制通过SSH进行root登录,但只是为了确保您可能希望通过防火墙/安全组一起禁用SSH访问。您不需要ssh到各个框中进行配置,因为它们应该被视为易失性的

这是2014年2月20日的问答,请发表任何评论或修复


谢谢,-Seth

TLDR:在composer.json上使用~/.composer/auth.json、github-oauth,或者创建如下自定义脚本:


这是我的02-github-deploy-keys.config文件。它正在工作。唯一的解决方法是禁用StrictHostKeyChecking。但是,如果愿意,可以在脚本运行后打开StrictHostKeyChecking

我在Git中添加了/vendor(没有任何文件),以在键正常之前阻止AWS自动运行Composer。为此,我在/vendor内创建了一个.gitignore文件,其中包含以下内容:

*
!.gitignore
我将密钥(id_rsa)存储在一个S3存储桶中,在这里我允许“授权”人员读取文件,但您可以将文件放在github存储库中。这些密钥是在计算机用户()上生成的

我只是想指出,通过将此添加到composer.json中,有一种更简单(可能风险更大)的方法:

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

还有第三种方法我没有测试,但是您可以创建一个~/.composer/auth.json,并且composer可能会理解您的标记。

我很难做到这一点。我在AWS CodeCommit中得到了回购协议,并一直在寻找阻力最小的路径来解决它。我尝试了~/.composer/auth.json,但似乎在我可以将文件放置到位之前就已经运行了composer,等等

我选择了一种包括供应商目录的方法
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"
"config": {
   "github-oauth": {
        "github.com": "YOUR-OAUTH-KEY"
    }
}