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 存储库结合使用 的相关文章

  • PHP exec rm -Rf 不适用于子目录

    我试图删除特定文件夹中的所有内容 但它似乎不会影响子文件夹 但它应该 因为 bash 命令是从控制台执行的 system rm Rf some dir 该命令中不需要星号 如果要与文件一起删除目录 请同时删除斜杠 留下斜杠将删除文件 但保留
  • 如何计算 OpenID Connect 服务器的指纹?

    创建 OpenID Connect 提供商 例如 AWS 时 我需要指定一个指纹对于连接器 它是什么 我如何获得它 例如 从如何在不使用密钥的情况下将 GitHub 操作与 AWS 部署连接起来 https stackoverflow co
  • Doctrine 不会在 MySQL 中生成跨数据库外键约束

    我有两个表 db1 Contact 和 db2 Recipient 每个收件人都应该是联系人 因此我在 db1 Contact ContactID 字段上的两个表之间设置了外键 我在 Recipient php 中使用以下注释表示这一点 O
  • 如何在 RTMP 流中嵌入 pic_timing SEI 挂钟时间码?

    我需要将我的桌面流式传输到 AWS MediaLive 服务 并且根据要求 我必须在流中包含挂钟时间码 AWS 支持人员善意地通知我 对于 h 264 编码流 我需要提供时间码作为 pic timing SEI 消息 我在 Windows
  • 如何获取共同好友列表

    你好 我想知道如何才能找到共同的朋友 我目前在思考这个问题时遇到问题 我有一个名为 users 的表 它是这样的 id name 1 Kenny 2 Jack 3 Jimmy 4 Chris 5 Meg 6 Jake 7 Micheal 8
  • 如何在 Laravel 5.3 中进行自定义身份验证

    我在 Laravel 5 3 自定义身份验证中遇到问题 希望在检查时使用我自己的函数或页面Auth check 它返回false 这是用户控制器 namespace App Http Controllers use App User use
  • 如何区分两个同名的多选列表

    对于我正在构建的系统 我需要查看第一个列表中出现了哪些选项 通过 POST 请求 以及第二个列表中出现了哪些选项
  • drupal 7 将实际内容存储在数据库中的哪里?

    我打开了 drupal 7 的数据库并在表中查找node node revisions and node types并且找不到 drupal 存储实际的位置body节点 内容 的 有人有线索吗 哦 我刚刚找到了 在 D7 中 他们实现了字段
  • 将 Php 数组编码为 json [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想对我的 php 数组进行编码 A
  • 从存储库获取时,Doctrine 如何在不调用 __construct 方法的情况下创建实体?

    我在构造函数中编写了下一个代码 public function construct die creating entity 当我创建实体实例时new运算符如 entity new Entity 我看到creating entity text
  • PHP 使用今天的日期生成一个随机数

    我正在尝试为内容块 在网页上 分配一个随机生成的数字 该数字基于今天的日期 无论是什么 和固定数字 由于某种原因 输出的数字种类存在巨大差异 例如 当我在本地测试我的代码时 生成的数字对我来说足够好 正数 但在实际的实时服务器上时 它们通常
  • 数组到命名变量

    我该如何服用 userarray 这是一个数组 我知道它包含 3 个值 并将它们放入 3 个单独的变量中 而不是循环遍历 那里隔着 commas 所以爆炸会在某个地方发生 Say userfield1 userfield2 userfiel
  • 如何在按钮上执行mysql [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions PHP 单击按钮时如何执行 SQL
  • 正在 WordPress 中上传媒体,但显示错误“上传时发生错误。请稍后重试。”

    我试图在 WordPress 媒体上传中上传 jpeg 图像 上传时 显示错误 上传时发生错误 请稍后再试 上传时出现错误消息 但是当我重新加载页面时 图像显示在列表中 如下所示 重新加载页面后 所以 图片正在上传 这意味着不存在文件夹权限
  • https 重定向 laravel .htaccess 之后删除 /public

    我有一个 Laravel 页面部署在共享主机中 当我强制 http 请求重定向到 https 时 url 包含 public 我的根 htaccess 是 RewriteEngine on RewriteCond REQUEST URI p
  • 控制器 HMVC 内的 CodeIgniter 负载控制器

    我在用着http github com philsturgeon codeigniter template http github com philsturgeon codeigniter template 对于模板 我尝试将其他控制器视图
  • 作曲家和 Cygwin

    如果您尝试 全局 安装 Composer 则 Composer 无法在 Cygwin 中正确运行 将composer phar放入 usr local bin composer 然后尝试运行它会导致错误 Could not open inp
  • 带单引号的 XPATH 查询[重复]

    这个问题在这里已经有答案了 有人知道如何解决这个问题吗 单引号让我陷入困境 nodes xml gt xpath item contains catalog Billy s Blogs title 我尝试以各种方式逃避它 但都抛出错误 no
  • Laravel Redis 配置

    我目前正在使用 Laravel 和 Redis 创建一个应用程序 几乎一切都工作正常 我按照文档中的说明扩展了身份验证 用户可以订阅 登录 注销 我可以创建内容 所有内容都存储在 Redis 中 但我有一个问题 我无法运行 php arti
  • 在同一服务器上的 2 个子域中安装 2 个 WordPress 时共享用户

    我有 2 个 WordPress 网站 位于 2 个不同的子域中 例如test1 abc com and test2 abc com 这两个网站都激活了 wp require 插件 只有登录用户才能看到该网站 我们想要创建一个系统 如果用户

随机推荐

  • 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