Amazon web services 使用CodeDeploy和CI工具部署分布式应用程序的好方法是什么?
在使用AWS时,通过AWS CodeDeploy将应用程序部署到新创建的实例似乎是一种不错的方法。这项工作如下:Amazon web services 使用CodeDeploy和CI工具部署分布式应用程序的好方法是什么?,amazon-web-services,deployment,cloud,travis-ci,aws-code-deploy,Amazon Web Services,Deployment,Cloud,Travis Ci,Aws Code Deploy,在使用AWS时,通过AWS CodeDeploy将应用程序部署到新创建的实例似乎是一种不错的方法。这项工作如下: 为应用程序设置自动缩放组 为自动伸缩组编写一个用户数据bash脚本,该组从S3中提取CodeDeploy代理,安装并启动它 设置部署到自动缩放组的CodeDeploy部署组 现在,当应用程序包(例如jar或debian包)部署到部署组时,它将自动部署到自动扩展组中启动的新实例 我的问题是:这种部署策略如何与Travis CI这样的CI工具相匹配 具体而言: CodeDeploy如何
- CodeDeploy如何获取由像Travis CI这样的CI工具构建的包?构建作业是否需要将包上载到S3
- 如何使用CodeDeploy逐步部署应用程序(例如,一次部署一个实例)
- 此部署策略是否要求关闭并替换每个正在运行的实例,或者是在现有实例上部署应用程序的新版本?如果是前者,机器IP地址将在部署期间发生变化,那么其他服务如何发现新部署的应用程序(即没有硬编码的IP地址)
- 构建作业需要将包上载到S3
- 使用一次一个的部署配置
- 新版本的应用程序部署在现有实例上
- 使用
、处理安装/升级所需的任何脚本以及构建构件创建归档包appspec.yml
- 将捆绑包上载到S3
- 在CodeDeploy中创建部署 您可能希望将其视为与CodeDeploy集成的连续交付系统的一个示例 CodeDeploy使用部署配置来控制部署到您的团队中的实例的力度。(自动部署会忽略此配置,因为每个实例都是单独处理的。)如果CodeDeploy无法在不违反部署配置中的约束的情况下使另一个实例失败,则它将使您的部署失败并停止部署到新实例 有三种部署配置,您可以通过CLI创建自己的配置,或者如果需要其他配置,也可以创建自己的配置。要一次只部署到一个实例,您可以使用
- tl;dr版本:
好的,下面是长版本: 我建议您尝试或查看文档中的。它将帮助您更快地熟悉CodeDeploy 如果不想,不必将自动缩放组与CodeDeploy一起使用。CodeDeploy与AutoScaling集成允许您管理需要与部署到其上的代码分开动态更改大小的车队,但这不是使用CodeDeploy的要求。您还可以手动启动一些EC2实例,安装host agent,然后将它们标记到部署组中—但它们不会像自动缩放实例那样在启动时自动部署。无论哪种情况,您都可以创建车队范围的部署 您必须做一些工作才能将其与CI工具集成。CodeDeploy不会直接管理构建工件,因此构建过程需要这样做。要实现自动部署,您需要:
CodeDeployDefault.OneAtATime
deployment配置,该配置在任何给定时间最多允许一台不健康的主机。对于其他任何人(如我),请查看如何将Travis CI与CodeDeploy真正集成的示例:
- 配置应用程序、部署组和实例,如中所述
- 使用aws cli命令将第一个修订版成功部署到CodeDeploy目标实例
- 部署并运行应用程序后,配置Travis以触发部署
- CodeDeploy
文件和用于部署的任何脚本都应打包在应用程序包中(在下面的示例中为appspec.yml
)latest.zip
.travis.yml
配置对我有效:
script: npm run build
before_deploy:
- zip -r latest dist/*
- mkdir -p dpl_cd_upload
- mv latest.zip dpl_cd_upload/latest.zip
deploy:
- provider: s3
access_key_id: "XXXX"
secret_access_key: "YYYYY"
bucket: "deployments-bucket-name"
local_dir: dpl_cd_upload
skip_cleanup: true
- provider: codedeploy
access_key_id: "ZZZZZ"
secret_access_key: "WWWW"
bucket: "deployments-bucket-name"
key: latest.zip
bundle_type: zip
application: CodeDeployAppName
deployment_group: CodeDeployDeploymentGroupName
这些例子非常有用:
感谢您提供的详细答案-过去一周我一直在尝试CodeDeploy,它似乎是一个不错的工具。我有一个关于部署新版本API的问题。假设我们有一个跨5个EC2实例进行负载平衡的API,我们绝不希望实例运行不同版本的API时处于不一致的状态。在这个场景中,我们可能需要部署到5个新实例,并在完成后切换ELB。应该如何使用CodeDeploy来实现这一点?您是否会为每个版本创建5个新实例和一个新的部署组?您所描述的方法会奏效。按照一般的最佳实践,您应该始终假设您有时将以混合模式运行,并且您的卷展栏应该设计为与以前的版本一起工作。这确实会使模式迁移更加痛苦(两次部署而不是三次部署),但您的部署将更加安全。