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

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 使用 PHP 和私有 Composer 存储库【英文标题】:AWS Elastic Beanstalk using PHP with Private Composer Repositories 【发布时间】:2014-03-22 00:35:28 【问题描述】:

php 环境中使用 Amazon AWS Elastic Beanstalk 进行部署时,如何利用私有 Composer 存储库?具体使用GitHub(问答风格,答案如下)

【问题讨论】:

【参考方案1】:

我们需要为通过 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 来部署。

一旦我们有了部署密钥,我们就可以使用 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 作为 known_host 的好方法。我最终通过 SSH 连接到一半部署了软件的 EB 托管服务器,将 id_rsa 和 id_rsa.pub 密钥文件添加到 ~root/.ssh/ (记得有 400 个权限!)然后尝试 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 个空格,而不是制表符!有关这些 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 登录,但只是为了确保您可能希望通过防火墙/安全组一起禁用 SSH 访问。您不需要将 ssh 放入单独的框进行配置,因为它们应该被视为易变的。

这是 2014 年 2 月 20 日的问答,请发布任何 cmets 或修复。

谢谢,- 赛斯

【讨论】:

注意:github 部署密钥实际上允许对单个存储库进行完全读/写访问 命令:removeHost:命令:'ssh-keyscan -R github.com' addHost:命令:'ssh-keyscan -t rsa github.com > /root/.ssh/known_hosts' 我收到 /bin/sh: ./composer.phar: 没有这样的文件或目录。有什么想法吗?【参考方案2】:

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,composer 可能会在那里理解你的令牌。

【讨论】:

【参考方案3】:

我为此苦苦挣扎。我在 AWS CodeCommit 中有存储库,并且正在寻找阻力最小的路径来解决它。我尝试了 ~/.composer/auth.json 但似乎在我可以将文件放置到位之前运行 composer 等等。

我采用了一种方法,其中包括我的 repo 中的供应商目录(删除其中的 .git 文件夹,以便它不会将它们视为子模块),然后整个内容通过 zip 文件发布到 Elastic Beanstalk,包括文件夹。

【讨论】:

以上是关于AWS Elastic Beanstalk 使用 PHP 和私有 Composer 存储库的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 上禁止使用 Django 403

AWS Elastic Beanstalk

使用 AWS CodeBuild 和 EB CLI 部署到 AWS Elastic Beanstalk

Elastic Beanstalk (AWS) 的休眠配置

如何使用 Elastic beanstalk 和 Dockerrun.aws.json 正确部署到 AWS?

AWS 和 Elastic Beanstalk