部署到负载均衡器后面的EC2实例; PHPStorm + GitHub

时间:2016-02-19 19:35:24

标签: amazon-web-services github amazon-ec2 load-balancing amazon-elb

我知道这已经在很多地方得到了部分答案,但答案是如此......整个地图,日期都没有得到很好的解释。截至2016年2月,我正在寻找最佳做法

设置:

基于PHP的RESTful应用程序服务,它位于EC2实例中。 EC2实例将S3用于上传的用户数据(图像文件),将RDS MySql用于其DB(这两点并不特别重要。)

我们在PHPStorm开发,我们的源代码控制是GitHub。部署时,我们只使用PHPStorm的内置SFTP部署将文件直接上传到EC2实例(我们的Staging环境有一个实例,生产环境有另一个实例)。我经常部署到Staging 非常。可能一天20次。我只需点击PHPStorm中的一个文件,然后说“部署到Staging'”进行SFTP传输。或者,我可能只需点击整个项目,然后点击“部署到暂存”即可。 - 上传中排除了某些文件夹和文件,这是PHPStorm部署配置的一部分。

最近,我把我的EC2实例放在Load Balancer后面。我这样做是因为我可以通过证书管理器利用亚马逊的免费SSL产品,证书管理器不支持单独的EC2实例。

所以,现在,还有一个Load Balancer,后面只有一个EC2实例。我维护一个指向EC2实例的弹性IP,以便我可以直接访问它(参见我上面的当前部署方法)。

问题:

我还没有勇气在我的Load Balancer后面创建额外的(克隆)EC2实例,因为我不确定应该如何部署它们。想到了一些想法,但他们都非常讨厌。

鉴于上述情况,目前最顺畅,最好的方式 A)快速将代码库部署到负载均衡器后面的一组EC2实例, B)实际上克隆'我当前的EC2实例,用于创建其他实例。

尽管事实上我已经完成了一些(技术性很强的)建议,但我还是无法在脑海中清晰地描绘出上述情况。

谢谢!

1 个答案:

答案 0 :(得分:2)

您需要将您的EC2实例视为100%可有可无。意思是,它可以在任何时候终止,你不应该在乎。替换EC2实例将启动并接管工作。

有三种方法可以实现这一目标:

方法1:每个部署都会创建一个新的AMI图像。

部署应用程序时,将其部署到工作人员EC2实例,该实例的唯一目的是设置"设置"你的应用程序。部署新版本后,您可以从EC2实例创建新的AMI映像,并使用新的AMI映像更新Auto Scaling启动配置。旧的EC2实例终止并替换为新代码。

新的EC2实例已经有最新的代码,因此可以将它们添加到负载均衡器中。

方法2:每个部署都是针对实例外存储(如Amazon S3)完成的。

EC2实例将从Amazon S3下载最新代码并在启动时安装。

因此,为了使新代码生效,您将终止旧实例,并启动新实例以替换开始使用新代码的实例。

这可以通过滚动更新方式或蓝/绿部署完成。

方法3:与方法2类似,但这次实例有一些智能,可以发信号通知下载和安装代码。

这样,您就不需要终止实例:现有实例被告知从S3更新,并且他们自己这样做。

可能有用的一些工具包括:

  • 厨师
  • Ansible
  • CloudFormation

<强>更新

方法2&amp; 3都以&#34; basic&#34;开头。 AMI,配置为从S3提取网页资产。此AMI不会因您的网站版本而异。

例如,AMI可以安装Apache和PHP,并在启动时从S3中提取.php网站资产并将它们放入/var/www/html

CloudFormation适用于此。此外,对于方法3,您可以使用cfn-hup等待更新信号。发出信号后,它会从S3中提取更新的资产。

另一种可能性是使用Elastic Beanstalk,它可用于为您管理所有这些。

<强>更新

要从Git获取AMI图像,请尝试以下操作:

  1. 设置一个EC2实例,其中包含您需要为Web应用安装的所有内容
  2. 安装Git并设置本地仓库准备好Git pull
  3. 关闭并创建实例的AMI。
  4. 部署时,请执行以下操作:

    1. Git push到GitHub
    2. 根据您的AMI图片启动新的EC2实例。
    3. 作为用户数据的一部分(在EC2实例启动期间指定),请指定以下内容:

      #!/bin/sh
      cd /git/app
      git pull
      ; copy files from repo to web folder
      composer install
      

      完成此操作后,该用户数据将作为首次启动时运行的脚本。