部署到负载均衡器后面的 EC2 实例; PHPStorm + GitHub
Deploying to EC2 instances behind a load balancer; PHPStorm + GitHub
我知道这个问题在很多地方都得到了部分回答,但答案是如此……遍布地图、过时且没有得到很好的解释。我正在寻找截至 2016 年 2 月的最佳实践。
设置:
基于 PHP 的 RESTful 应用程序服务,存在于 EC2 实例中。 EC2实例使用S3上传用户数据(图片文件),RDS MySql DB(这两点不是特别重要。)
我们在PHPStorm开发,我们的源码控制是GitHub。当我们部署时,我们只是使用 PHPStorm 的内置 SFTP 部署将文件直接上传到 EC2 实例(我们有一个实例用于我们的暂存环境,另一个实例用于我们的生产环境)。我经常 非常 部署到 Staging。可能一天20次。我只需单击 PHPStorm 中的一个文件并说 'deploy to Staging',它会执行 SFTP 传输。或者,我可能只单击整个项目并单击 'deploy to Staging' - 某些文件夹和文件被排除在上传之外,这是 PHPStorm 部署配置的一部分。
最近,我将我们的 EC2 实例置于负载均衡器之后。我这样做是为了通过不支持单个 EC2 实例的证书管理器利用亚马逊的免费 SSL 产品。
所以,现在有一个负载均衡器,它后面只有一个 EC2 实例。我维护了一个指向 EC2 实例的弹性 IP,以便我可以直接访问它(参见上面我当前的部署方法)。
问题:
我还没有勇气在我的负载均衡器后面创建额外的(克隆)EC2 实例,因为我不确定我应该如何部署到它们。想到了一些想法,但它们都很老套。
鉴于上述情况,目前最顺利和最好的方法是 A) 将代码库快速部署到负载均衡器后面的一组 EC2 实例,并且 B) 实际上 'clone' 我当前的 EC2 实例要创建额外的实例。
尽管我已经阅读了一些(高度技术性的)建议,但我还无法真正在脑海中清晰地描绘出上述内容。
谢谢!
您需要将 EC2 实例视为 100% 可有可无。意思是,它可以随时终止,你不应该在意。替换的 EC2 实例将启动并接管工作。
有 3 种方法可以实现:
方法 1:每次部署都会创建一个新的 AMI 映像。
当您部署您的应用程序时,您将其部署到一个工作 EC2 实例,该实例的唯一目的是 "setup" 您的应用程序。部署新版本后,您可以从 EC2 实例创建一个新的 AMI 映像,并使用新的 AMI 映像更新您的 Auto Scaling 启动配置。旧的 EC2 实例被终止并替换为新代码。
新的 EC2 实例上已经有最近的代码,因此它们已准备好添加到负载均衡器。
方法2:每次部署都在实例外存储(如Amazon S3)上完成。
EC2 实例将从 Amazon S3 下载最新代码并在启动时安装它。
因此,要使新代码生效,您需要终止旧实例并启动新实例以替换开始使用新代码的实例。
这可以以滚动更新的方式或作为 blue/green 部署来完成。
方法三:与方法二类似,但这次实例有一些智能,可以发出信号下载并安装代码。
这样,您不需要终止实例:现有实例会被告知从 S3 更新,它们会自行执行。
一些可能有用的工具包括:
- 厨师
- Ansible
- CloudFormation
更新:
方法 2 和 3 均以 "basic" AMI 开始,该 AMI 配置为从 S3 中提取网页资产。此 AMI 不会因您网站的不同版本而改变。
例如,AMI 可以安装 Apache 和 PHP,并在启动时从 S3 中提取 .php 网站资产并将它们放入 /var/www/html
.
CloudFormation 对此非常有效。另外,对于方法三,可以使用cfn-hup
等待更新信号。发出信号后,它将从 S3 中提取更新的资产。
另一种可能性是使用 Elastic Beanstalk,它可以为您管理所有这些。
更新:
要从 Git 中提取 AMI 映像,请尝试以下操作:
- 设置一个 EC2 实例,其中安装了您需要为 Web 应用程序安装的所有内容
- 安装 Git 并为
Git pull
设置本地存储库。
- 关闭并创建实例的 AMI。
部署时,执行以下操作:
Git push
到 Git 中心
- 根据您的 AMI 映像启动一个新的 EC2 实例。
作为用户数据的一部分(在 EC2 实例启动期间指定),指定如下内容:
#!/bin/sh
cd /git/app
git pull
; copy files from repo to web folder
composer install
像这样完成后,该用户数据将作为一个脚本在首次启动时 运行。
我知道这个问题在很多地方都得到了部分回答,但答案是如此……遍布地图、过时且没有得到很好的解释。我正在寻找截至 2016 年 2 月的最佳实践。
设置:
基于 PHP 的 RESTful 应用程序服务,存在于 EC2 实例中。 EC2实例使用S3上传用户数据(图片文件),RDS MySql DB(这两点不是特别重要。)
我们在PHPStorm开发,我们的源码控制是GitHub。当我们部署时,我们只是使用 PHPStorm 的内置 SFTP 部署将文件直接上传到 EC2 实例(我们有一个实例用于我们的暂存环境,另一个实例用于我们的生产环境)。我经常 非常 部署到 Staging。可能一天20次。我只需单击 PHPStorm 中的一个文件并说 'deploy to Staging',它会执行 SFTP 传输。或者,我可能只单击整个项目并单击 'deploy to Staging' - 某些文件夹和文件被排除在上传之外,这是 PHPStorm 部署配置的一部分。
最近,我将我们的 EC2 实例置于负载均衡器之后。我这样做是为了通过不支持单个 EC2 实例的证书管理器利用亚马逊的免费 SSL 产品。
所以,现在有一个负载均衡器,它后面只有一个 EC2 实例。我维护了一个指向 EC2 实例的弹性 IP,以便我可以直接访问它(参见上面我当前的部署方法)。
问题:
我还没有勇气在我的负载均衡器后面创建额外的(克隆)EC2 实例,因为我不确定我应该如何部署到它们。想到了一些想法,但它们都很老套。
鉴于上述情况,目前最顺利和最好的方法是 A) 将代码库快速部署到负载均衡器后面的一组 EC2 实例,并且 B) 实际上 'clone' 我当前的 EC2 实例要创建额外的实例。
尽管我已经阅读了一些(高度技术性的)建议,但我还无法真正在脑海中清晰地描绘出上述内容。
谢谢!
您需要将 EC2 实例视为 100% 可有可无。意思是,它可以随时终止,你不应该在意。替换的 EC2 实例将启动并接管工作。
有 3 种方法可以实现:
方法 1:每次部署都会创建一个新的 AMI 映像。
当您部署您的应用程序时,您将其部署到一个工作 EC2 实例,该实例的唯一目的是 "setup" 您的应用程序。部署新版本后,您可以从 EC2 实例创建一个新的 AMI 映像,并使用新的 AMI 映像更新您的 Auto Scaling 启动配置。旧的 EC2 实例被终止并替换为新代码。
新的 EC2 实例上已经有最近的代码,因此它们已准备好添加到负载均衡器。
方法2:每次部署都在实例外存储(如Amazon S3)上完成。
EC2 实例将从 Amazon S3 下载最新代码并在启动时安装它。
因此,要使新代码生效,您需要终止旧实例并启动新实例以替换开始使用新代码的实例。
这可以以滚动更新的方式或作为 blue/green 部署来完成。
方法三:与方法二类似,但这次实例有一些智能,可以发出信号下载并安装代码。
这样,您不需要终止实例:现有实例会被告知从 S3 更新,它们会自行执行。
一些可能有用的工具包括:
- 厨师
- Ansible
- CloudFormation
更新:
方法 2 和 3 均以 "basic" AMI 开始,该 AMI 配置为从 S3 中提取网页资产。此 AMI 不会因您网站的不同版本而改变。
例如,AMI 可以安装 Apache 和 PHP,并在启动时从 S3 中提取 .php 网站资产并将它们放入 /var/www/html
.
CloudFormation 对此非常有效。另外,对于方法三,可以使用cfn-hup
等待更新信号。发出信号后,它将从 S3 中提取更新的资产。
另一种可能性是使用 Elastic Beanstalk,它可以为您管理所有这些。
更新:
要从 Git 中提取 AMI 映像,请尝试以下操作:
- 设置一个 EC2 实例,其中安装了您需要为 Web 应用程序安装的所有内容
- 安装 Git 并为
Git pull
设置本地存储库。 - 关闭并创建实例的 AMI。
部署时,执行以下操作:
Git push
到 Git 中心- 根据您的 AMI 映像启动一个新的 EC2 实例。
作为用户数据的一部分(在 EC2 实例启动期间指定),指定如下内容:
#!/bin/sh
cd /git/app
git pull
; copy files from repo to web folder
composer install
像这样完成后,该用户数据将作为一个脚本在首次启动时 运行。