我正在使用 bitbucket 的 codeDeploy 插件,通过 AWS codeDeploy 将我的代码直接从 Bitbucket Git 存储库部署到我的 EC2 实例。然而,过了一段时间,我的 codeDeploy 控制台中有很多修订,这些修订存储在一个 S3 存储桶中。那么我应该怎样做才能避免我的 S3 存储保留旧的 codeDeploy 修订版本?
部署成功后是否可以自动删除这些修订?
修改成功次数有X次可以自动删除吗?例如,如果我们有三个新的成功修订版,则删除旧修订版。
CodeDeploy 保留 BitBucket 的每个修订,因为该服务始终需要最后一次成功的修订来实现 AutoRollback 等不同类型的功能。因此,在进行部署时,我们目前无法轻松覆盖以前的修订版。但对于早于上次成功修订的所有修订,可以将其删除。
不幸的是,CodeDeploy 目前没有一个好的/优雅的方法来处理这些过时的修订。如果 bitbucket 推送到 S3 时有覆盖选项就好了。
CodeDeploy 纯粹是一个部署工具,它无法处理 S3 存储桶中的修订。
我建议您研究一下 S3 的“生命周期管理”。由于您使用的是版本控制存储桶(我假设),因此总是有一个最新版本和 0 到多个过时版本。您可以设置“NoncurrentVersionExpiration”类型的生命周期配置,以便过时的版本将在几天后被删除。
此方法仍然无法维持固定数量的部署,因为 AWS 只允许以天数指定生命周期。但这可能是您的用例的最佳替代方案。
[1] http://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-set-lifecycle-configuration-intro.html [2] http://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html
CodeDeploy 不处理类似 Jenkins 示例的功能:“保持最后 X [成功与否]运行”。 但是,通过 S3 Lifecycle,您可以在 3 个月后自动使 S3 对象过期(删除)。
一方面,当过期窗口期间存在持续活动(至少 3 次部署)时,通过确保 CodeDeploy 的自动回滚过程并降低 S3 成本,该解决方案是一个很好的 FinOps 操作。
另一方面,当您有尖峰活动或更糟糕的是在指定的 S3 过期延迟期间根本没有部署时,此解决方案效率较低:在上一次部署 12 个月后部署的情况下,当此部署失败时,Code Deploy 将不会能够继续回滚,因为之前的工件在 S3 中不再可用。
作为缓解措施,我建议您使用智能分层,它可以将 S3 成本除以 4,而不会干扰 CodeDeploy 功能。您还可以将过期时间设置为 12 个月来删除古代文物。
最后一个解决方案是编写由每周 Cloudwatch 事件安排的 Lambda,这将:
https://bitbucket.org/atlassian/aws-code-deploy/src/master。
这将导致上一个修订版被下一个修订版覆盖,因此 S3 存储桶中一次仅存储一个修订版。如果您也想在部署后删除此修订版,您可以在安装后脚本中使用简单的 AWS CLI 命令来执行此操作,该脚本通过 appspec.yml 文件中的挂钩包含 (
https://docs.aws.amazon .com/codedeploy/latest/userguide/reference-appspec-file-struct-hooks.html):
aws s3 rm s3://bucket-name/my-application <-- The name of your revision goes here