-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathintel-aws-emr-cluster-deny-unapproved-instance-types.sentinel
60 lines (54 loc) · 1.71 KB
/
intel-aws-emr-cluster-deny-unapproved-instance-types.sentinel
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
import "tfplan/v2" as tfplan
import "approved"
import "policy_summary"
param valid_actions default [
["no-op"],
["create"],
["update"],
]
doc = {
"allowed": approved.aws.aws_emr_cluster.optimal + approved.aws.aws_emr_cluster.alternative,
"category": approved.aws.aws_emr_cluster.category,
"error": approved.aws.aws_emr_cluster.error,
"file_name": approved.aws.aws_emr_cluster.deny_file_name,
"md_url": approved.aws.policies_url,
"parameter": approved.aws.aws_emr_cluster.parameter,
"provider": approved.aws.aws_emr_cluster.provider,
"resource": approved.aws.aws_emr_cluster.resource,
"violation": approved.aws.aws_emr_cluster.violation,
}
// Filter resources by type
all_resources = filter tfplan.resource_changes as _, rc {
rc.type is doc.resource and
rc.mode is "managed" and
rc.change.actions in valid_actions
}
// Filter resources that violate a given condition
violators = filter all_resources as _, r {
all r.change.after.core_instance_fleet as _, core_instance_fleet {
any core_instance_fleet.instance_type_configs as _, instance_type_config {
instance_type_config.instance_type else [] not in doc.allowed
} or
any r.change.after.master_instance_fleet as _, master_instance_fleet {
any master_instance_fleet.instance_type_configs as _, instance_type_config {
instance_type_config.instance_type else [] not in doc.allowed
}
}
}
}
// Build a summary report
summaryreport = {
"name": doc.name,
"violations": map violators as _, violation {
{
"name": violation.name,
"address": violation.address,
"type": violation.type,
"message": violation.name + doc.error,
}
},
}
# Unapproved instance type detected
main = rule {
policy_summary.summary(summaryreport, doc)
}