Skip to content

Commit 8c471fe

Browse files
authored
feat: Add support for Customer Managed policies (#8)
1 parent 555a0a0 commit 8c471fe

File tree

6 files changed

+45
-20
lines changed

6 files changed

+45
-20
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,13 @@ module "sso" {
6565
| Name | Version |
6666
|------|---------|
6767
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.12.23 |
68-
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.27 |
68+
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.30 |
6969

7070
## Providers
7171

7272
| Name | Version |
7373
|------|---------|
74-
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.27 |
74+
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.30 |
7575

7676
## Modules
7777

@@ -82,6 +82,7 @@ No modules.
8282
| Name | Type |
8383
|------|------|
8484
| [aws_ssoadmin_account_assignment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssoadmin_account_assignment) | resource |
85+
| [aws_ssoadmin_customer_managed_policy_attachment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssoadmin_customer_managed_policy_attachment) | resource |
8586
| [aws_ssoadmin_managed_policy_attachment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssoadmin_managed_policy_attachment) | resource |
8687
| [aws_ssoadmin_permission_set.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssoadmin_permission_set) | resource |
8788
| [aws_ssoadmin_permission_set_inline_policy.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ssoadmin_permission_set_inline_policy) | resource |

examples/complete/README.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Before this example can be used, please ensure that the following pre-requisites
66
- Enable AWS SSO. [Documentation](https://docs.aws.amazon.com/singlesignon/latest/userguide/step1.html).
77
- Create AWS SSO entities (Users and Groups). [Documentation](https://docs.aws.amazon.com/singlesignon/latest/userguide/addusers.html).
88
- Ensure that Terraform is using a role with permissions required for AWS SSO management. [Documentation](https://docs.aws.amazon.com/singlesignon/latest/userguide/iam-auth-access-using-id-policies.html#requiredpermissionsconsole).
9+
- If using Customer Managed Policies in permission sets, please make sure that policy exists (pre-created) in target AWS account.
910

1011
## Diagram
1112
![Alt text](aws_sso_diagram.png?raw=true "Title")
@@ -16,19 +17,19 @@ Before this example can be used, please ensure that the following pre-requisites
1617
| Name | Version |
1718
|------|---------|
1819
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 0.12.23 |
19-
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 3.27 |
20+
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 4.30 |
2021

2122
## Providers
2223

2324
| Name | Version |
2425
|------|---------|
25-
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 3.27 |
26+
| <a name="provider_aws"></a> [aws](#provider\_aws) | >= 4.30 |
2627

2728
## Modules
2829

2930
| Name | Source | Version |
3031
|------|--------|---------|
31-
| <a name="module_sso"></a> [sso](#module\_sso) | avlcloudtechnologies/sso/aws | n/a |
32+
| <a name="module_sso"></a> [sso](#module\_sso) | avlcloudtechnologies/sso/aws | |
3233

3334
## Resources
3435

examples/complete/main.tf

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ provider "aws" {
55
data "aws_organizations_organization" "this" {}
66

77
locals {
8-
all_accounts_names = [for account in toset(data.aws_organizations_organization.this.accounts) : account.name]
9-
all_accounts_map = zipmap(local.all_accounts_names, tolist(toset(data.aws_organizations_organization.this.accounts)))
10-
non_management_accounts_names = [for account in toset(data.aws_organizations_organization.this.non_master_accounts) : account.name]
11-
non_management_accounts_map = zipmap(local.non_management_accounts_names, tolist(toset(data.aws_organizations_organization.this.non_master_accounts)))
8+
all_active_accounts_map = { for account in toset(data.aws_organizations_organization.this.accounts) : account.name => account if account.status == "ACTIVE" }
9+
non_management_active_accounts_map = { for account in toset(data.aws_organizations_organization.this.non_master_accounts) : account.name => account if account.status == "ACTIVE" }
1210
}
1311

1412
module "sso" {
@@ -30,42 +28,44 @@ module "sso" {
3028
},
3129
EKSAdminAccess = {
3230
description = "Allow full EKS and read only access across all AWS resources.",
33-
# Can use Managed Policies and Inline policies in the same permission set
31+
# Can use Managed, Customer and Inline policies in the same permission set
3432
managed_policies = ["arn:aws:iam::aws:policy/job-function/ViewOnlyAccess"]
3533
inline_policy = data.aws_iam_policy_document.EKSAdmin.json
36-
tags = { "foo" = "bar" },
34+
# NOTE! Customer Managed policies have to exist in all AWS accounts that this permission set will be assigned to.
35+
customer_managed_policies = ["customer-managed-policy-foo"]
36+
tags = { "foo" = "bar" },
3737
}
3838
}
3939
account_assignments = [
4040
{
4141
principal_name = "management"
4242
principal_type = "GROUP"
4343
permission_set = "AdministratorAccess"
44-
account_ids = [for account in local.all_accounts_map : account.id]
44+
account_ids = [for account in local.all_active_accounts_map : account.id]
4545
},
4646
{
4747
principal_name = "admins"
4848
principal_type = "GROUP"
4949
permission_set = "AdministratorAccess"
50-
account_ids = [for account in local.non_management_accounts_map : account.id]
50+
account_ids = [for account in local.non_management_active_accounts_map : account.id]
5151
},
5252
{
5353
principal_name = "bob"
5454
principal_type = "USER"
5555
permission_set = "PowerUserAccess"
56-
account_ids = [for account in local.non_management_accounts_map : account.id if contains(var.security_accounts, account.name)]
56+
account_ids = [for account in local.non_management_active_accounts_map : account.id if contains(var.security_accounts, account.name)]
5757
},
5858
{
5959
principal_name = "developers"
6060
principal_type = "GROUP"
6161
permission_set = "ViewOnlyAccess"
62-
account_ids = [for account in local.non_management_accounts_map : account.id if contains(var.developer_readonly_accounts, account.name)]
62+
account_ids = [for account in local.non_management_active_accounts_map : account.id if contains(var.developer_readonly_accounts, account.name)]
6363
},
6464
{
6565
principal_name = "developers"
6666
principal_type = "GROUP"
6767
permission_set = "EKSAdminAccess"
68-
account_ids = [for account in local.non_management_accounts_map : account.id if contains(var.developer_workload_accounts, account.name)]
68+
account_ids = [for account in local.non_management_active_accounts_map : account.id if contains(var.developer_workload_accounts, account.name)]
6969
},
7070
]
7171
}

examples/complete/versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ terraform {
33
required_providers {
44
aws = {
55
source = "hashicorp/aws"
6-
version = ">= 3.27"
6+
version = ">= 4.30"
77
}
88
}
99
}

main.tf

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
locals {
22
ssoadmin_instance_arn = tolist(data.aws_ssoadmin_instances.this.arns)[0]
33
managed_ps = { for ps_name, ps_attrs in var.permission_sets : ps_name => ps_attrs if can(ps_attrs.managed_policies) }
4+
customer_managed_ps = { for ps_name, ps_attrs in var.permission_sets : ps_name => ps_attrs if can(ps_attrs.customer_managed_policies) }
45
# create ps_name and managed policy maps list
56
ps_policy_maps = flatten([
67
for ps_name, ps_attrs in local.managed_ps : [
@@ -10,6 +11,15 @@ locals {
1011
} if can(ps_attrs.managed_policies)
1112
]
1213
])
14+
# create ps_name and customer managed policy maps list
15+
customer_ps_policy_maps = flatten([
16+
for ps_name, ps_attrs in local.customer_managed_ps : [
17+
for policy in ps_attrs.customer_managed_policies : {
18+
ps_name = ps_name
19+
policy_name = policy
20+
} if can(ps_attrs.customer_managed_policies)
21+
]
22+
])
1323
account_assignments = flatten([
1424
for assignment in var.account_assignments : [
1525
for account_id in assignment.account_ids : {
@@ -25,6 +35,7 @@ locals {
2535
}
2636

2737
data "aws_ssoadmin_instances" "this" {}
38+
2839
data "aws_identitystore_group" "this" {
2940
for_each = toset(local.groups)
3041
identity_store_id = tolist(data.aws_ssoadmin_instances.this.identity_store_ids)[0]
@@ -42,11 +53,11 @@ data "aws_identitystore_user" "this" {
4253
attribute_value = each.value
4354
}
4455
}
56+
4557
resource "aws_ssoadmin_permission_set" "this" {
4658
for_each = var.permission_sets
4759

48-
name = each.key
49-
# description = each.value.description
60+
name = each.key
5061
description = lookup(each.value, "description", null)
5162
instance_arn = local.ssoadmin_instance_arn
5263
relay_state = lookup(each.value, "relay_state", null)
@@ -69,6 +80,18 @@ resource "aws_ssoadmin_managed_policy_attachment" "this" {
6980
managed_policy_arn = each.value.policy_arn
7081
permission_set_arn = aws_ssoadmin_permission_set.this[each.value.ps_name].arn
7182
}
83+
84+
resource "aws_ssoadmin_customer_managed_policy_attachment" "this" {
85+
for_each = { for ps in local.customer_ps_policy_maps : "${ps.ps_name}.${ps.policy_name}" => ps }
86+
87+
instance_arn = local.ssoadmin_instance_arn
88+
permission_set_arn = aws_ssoadmin_permission_set.this[each.value.ps_name].arn
89+
customer_managed_policy_reference {
90+
name = each.value.policy_name
91+
path = "/"
92+
}
93+
}
94+
7295
resource "aws_ssoadmin_account_assignment" "this" {
7396
for_each = { for assignment in local.account_assignments : "${assignment.principal_name}.${assignment.permission_set.name}.${assignment.account_id}" => assignment }
7497

versions.tf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ terraform {
33
required_providers {
44
aws = {
55
source = "hashicorp/aws"
6-
version = ">= 3.27"
6+
version = ">= 4.30"
77
}
88
}
99
}

0 commit comments

Comments
 (0)