【问题标题】:Automatically Clean Up CloudFront Distributions after Disabling禁用后自动清理 CloudFront 分配
【发布时间】:2019-05-03 11:59:39
【问题描述】:

我目前正在构建一个基于 AWS Lambda 的无服务器应用程序,它代表用户创建 CloudFront 分配。目前,当用户调用我的“删除”操作时,我的 API Lambda 函数会禁用 CloudFront 分配。但是,发行版永远不会被清理和删除,因为我需要先等待禁用完成。鉴于 Lambda 的 15 分钟限制,我不能只等待禁用完成部署,即使我可以这样做也是成本低效的。

我意识到我可以让 Lambda 函数定期轮询我的 CloudFront 分配并清理它们,但我希望以事件驱动的方式执行此操作,以便它尽可能接近实时地发生,但我不这样做'当没有要删除的内容时,不需要使用任何计算。

我尝试将 CloudWatch 事件设置为在 UpdateDistribution 调用时触发,但它会在分发开始禁用时触发,而不是在分发结束时触发,因此这并不能真正解决我需要等待部署的问题。

关于如何完成此任务的任何建议?有没有可能?

【问题讨论】:

    标签: amazon-web-services aws-lambda amazon-cloudfront


    【解决方案1】:

    我建议使用 AWS Step Function 来管理 CloudFront 分配的最终删除。您的 lambda 可以禁用 CloudFront 分配并调用 Step Function。 step 函数可以通过调用 Lambda 函数来管理分发的轮询和最终删除。

    【讨论】:

      【解决方案2】:

      AWS 官方表示 CloudFront 最多需要 15 分钟来启用或禁用分配。尽管我们发现这通常是正确的,但我们遇到过禁用分发需要超过 15 分钟的情况,因此我建议任何解决方案都必须考虑到无论出于何种原因,它可能需要超过 15 分钟的可能性分钟来禁用分发。

      虽然不是一个完美事件驱动的解决方案,但绝对有可能以大多数事件驱动的方式来做到这一点。我们的解决方案是使用 CloudWatch、Lambda、SQS 和 CloudTrail 完成的。很明显,您已经启用了 CloudTrail,但是对于可能面临类似挑战的未来读者,如果您还没有这样做,第一步是在您的帐户中启用 CloudTrail 登录(注意:使用 CloudTrail 会产生费用,详情@ 987654321@)。启用 CloudTrail 后,CloudWatch Events 将能够从 CloudTrail 获取 CloudFront 事件。

      现在 CloudTrail 已启用,我们可以继续实际删除已禁用的发行版。在 CloudWatch 中,创建一个 CloudWatch 事件,该事件在来自 CloudFront 的 UpdateDistribution 事件上触发一个 Lambda 函数,该函数将包含分发 ID 的消息发布到最大延迟为 15 分钟 (console based setup instructions here) 的 SQS 延迟队列。

      SQS 队列中消息的使用者是第二个 Lambda 函数。调用时,此 Lambda 函数应调用 CloudFront GetDistribution API 以获取所提供的分配 ID,并检查是否为 Distribution.DistributionConfig.Enabled === true,如果为假,则检查是否为 Distribution.Status === Deployed

      可以根据您的特定需求或用例调整逻辑,但从这里开始,一个潜在的工作流程将是简单地检查Distribution.DistributionConfig.Enabled === true。如果它是真的,那么就退出该功能,因为您希望它被禁用,但事实并非如此,所以有些事情是不对的;也许分发是手动重新启用的,或者在某处禁用它时出错,或者可能由于其他原因调用了UpdateDistribution API,无论是什么原因,分发不在我们预期的状态,我们不应该继续。在中断该功能之前,您应该/可以通过发送 SNS 消息通知管理员此错误发生来确保这不会静默失败。

      继续,如果 Distribution.DistributionConfig.Enabled === true 返回 false,请检查以确保 Distribution.Status === Deployed。如果这返回 false 那么这意味着禁用仍然是 InProgress 并且您需要等待更长时间。要在不保持 Lambda 运行(并为此产生费用)的情况下处理此问题,只需将第二条消息发布到我的延迟队列,该消息再次包含分配 ID,然后函数结束。 Lambda 将在 15 分钟后再次触发,并在下次调用时重复上述过程。

      如果对 Distribution.DistributionConfig.Enabled === true 的检查返回 false 并且 Distribution.Status === Deployed 返回 true,则分发被禁用并准备好被删除。从这里只需调用带有分发 ID 的 DeleteDistribution API 和您在开始时调用的 GetDistribution 中的 ETag。 API 操作类似于DeleteDistribution --id {distributionId} --if-match {ETag}。如果它被成功删除,你会得到一个 204,就是这样,一切都完成了。如果出现错误,您将获得需要处理的 4xx。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-04
        • 2016-03-24
        • 1970-01-01
        • 2014-02-19
        • 2016-02-26
        • 2020-03-16
        • 2012-10-16
        • 2012-12-05
        相关资源
        最近更新 更多