如何保留 AWS Lambda 层的旧版本

91次阅读
没有评论

问题描述

在使用 Terraform 部署 AWS 时遇到一个问题。每当他尝试更新一个 Lambda 层时,Lambda 层的版本会递增,但旧的层会被删除。即使当前版本是8,之前的版本1到7也会被自动删除。他按照文档中的步骤进行操作,但仍然无法保留旧版本的层。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

Terraform 的工作是维护每个资源块的一个远程对象,要么通过随时间更新同一个对象,要么通过替换为满足新需求的新对象。
如果您希望逐渐累积新对象,那么 Terraform 不是正确的工具。您可以考虑使用应用程序部署工具,如 Serverless 框架。

方案2

您可以告诉 Terraform 不再关心旧的层版本。通过使用 skip_destroy 参数并将其设置为 true,可以实现这一点。但请注意,层版本将成为不再由 Terraform 管理的悬空资源,并可能在您的 AWS 账户中产生额外的费用。请参阅 aws_lambda_layer_version文档了解更多信息。
以下是如何在 Terraform 中实现的步骤:
1. 创建一个 main.tf 文件。
2. 在该文件中定义 aws_lambda_layer_version 资源块,并设置 skip_destroy 参数为 true
下面是一个示例 main.tf 文件:

resource "aws_lambda_layer_version" "lambda_layer" {
  filename            = "lambda_layer_payload.zip"
  layer_name          = "lambda_layer_name"
  source_code_hash    = filebase64sha256("lambda_layer_payload.zip")
  skip_destroy        = true
  compatible_runtimes = ["nodejs12.x"]
}

在上面的示例中,我们定义了一个 aws_lambda_layer_version 资源块,并将 skip_destroy 参数设置为 true。这将告诉 Terraform 不再关心旧的层版本。
请注意,skip_destroy 参数可能在不同的 Terraform 版本中有所不同。请根据您使用的 Terraform 版本进行相应的调整。

方案3

使用 skip_destroy 参数可能会导致资源在 Terraform 管理之外,可能会增加额外的费用。请谨慎使用。
另一种方法是手动管理 Lambda 层的版本。您可以通过手动创建 Lambda 层版本,并在 Terraform 中引用这些版本。这样,Terraform 将不会删除旧的层版本。
以下是如何手动管理 Lambda 层版本的步骤:
1. 在 AWS 控制台中创建一个新的 Lambda 层版本。
2. 在 Terraform 的配置文件中,使用 aws_lambda_layer_version 资源块引用该版本。
下面是一个示例 main.tf 文件:

resource "aws_lambda_layer_version" "lambda_layer" {
  layer_name          = "lambda_layer_name"
  version             = "8"  # 使用您创建的 Lambda 层版本号
  compatible_runtimes = ["nodejs12.x"]
}

在上面的示例中,我们使用 version 参数引用了手动创建的 Lambda 层版本。这样,Terraform 将不会删除旧的层版本。
请注意,手动管理 Lambda 层版本可能会增加一些额外的工作量,并且需要确保 Terraform 和手动创建的版本保持一致。

总结

在使用 Terraform 部署 AWS Lambda 层时,如果希望保留旧的层版本,可以考虑使用上述解决方案之一。方案1建议使用应用程序部署工具,如 Serverless 框架。方案2和方案3介绍了如何在 Terraform 中设置 skip_destroy 参数或手动管理 Lambda 层版本。请根据您的需求选择适合的解决方案。

正文完