问题描述
在使用 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 层版本。请根据您的需求选择适合的解决方案。