locals.tf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
data "aws_ssoadmin_instances" "this" {}

data "aws_identitystore_group" "this" {
  for_each          = { for idx, a in var.assignments : idx => a if a.principal_id == null && a.principal_type == "GROUP" }
  identity_store_id = try(tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0], "d-0000000000")
  alternate_identifier {
    unique_attribute {
      attribute_path  = "DisplayName"
      attribute_value = each.value.principal_name
    }
  }
}

data "aws_identitystore_user" "this" {
  for_each          = { for idx, a in var.assignments : idx => a if a.principal_id == null && a.principal_type == "USER" }
  identity_store_id = try(tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0], "d-0000000000")
  alternate_identifier {
    unique_attribute {
      attribute_path  = "UserName"
      attribute_value = each.value.principal_name
    }
  }
}

# locals =====================================================================

locals {
  tags = merge(
    {
      ManagedBy = "terraform"
      Module    = "governance/sso-assignment"
    },
    var.tags,
  )

  # Flatten managed policy attachments
  managed_policy_pairs = flatten([
    for ps_key, ps in var.permission_sets : [
      for policy_arn in ps.managed_policies : {
        ps_key     = ps_key
        policy_arn = policy_arn
      }
    ]
  ])

  managed_policy_map = {
    for pair in local.managed_policy_pairs :
    "${pair.ps_key}:${pair.policy_arn}" => pair
  }

  # Flatten customer-managed policy attachments
  customer_policy_pairs = flatten([
    for ps_key, ps in var.permission_sets : [
      for cmp in ps.customer_managed_policies : {
        ps_key = ps_key
        name   = cmp.name
        path   = cmp.path
      }
    ]
  ])

  customer_policy_map = {
    for pair in local.customer_policy_pairs :
    "${pair.ps_key}:${pair.name}" => pair
  }

  # Resolve principal_id using dynamic data lookup if not provided directly
  resolved_assignments = [
    for idx, a in var.assignments : {
      account_id         = a.account_id
      permission_set_key = a.permission_set_key
      principal_type     = a.principal_type
      principal_id = a.principal_id != null ? a.principal_id : (
        a.principal_type == "GROUP" ? data.aws_identitystore_group.this[idx].group_id : data.aws_identitystore_user.this[idx].user_id
      )
    }
  ]

  # Keyed assignment map for for_each
  assignment_map = {
    for a in local.resolved_assignments :
    "${a.account_id}:${a.permission_set_key}:${a.principal_id}" => a
  }
}