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
相关产品推荐
相关产品推荐

