You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform中AWS Launch Template版本删除与数量限制方案咨询

解决Terraform中AWS Launch Template旧版本清理/数量限制问题

方法一:在Terraform资源中嵌入清理脚本

Terraform本身没有直接属性控制Launch Template版本数量,但可以通过local-exec provisioner,在每次创建新版本后调用AWS CLI清理旧版本。

示例代码片段:

resource "aws_launch_template" "example" {
  name_prefix   = "example-lt"
  image_id      = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  # 每次版本更新后执行清理脚本
  provisioner "local-exec" {
    command = <<EOT
      # 保留最近3个版本,删除更早的版本
      LT_NAME=${aws_launch_template.example.name}
      RETAIN_COUNT=3

      # 获取所有版本ID,按创建时间倒序排序
      VERSIONS=$(aws ec2 describe-launch-template-versions --launch-template-name $LT_NAME --query 'LaunchTemplateVersions[*].VersionNumber' --output text | sort -nr)

      # 跳过前RETAIN_COUNT个版本,删除剩余的
      COUNT=0
      for VERSION in $VERSIONS; do
        if [ $COUNT -ge $RETAIN_COUNT ]; then
          aws ec2 delete-launch-template-version --launch-template-name $LT_NAME --version-number $VERSION
        fi
        COUNT=$((COUNT+1))
      done
    EOT
    interpreter = ["/bin/bash", "-c"]
  }
}

注意:确保执行Terraform的环境有AWS CLI权限,且脚本要排除默认版本或正在被ASG等资源引用的版本(可在脚本中增加判断逻辑)。

方法二:用null_resource单独处理版本清理

把清理逻辑和主Launch Template资源分离,用null_resource触发清理,仅当Launch Template版本更新时执行:

resource "aws_launch_template" "example" {
  name_prefix   = "example-lt"
  image_id      = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}

resource "null_resource" "clean_old_lt_versions" {
  triggers = {
    # 当最新版本号变化时触发清理
    latest_version = aws_launch_template.example.latest_version
  }

  provisioner "local-exec" {
    command = <<EOT
      LT_NAME=${aws_launch_template.example.name}
      RETAIN_COUNT=3

      VERSIONS=$(aws ec2 describe-launch-template-versions --launch-template-name $LT_NAME --query 'LaunchTemplateVersions[*].VersionNumber' --output text | sort -nr)

      COUNT=0
      for VERSION in $VERSIONS; do
        # 跳过默认版本和保留的最新版本
        IS_DEFAULT=$(aws ec2 describe-launch-template-versions --launch-template-name $LT_NAME --version-number $VERSION --query 'LaunchTemplateVersions[0].DefaultVersion' --output text)
        if [ $COUNT -ge $RETAIN_COUNT ] && [ $IS_DEFAULT == "False" ]; then
          aws ec2 delete-launch-template-version --launch-template-name $LT_NAME --version-number $VERSION
        fi
        COUNT=$((COUNT+1))
      done
    EOT
    interpreter = ["/bin/bash", "-c"]
  }
}

方法三:AWS侧自动清理(无Terraform依赖)

如果不想在Terraform流程中嵌入脚本,可通过CloudWatch Events + Lambda实现定期自动清理:

  • 创建Lambda函数:编写Python/Shell代码,查询指定Launch Template的所有版本,保留指定数量的最新版本,删除其余未被引用的版本。
  • 创建CloudWatch规则:设置定时触发(比如每天一次),调用该Lambda函数。

这种方式脱离Terraform部署流程,适合全局管控多个Launch Template的版本数量。


内容的提问来源于stack exchange,提问作者Vikash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:10:31