-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathmain.tf
89 lines (70 loc) · 3.88 KB
/
main.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
85
86
87
88
89
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
# Permission is hereby granted, free of charge, to any person obtaining a copy of
# this software and associated documentation files (the "Software"), to deal in
# the Software without restriction, including without limitation the rights to
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
# the Software, and to permit persons to whom the Software is furnished to do so.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
# AWS Control Tower Controls (sometimes called Guardrails) Terraform Module
data "aws_organizations_organization" "organization" {}
# Get OUs data resources up to five levels of OUs deep under a root (maximum nesting quota limit)
data "aws_organizations_organizational_units" "root" {
parent_id = data.aws_organizations_organization.organization.roots[0].id
}
data "aws_organizations_organizational_units" "ous_depth_1" {
for_each = toset([for x in data.aws_organizations_organizational_units.root.children : x.id])
parent_id = each.key
depends_on = [
data.aws_organizations_organizational_units.root
]
}
data "aws_organizations_organizational_units" "ous_depth_2" {
for_each = toset([for y in flatten([for x in data.aws_organizations_organizational_units.ous_depth_1 : x.children]) : y.id])
parent_id = each.key
depends_on = [
data.aws_organizations_organizational_units.ous_depth_1
]
}
data "aws_organizations_organizational_units" "ous_depth_3" {
for_each = toset([for y in flatten([for x in data.aws_organizations_organizational_units.ous_depth_2 : x.children]) : y.id])
parent_id = each.key
depends_on = [
data.aws_organizations_organizational_units.ous_depth_2
]
}
data "aws_organizations_organizational_units" "ous_depth_4" {
for_each = toset([for y in flatten([for x in data.aws_organizations_organizational_units.ous_depth_3 : x.children]) : y.id])
parent_id = each.key
depends_on = [
data.aws_organizations_organizational_units.ous_depth_3
]
}
locals {
# Extract Guardrails configuration
guardrails_list = flatten([
for i in range(0, length(var.controls)) : [
for pair in setproduct(element(var.controls, i).control_names, element(var.controls, i).organizational_unit_ids) :
{ "arn:aws:controlcatalog:::control/${pair[0]}" = pair[1] }
]
])
ous_depth_1 = [for x in data.aws_organizations_organizational_units.root.children : x]
ous_depth_2 = flatten([for x in data.aws_organizations_organizational_units.ous_depth_1 : x.children if length(x.children) != 0])
ous_depth_3 = flatten([for x in data.aws_organizations_organizational_units.ous_depth_2 : x.children if length(x.children) != 0])
ous_depth_4 = flatten([for x in data.aws_organizations_organizational_units.ous_depth_3 : x.children if length(x.children) != 0])
ous_depth_5 = flatten([for x in data.aws_organizations_organizational_units.ous_depth_4 : x.children if length(x.children) != 0])
# Compute map from OU id to OU arn for the whole organization
ous_id_to_arn_map = { for ou in concat(local.ous_depth_1, local.ous_depth_2, local.ous_depth_3, local.ous_depth_4, local.ous_depth_5) :
ou.id => ou.arn
}
}
resource "aws_controltower_control" "guardrails" {
for_each = { for control in local.guardrails_list : join(":", [keys(control)[0], values(control)[0]]) => [keys(control)[0], values(control)[0]] }
control_identifier = each.value[0]
target_identifier = local.ous_id_to_arn_map[each.value[1]]
}