Terraform 模块 s3 生命周期规则不起作用

son*_*rma 0 amazon-s3 amazon-web-services terraform terraform-provider-aws

我有一个 s3 生命周期规则,应该使用生命周期规则在 n 天后删除失败的分段上传。我想用lookup而不是try

resource "aws_s3_bucket_lifecycle_configuration" "default" {

  count    = length(var.lifecycle_rule) != 0 ? 1 : 0
  bucket   = aws_s3_bucket.bucket.bucket
  dynamic "rule" {
    for_each = try(jsondecode(var.lifecycle_rule), var.lifecycle_rule)

    content {
      id     = lookup(rule.value, "id", "default")
      status = lookup(rule.value, "status", "Enabled")


      dynamic "abort_incomplete_multipart_upload" {
        for_each = lookup(rule.value, "abort_incomplete_multipart_upload", null) != null ? [rule.value.abort_incomplete_multipart_upload] : []
        content {
          days_after_initiation = abort_incomplete_multipart_upload.value.days_after_initiation
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试在子模块中使用此模块资源时,它不起作用

module "test" {

  source  = "./s3"

  bucket_name = "test"
  lifecycle_rule = [
    {
      expiration = {
        days = 7
        
      }
    },
    {
      id = "abort-incomplete-multipart-upload-lifecyle-rule"
        abort_incomplete_multipart_upload_days =  {
          days_after_initiation = 6
        }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

地形计划给了我

+ rule {
      + id     = "abort-incomplete-multipart-upload-lifecyle-rule"
      + status = "Enabled"

      + filter {
        }
    }
Run Code Online (Sandbox Code Playgroud)

预期输出:

  + rule {
          + id     = "abort-incomplete-multipart-upload-lifecyle-rule"
          + status = "Enabled"

          + abort_incomplete_multipart_upload {
              + days_after_initiation = 8
            }

          + filter {
            }
        }
Run Code Online (Sandbox Code Playgroud)

Mar*_*o E 5

这是有效的代码:

resource "aws_s3_bucket_lifecycle_configuration" "default" {

  count  = length(var.lifecycle_rule) != 0 ? 1 : 0
  bucket = aws_s3_bucket.bucket.bucket
  dynamic "rule" {
    for_each = try(jsondecode(var.lifecycle_rule), var.lifecycle_rule)

    content {
      id     = lookup(rule.value, "id", "default")
      status = lookup(rule.value, "status", "Enabled")


      dynamic "abort_incomplete_multipart_upload" {
        for_each = lookup(rule.value, "abort_incomplete_multipart_upload_days", null) != null ? [rule.value.abort_incomplete_multipart_upload_days] : []
        content {
          days_after_initiation = abort_incomplete_multipart_upload.value.days_after_initiation
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上有两个问题:

  1. 正在lookup寻找地图中不存在的键 ,abort_incomplete_multipart_upload而不是abort_incomplete_multipart_upload_days
  2. 由于第一个错误,它被传播到您想要的值,即,rule.value.abort_incomplete_multipart_upload而不是rule.value.abort_incomplete_multipart_upload_days

此代码产生以下输出:

  # aws_s3_bucket_lifecycle_configuration.default[0] will be created
  + resource "aws_s3_bucket_lifecycle_configuration" "default" {
      + bucket = (known after apply)
      + id     = (known after apply)

      + rule {
          + id     = "default"
          + status = "Enabled"
        }
      + rule {
          + id     = "abort-incomplete-multipart-upload-lifecyle-rule"
          + status = "Enabled"

          + abort_incomplete_multipart_upload {
              + days_after_initiation = 6
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果您希望它成为一条规则(即您想要的示例输出),则需要对变量进行更改lifecycle_rule

  lifecycle_rule = [
    {
      expiration = {
        days = 7

      }
      id = "abort-incomplete-multipart-upload-lifecyle-rule"
      abort_incomplete_multipart_upload_days = {
        days_after_initiation = 6
      }
    }
  ]
Run Code Online (Sandbox Code Playgroud)

这给出:

  + resource "aws_s3_bucket_lifecycle_configuration" "default" {
      + bucket = (known after apply)
      + id     = (known after apply)

      + rule {
          + id     = "abort-incomplete-multipart-upload-lifecyle-rule"
          + status = "Enabled"

          + abort_incomplete_multipart_upload {
              + days_after_initiation = 6
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)