删除 Lambda 支持的自定义资源的支持 Lambda 函数
Posted
技术标签:
【中文标题】删除 Lambda 支持的自定义资源的支持 Lambda 函数【英文标题】:Delete the backing Lambda function for a Lambda-backed custom resource 【发布时间】:2017-10-23 04:13:08 【问题描述】:我有一个 AWS CloudFormation 模板,用于创建 OpsWorks 堆栈并部署应用程序。为了部署应用程序,我使用了一个 Lambda 函数和一个使用该函数的自定义资源。我的问题是:那个 Lambda 函数只会在创建堆栈的过程中执行一次,然后就再也不会被使用了。 AWS CloudFormation 有没有办法在堆栈执行结束时删除 Lambda 函数?
【问题讨论】:
如果你删除堆栈,或者更新自定义资源,它也会再次调用,所以删除它可能并不理想。您可能会考虑在单独的堆栈中创建 lambda,然后导出其 ARN 并使用它,而不是内联自定义资源;那么至少您不会为您创建的每个使用自定义资源的堆栈提供额外的功能。 明白。但是对于我们的用例,我们已经有很多 lambda 函数,并且有更多无用的函数是不可取的。如果我们创建另一个堆栈,lambda 将会以任何方式再次创建,所以在它完成工作之后我们真的不需要拥有它 您可以在函数运行后立即从函数内部删除该函数。但你真的是在给自己找麻烦。当您删除堆栈时,CF 将尝试调用 lambda,如果您更新它,它也可能会被调用,具体取决于参数。 CustomResources 不应该是一次性脚本。另一种选择是将调用 cloudformation 包装成一个脚本,并让该调用部署。祝你好运! 您是否有说明在删除 cloudformation 堆栈时再次调用 lambda 函数的 aws 文档? docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/… - 第一行:“当模板开发人员删除包含自定义资源的堆栈时,将发送 RequestType 设置为“Delete”的自定义资源提供程序请求。成功删除具有自定义资源的堆栈资源,自定义资源提供者必须成功响应删除请求。” 【参考方案1】:您对自定义资源的一些假设不正确。在 Lambda 支持的自定义资源中,您实施逻辑以支持资源的创建、更新和删除。这些指示是通过事件从 CloudFormation 发送的,并为您提供有关堆栈过程的信息。
了解自定义资源生命周期很重要,以防止您的数据被删除。
创建 - 这很简单,当创建资源时,会将请求类型为 Create 的事件发送到您的函数。
删除 - 这个比较棘手。删除资源时会发送删除请求类型。但是除了资源Delete之外还有更多的场景。我们必须先解释更新。
Update - 如果您的任何自定义资源属性发生更改,则调用它。例如,在我们的应用中,我们可以修改允许的回调 url,这将触发具有更新请求类型的函数
欢迎您在this blog post 中阅读有关创建自定义资源的最佳实践的更多信息
【讨论】:
【参考方案2】:首先,我应该说 Aditya 是对的,您不应该删除支持 Lambda,因为它在整个生命周期中都在使用。
但是,如果你真的想这样做,一种方法是在运行后简单地让函数删除自身(以及相关资源,例如角色)。
【讨论】:
【参考方案3】:Lambda 函数在运行期间只会执行一次 创建堆栈,然后它将永远不会被再次使用。
^^事实并非如此。每次触及(即创建、更新或删除)相应资源时,都会调用 Lambda 支持的自定义资源的支持 Lambda 函数。 AWS CloudFormation 将在每次看到资源被触摸时将 RequestType 参数传递给该函数,并将其传递给these values:Create
、Update
、Delete
之一。您的 Lambda 函数应在考虑该参数的情况下执行必要的操作。根据您的问题,您的 Lambda 函数似乎只适用于RequestType = Create
?
此外,根据AWS docs,您无需为创建 Lambda 函数付费,但前提是您实际调用它。因此,成本不能成为保持该功能的阻碍因素。 相反,如果您担心不想要额外的混乱,您可以尝试创建一个common CloudFormation 堆栈,该堆栈的工作将是创建共享资源,然后您然后可以在那里定义那个 Lambda 函数吗?我必须了解您的整个工作流程才能确定该方法是否有效。
对于它的价值,我建议不要删除 Lambda 支持的自定义资源的支持函数,因为将来有人触摸相应资源或想要创建相同的另一个实例时会很痛苦资源类型。
【讨论】:
以上是关于删除 Lambda 支持的自定义资源的支持 Lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章
aws cloudformation 在列表中使用 Fn::Join