AWS Elastic Beanstalk 将 PHP 与私有 Composer 存储库结合使用

2023-11-23

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


我们需要为通过 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日写的问答,如有意见或修正请留言。

谢谢,-赛斯

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Elastic Beanstalk 将 PHP 与私有 Composer 存储库结合使用 的相关文章

  • 在值中包含换行符

    我有一个 Word 模板 其中 php 代码中定义了值 在PHP代码中 document gt setValue Value1 value1 在word模板中 Value1 如何将包含两个值之间的断线的值包含在单词的值中 Replace n
  • .htaccess 异常导致主目录出现问题

    这是我的目录结构 localhost or livehost app bootstrap public vendor code demo 这是我的 htaccess
  • 如何将 HTML 转换为 Markdown?

    我有一个类似 stackoverflow 的网站 有一个文本区域 人们可以在其中写答案 我用这个 PHP 库 http parsedown org 转换降价 我的意思是我使用该函数来转换 italic to i italic i inclu
  • 第三个下拉菜单不从数据库填充

    我有以下 Index php
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • PHP Solr PECL 扩展安装

    我已经使用命令安装了 pecl solr pecl install solr 和梨使用 wget http pear php net go pear phar php go pear phar 重启Apache后 我仍然收到错误 Fatal
  • S3.getSignedUrl 接受多种内容类型

    我正在使用react s3 uploader节点包 它接受一个signingUrl用于获取用于将对象存储到 S3 中的signedUrl 目前 我已经配置了一个 lambda 函数 带有 API 网关端点 来生成此signedUrl 经过一
  • 使用 XSLT 将 XML 转换为 SQL

    由于我无法控制的原因 我将获得一个 XML 文件和一个 XSLT 文件 该文件可以将 XML 文件转换为 SQL 代码或错误 现在让我们假设我们可以信任提供 XML 文件的人不会在 XML 中包含危险的构造 我什至不知道是否应该使用 Sim
  • 如何使用 GitHub API 一次检索多个用户?

    我能够获取单个用户 或自某个时间戳以来创建的所有用户 或者与 GitHub API 进行某些搜索匹配的位置 https developer github com v3 users get a single user https develo
  • apache_request_headers() 与 $_SERVER

    据我所知 apache request headers 提供与以下相同的信息 SERVER 但按键略有不同 为什么有人应该使用apache request headers 而不仅仅是从那里获取这些信息 SERVER 我在 Centos 上使
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • Laravel leftJoin 仅右表的最后一条记录

    我是 Laravel 的新手 我有两张桌子 1 产品 2 价格 products id product int p key name varchar prices id price int p key id product int
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2

随机推荐

  • AttributeError:模块“tensorflow”没有属性“get_default_graph”

    我正在做一些与图像字幕相关的任务 并且我已经加载了像这样的初始模型的权重 model InceptionV3 weights imagenet 但我收到这样的错误 AttributeError module tensorflow has n
  • BinaryFormatter 忽略程序集版本

    我有以下方法来生成对象的哈希值 效果非常好 但是 当我更改程序集的版本时 即使对象相同 哈希值也会发生变化 public static string GetHash Object item MemoryStream memoryStream
  • 如何获取Java中特定包中的所有Class文件?

    正如描述所述 如何获取给定包名称的所有 Java 类文件的列表 我在 SO 和其他网站上看到了很多问题和方法来查找特定 Java 包中的所有类 大多数解决方案对我来说都不起作用 有时 他们处理 Jar 文件 但不处理文件夹中的 普通 Jav
  • SSH 的 java.sql.Connection 扩展 [重复]

    这个问题在这里已经有答案了 我有一个位于防火墙后面的 MySQL 数据库 只能通过 SSH 连接访问 有谁知道 java sql Connection 的实现 它允许我与该数据库建立 SSH 连接 您可以使用 SSH 的端口转发来执行此操作
  • templateUrl 不适合我

    我按照 angular io 入门项目使用种子结构 到目前为止一切正常 现在我想更改顶部组件以从单独的文件中查看视图 但我遇到了麻烦 工作代码是 import Component View from angular2 core Compon
  • 不带括号的构造函数调用[重复]

    这个问题在这里已经有答案了 有什么区别吗 var obj1 new Constructor and var obj2 new Constructor 鉴于Constructor是构造函数吗 根据MDN docs new foo 相当于 ne
  • 是否可以确定哪个 Fortran 编译器生成了“.mod”文件?

    假设我的机器上已经安装了一个软件包 我想弄清楚是否需要重新生成模块包含文件 mod 使它们与我的其余编译兼容 有什么办法可以做到这一点吗 我在某些时候遇到了类似的问题 涉及库和模块文件 但没有源 因为在某些情况下 获得正确的编译器比获得重新
  • 使用AppDelegate共享数据

    我找到了一些资料来解释如何使用 AppDelegate 在 iOS 应用程序中的对象之间共享数据 我已经很轻松地实现了它 并且对于我的情况来说这看起来是一个很好的方法 思考什么could使用 AppDelegate 完成 我想知道应该在哪里
  • 在史莱姆中加载新的依赖项?

    我正在使用 emacs 和 swank clojure 我如何解决以下情况 我已向 project clj 添加了新的依赖项 我在 shell 中运行 lein deps 来获取新的 dep 我有一个打开的现有史莱姆会话 并且想要使用新部门
  • Windows PowerShell 在哪里设置 $profile?

    我想移动我的默认 My Documents WindowsPowerShell 文件夹 但是 当我尝试这样做时 PowerShell 当然找不到 profile 是否有一个文件或其他内容可以编辑以将 PowerShell 指向不同的启动文件
  • 当 ajax 调用更改其值时,AngularJS 中的 ng-repeat 列表不会更新

    我完全糊涂了 当 ajax 调用更改其值时 为什么我的 ng repeat 不刷新 我在这里看到了很多问答 但没有一个谈到ajax调用 HTML div class row div class col xs 4 col sm 4 col m
  • 从泛型转换为特定子类

    我有一堂这样的课 public class MyClass
  • 闪亮的数据表:在新窗口中弹出有关所选行的数据

    我有一个闪亮的数据表 当用户选择某一行时 我想在新窗口中根据所选行显示一些其他数据 我尝试使用shinyBS包 但如果没有操作按钮我就无法使用它 而且我不想包含操作按钮 我希望在选择一行时显示弹出窗口 有任何想法吗 mymtcars hea
  • Android 资源 txt 文件的路径

    我正在做 FileReader fin new FileReader file android asset myFile txt 在 Android 项目和许多变体中 在运行时我得到一个文件未找到异常 该文件在资产文件夹中存在且正确 因此我
  • 在 Chrome 中,为什么 SVGforeignObjects 不缩放相对定位的内容?

    我在 SVG 中使用相对定位的 HTML 元素foreignObject 然而 在 Chrome 中 相对定位的内容并不尊重scale or viewBox 因此 它的尺寸不合适 这是我在 jsFiddle 上遇到的问题的示例 所有三个文本
  • 如何在 Django 中编辑和删除数据?

    我正在使用 django 1 0 并且我已经使用 Django 书中的示例创建了我的模型 我能够执行添加数据的基本功能 现在我需要一种检索该数据的方法 将其加载到表单中 change form 或其他东西 EDIT它并将其保存回数据库 其次
  • 出现错误 EBUSY:资源繁忙或锁定

    尝试运行 Nodejs 应用程序来测试 Raspberry 3 B Gpio Onoff 模块 但当我尝试运行该应用程序时出现此错误 fs js 114 throw err Error EBUSY resource busy or lock
  • 如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?

    我们怎样才能让 MS JDBC 驱动程序在 n 秒后抛出超时错误 背景 我们有一个应用程序 默认情况下使用 Microsoft JDBC 驱动程序 版本 4 0 来查询 SQL Server 2014 大多数时候 查询需要 10 20 秒才
  • 错误:未找到genymotion虚拟化引擎[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我不断收到以下错误 未找到 genymotion 虚拟化引擎 无法加载 VirtualBox 引擎 请帮我解决这个错误 我已经尝试过所有选项 1 重新安装genymotion和vir
  • AWS Elastic Beanstalk 将 PHP 与私有 Composer 存储库结合使用

    在 PHP 环境中使用 Amazon AWS Elastic Beanstalk 进行部署时 如何利用私有 Composer 存储库 具体使用GitHub 问答风格 答案如下 我们需要为通过 AWS 的 Elastic Beanstalk