Skip to content

Consistent types error when using logging with conditional #314

Open
@paxlo

Description

@paxlo

Description

I create a whole bunch of buckets as follows. I need to optionally enable versioning or logging (with predefined bucket name and prefix) on each of them

locals {
  buckets = [
    {
      name        = "bucket1"
      versioning  = true
    },
    {
      name    = "bucket2"
      logging = false
    }
  ]
}

module "s3_bucket" {
  source  = "terraform-aws-modules/s3-bucket/aws"
  version = "4.6"

  for_each = { for bucket in local.buckets : bucket.name => bucket }

  bucket        = each.value.name

  # works
  versioning = lookup(each.value, "versioning", false) ? {
    enabled    = true
    mfa_delete = false
  } : {}

  # doesn't
  logging = lookup(each.value, "logging", false) ? {
    target_bucket = "logging-bucket-name"
    target_prefix = "/"
    target_object_key_format = {
      partitioned_prefix = {
        partition_date_source = "EventTime"
      }
    }
  } : {}
}

Enabling/disabling for versioning condition works fine. But the similar code for enabling/disabling logging fails with an error regardless of logging = true/false in locals

Error: Inconsistent conditional result types
The true and false result expressions must have consistent types. The 'true' value includes object attribute "target_bucket", which is absent in the 'false' value.

Same error when using try instead of lookup

Versions

  • Module version [Required]: 4.6.0

  • Terraform version: Terraform v1.10.5

  • Provider version(s): provider registry.terraform.io/hashicorp/aws v5.86.1

Reproduction Code [Required]

locals {
  buckets = [
    {
      name        = "bucket1"
      versioning  = true
    },
    {
      name    = "bucket2"
      logging = false
    }
  ]
}

module "s3_bucket" {
  source  = "terraform-aws-modules/s3-bucket/aws"
  version = "4.6"

  for_each = { for bucket in local.buckets : bucket.name => bucket }

  bucket        = each.value.name

  # works
  versioning = lookup(each.value, "versioning", false) ? {
    enabled    = true
    mfa_delete = false
  } : {}

  # doesn't
  logging = lookup(each.value, "logging", false) ? {
    target_bucket = "logging-bucket-name"
    target_prefix = "/"
    target_object_key_format = {
      partitioned_prefix = {
        partition_date_source = "EventTime"
      }
    }
  } : {}
}

Steps to reproduce the behavior:

run terraform plan or terraform validate

Expected behavior

I expect a logging configuration will be created in case logging = true in locals. If it's false or does not exist, logging will not be enabled

Actual behavior

│ Error: Inconsistent conditional result types
│ 
│   on s3.tf line 29, in module "s3_bucket":
│   29:   logging = lookup(each.value, "logging", false) ? {
│   30:     target_bucket = "logging-bucket-name"
│   31:     target_prefix = "/"
│   32:     target_object_key_format = {
│   33:       partitioned_prefix = {
│   34:         partition_date_source = "EventTime"
│   35:       }
│   36:     }
│   37:   } : {}
│ 
│ The true and false result expressions must have consistent types. The 'true' value includes object attribute "target_bucket", which is absent in the 'false' value.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions