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

能否在AWS DLM单计划的retain_rule中混用count与interval参数?

AWS DLM 快照保留规则:count与interval能否同时配置?

核心结论

不能在单个aws_dlm_lifecycle_policy的retain_rule中同时配置count和interval(含interval_unit)参数。

原因说明

  • 虽然Terraform的AWS Provider文档未将这两个参数标记为互斥,但AWS DLM服务本身不支持这种组合配置——这就是你无法在AWS控制台创建此类策略的根本原因。
  • DLM的保留规则逻辑为二选一:要么保留指定数量的最新快照,要么保留未超过指定时长的快照,两个条件无法同时生效。如果强行通过Terraform同时配置,AWS会忽略其中一个条件,或直接拒绝策略的创建/更新请求。

替代方案

若需同时满足「保留N个最新快照」和「删除超过指定时长的快照」,可在同一个DLM策略中创建两个独立的计划:

  1. 第一个计划负责按数量保留最新快照
  2. 第二个计划负责删除超过指定时长的快照

修改后的Terraform代码示例

data "aws_iam_policy_document" "dlm_assume_role" {
  statement {
    effect = "Allow"

    principals {
      type        = "Service"
      identifiers = ["dlm.amazonaws.com"]
    }

    actions = ["sts:AssumeRole"]
  }
}

resource "aws_iam_role" "dlm_lifecycle_role" {
  name               = "dlm-lifecycle-role"
  assume_role_policy = data.aws_iam_policy_document.dlm_assume_role.json
}

data "aws_iam_policy_document" "dlm_lifecycle" {
  statement {
    effect = "Allow"

    actions = [
      "ec2:CreateSnapshot",
      "ec2:CreateSnapshots",
      "ec2:DeleteSnapshot",
      "ec2:DescribeInstances",
      "ec2:DescribeVolumes",
      "ec2:DescribeSnapshots",
    ]

    resources = ["*"]
  }

  statement {
    effect    = "Allow"
    actions   = ["ec2:CreateTags"]
    resources = ["arn:aws:ec2:*::snapshot/*"]
  }
}

resource "aws_iam_role_policy" "dlm_lifecycle" {
  name   = "dlm-lifecycle-policy"
  role   = aws_iam_role.dlm_lifecycle_role.id
  policy = data.aws_iam_policy_document.dlm_lifecycle.json
}

resource "aws_dlm_lifecycle_policy" "ebs_snapshot" {
  description        = "EC2 EBS DLM lifecycle policy"
  execution_role_arn = aws_iam_role.dlm_lifecycle_role.arn
  state              = "ENABLED"

  policy_details {
    resource_types = ["VOLUME"]

    # 计划1:保留指定数量的最新快照
    schedule {
      name = "${var.name_prefix} 保留最新N个快照"

      create_rule {
        interval      = var.ebs_snapshot_interval
        interval_unit = "HOURS"
      }

      retain_rule {
        count = var.ebs_snapshot_retain_count # 示例:保留最新5个快照
      }

      copy_tags = true
    }

    # 计划2:删除超过指定时长的快照
    schedule {
      name = "${var.name_prefix} 删除超期快照"

      create_rule {
        interval      = var.ebs_snapshot_interval
        interval_unit = "HOURS"
      }

      retain_rule {
        interval      = var.ebs_snapshot_max_retain_period
        interval_unit = "DAYS" # 示例:删除超过30天的快照
      }

      copy_tags = true
    }

    target_tags = {
      Name = "${var.name_prefix}"
    }
  }
}

注意事项

  • 两个计划使用相同的create_rule配置,确保快照创建频率一致
  • DLM会分别执行两个计划的保留逻辑,最终实现既保留最新N个、又清理超期快照的效果

内容的提问来源于stack exchange,提问作者s3-m-bocian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:15