我可以在自动缩放时使用 AWS code Deploy 来拉取应用程序代码吗?

Posted

技术标签:

【中文标题】我可以在自动缩放时使用 AWS code Deploy 来拉取应用程序代码吗?【英文标题】:Can I use AWS code Deploy for pulling application code while autoscaling? 【发布时间】:2015-01-10 06:19:18 【问题描述】:

我想在负载变高时自动扩展基础架构。我在AWS 上运行我的基础架构。我有一个要求,当autoscaling 发生时,我需要从Github 中提取应用程序代码。由于代码经常更改,我们不能使用AMI 并从AMI 启动实例。所以我想从repositories 中提取最新的代码。 AWS 刚刚推出了一项名为AWS CodeDeploy 的服务。 如何使用此服务在实例启动时自动执行拉取代码的过程?

附:我写了一个init script 来自动附加一个EIP,将该IP 列入不同安全组的白名单,并在实例启动时将实例置于load-balancer 之下,并在实例以自动缩放方式终止时撤销所有内容。

【问题讨论】:

【参考方案1】:

CodeDeploy 是您的问题的绝佳解决方案。如果配置正确,它可以自动部署到由 Autoscaling 启动的新 EC2 实例。要使其正常工作,您需要三件事:

    一个 Auto Scaling 组,用于启动安装并运行最新主机代理的实例。 配置为部署到该 Auto Scaling 组的 Code Deploy 部署组(作为 Auto Scaling 组而不是标签)。 自动部署到新实例的目标修订。如果没有目标修订,Code Deploy 将看到实例启动,但不会部署任何内容。

这里有一个可以帮助您入门的教程:Tutorial: Using AWS CodeDeploy to Deploy an Application to an Auto Scaling Group。该教程将引导您完成安装代理的烘焙 AMI 并设置部署组以将您的代码部署到新实例。

如果您确实烘焙了预安装了代理的 AMI,则需要使用代理版本定期更新该映像。安装代理后,它会自行更新,但如果 Code Deploy 不再支持代理版本,Auto Scaling 可能无法启动您的实例。对于实际生产使用,我建议不要烘焙 AMI,而是在您的实例启动时安装最新的代理。 (教程应该很快就会更新为使用这种方法。)

您可以将您的实例设置为在启动时自动下载并运行最新的安装程序。本质上,您在创建 Auto Scaling 组时将 shell 脚本粘贴为用户数据。

例如,我在 Amazon Linux 上测试了以下脚本(取自 Set Up a New Amazon EC2 Instance to Work with AWS CodeDeploy):

#!/bin/bash
yum -y update
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1
chmod +x ./install
./install auto

您应该能够在创建 Auto Scaling 组时将其粘贴为 user data。对于 Auto Scaling,您可以在创建启动配置时在配置详细信息 -> 高级详细信息下进行设置。

设置部署组并设置目标修订:

    创建或编辑部署组以包含 Auto Scaling 组。 (注意:Auto Scaling 组必须首先存在才能正常工作。) 确保 Auto Scaling 组中至少有 1 个实例。 部署要自动部署到部署组的工件包。 假设步骤 3 成功,部署组现在将该捆绑包设置为其目标修订版。对于自动部署,这将成为部署的已知良好修订。

Auto Scaling 在该 Auto Scaling 组中启动的新实例将自动部署部署组的目标修订版。手动部署失败的修订不会自动自动部署。

【讨论】:

在部署新版本的应用程序时,这种部署策略如何工作?例如,假设我编写了一个用户数据脚本,该脚本从 S3 中提取打包应用程序的“最新”版本。现在,当我运行构建作业(例如通过 Travis-CI)来部署我的应用程序时,它会将应用程序打包并上传到 S3,然后我希望组中的每个实例都被关闭和替换(最好是逐个一)。如何实现? 这应该是它自己的问题:如何从 TravisCI 触发 CodeDeploy 中的部署?如何使用 CodeDeploy 进行蓝绿部署?进入 cmets 会有点冗长。 我在这里创建了一个新问题,以防你想回答;)***.com/questions/32635428/… 谢谢!我错过了我需要安装 CodeDeploy 代理(通过 Launch 配置中的 UserData 脚本!如果我 git push 到 codeCommit 并通过 codePipeline 启动部署,后续新启动的实例是否会从 codeCommit 的存储库中获取修订版,还是旧版本?(我知道这个问题早于 CodePipeline 的发布,但我认为有人可能知道)

以上是关于我可以在自动缩放时使用 AWS code Deploy 来拉取应用程序代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

自动缩放组设置为 0 个实例时的 AWS Codedeploy

在 AWS 中制定自动缩放自己的规则

有啥方法可以编辑用于 AWS 中自动缩放的 AMI?

在 AWS CodeDeploy 中使用蓝/绿部署时,我们如何维护自动缩放组的状态?

自动缩放,弹性 IP

EKS:在特定 AWS 自动缩放组上运行特定服务(pod)