Skip to content

Commit 792c0bd

Browse files
External Deployments Operator IAM Role (#258)
1 parent 1466c67 commit 792c0bd

File tree

17 files changed

+142
-3
lines changed

17 files changed

+142
-3
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,5 @@ k8s-proxy-tunnel.sh
5353

5454
# local files
5555
.DS_Store
56-
*/.idea/*
56+
.idea/*
57+
*.iml

.pre-commit-config.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ repos:
6767
- "--args=--severity=HIGH,CRITICAL"
6868
- "--args=--ignorefile=__GIT_WORKING_DIR__/.trivyignore"
6969
- "--args=--exit-code=1"
70+
- "--hook-config=--parallelism-limit=1"
7071
- repo: local
7172
hooks:
7273
- id: check_aws_partition

examples/deploy/meta.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ declare -a MOD_DIRS=(
1111

1212
declare -A COMP_MODS
1313
COMP_MODS["infra"]="infra"
14-
COMP_MODS["cluster"]="eks irsa_external_dns irsa_policies"
14+
COMP_MODS["cluster"]="eks irsa_external_dns irsa_policies irsa_external_deployments_operator"
1515
COMP_MODS["nodes"]="nodes"
1616

1717
declare -A MOD_ADD
1818
MOD_ADD["irsa_external_dns"]="irsa"
1919
MOD_ADD["irsa_policies"]="irsa"
20+
MOD_ADD["irsa_external_deployments_operator"]="irsa"
2021

2122
INFRA_DIR="${MOD_DIRS[0]}"
2223
CLUSTER_DIR="${MOD_DIRS[1]}"

examples/deploy/terraform/cluster/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
| Name | Source | Version |
2222
|------|--------|---------|
2323
| <a name="module_eks"></a> [eks](#module\_eks) | ./../../../../modules/eks | n/a |
24+
| <a name="module_irsa_external_deployments_operator"></a> [irsa\_external\_deployments\_operator](#module\_irsa\_external\_deployments\_operator) | ./../../../../modules/irsa | n/a |
2425
| <a name="module_irsa_external_dns"></a> [irsa\_external\_dns](#module\_irsa\_external\_dns) | ./../../../../modules/irsa | n/a |
2526
| <a name="module_irsa_policies"></a> [irsa\_policies](#module\_irsa\_policies) | ./../../../../modules/irsa | n/a |
2627

@@ -37,6 +38,7 @@
3738
| Name | Description | Type | Default | Required |
3839
|------|-------------|------|---------|:--------:|
3940
| <a name="input_eks"></a> [eks](#input\_eks) | service\_ipv4\_cidr = CIDR for EKS cluster kubernetes\_network\_config.<br> creation\_role\_name = Name of the role to import.<br> k8s\_version = EKS cluster k8s version.<br> kubeconfig = {<br> extra\_args = Optional extra args when generating kubeconfig.<br> path = Fully qualified path name to write the kubeconfig file.<br> }<br> public\_access = {<br> enabled = Enable EKS API public endpoint.<br> cidrs = List of CIDR ranges permitted for accessing the EKS public endpoint.<br> }<br> Custom role maps for aws auth configmap<br> custom\_role\_maps = {<br> rolearn = string<br> username = string<br> groups = list(string)<br> }<br> master\_role\_names = IAM role names to be added as masters in eks.<br> cluster\_addons = EKS cluster addons. vpc-cni is installed separately.<br> vpc\_cni = Configuration for AWS VPC CNI<br> ssm\_log\_group\_name = CloudWatch log group to send the SSM session logs to.<br> identity\_providers = Configuration for IDP(Identity Provider).<br> } | <pre>object({<br> service_ipv4_cidr = optional(string)<br> creation_role_name = optional(string, null)<br> k8s_version = optional(string)<br> kubeconfig = optional(object({<br> extra_args = optional(string)<br> path = optional(string)<br> }), {})<br> public_access = optional(object({<br> enabled = optional(bool)<br> cidrs = optional(list(string))<br> }), {})<br> custom_role_maps = optional(list(object({<br> rolearn = string<br> username = string<br> groups = list(string)<br> })))<br> master_role_names = optional(list(string))<br> cluster_addons = optional(list(string))<br> ssm_log_group_name = optional(string)<br> vpc_cni = optional(object({<br> prefix_delegation = optional(bool)<br> annotate_pod_ip = optional(bool)<br> }))<br> identity_providers = optional(list(object({<br> client_id = string<br> groups_claim = optional(string)<br> groups_prefix = optional(string)<br> identity_provider_config_name = string<br> issuer_url = optional(string)<br> required_claims = optional(string)<br> username_claim = optional(string)<br> username_prefix = optional(string)<br> })))<br> })</pre> | `{}` | no |
41+
| <a name="input_irsa_external_deployments_operator"></a> [irsa\_external\_deployments\_operator](#input\_irsa\_external\_deployments\_operator) | Config to create IRSA role for the external deployments operator. | <pre>object({<br> enabled = optional(bool, false)<br> namespace = optional(string, "domino-compute")<br> service_account_name = optional(string, "pham-juno-operator")<br> })</pre> | `{}` | no |
4042
| <a name="input_irsa_external_dns"></a> [irsa\_external\_dns](#input\_irsa\_external\_dns) | Mappings for custom IRSA configurations. | <pre>object({<br> enabled = optional(bool, false)<br> hosted_zone_name = optional(string, null)<br> namespace = optional(string, null)<br> serviceaccount_name = optional(string, null)<br> rm_role_policy = optional(object({<br> remove = optional(bool, false)<br> detach_from_role = optional(bool, false)<br> policy_name = optional(string, "")<br> }), {})<br> })</pre> | `{}` | no |
4143
| <a name="input_irsa_policies"></a> [irsa\_policies](#input\_irsa\_policies) | Mappings for custom IRSA configurations. | <pre>list(object({<br> name = string<br> namespace = string<br> serviceaccount_name = string<br> policy = string #json<br> }))</pre> | `[]` | no |
4244
| <a name="input_kms_info"></a> [kms\_info](#input\_kms\_info) | Overrides the KMS key information. Meant for migrated configurations.<br> {<br> key\_id = KMS key id.<br> key\_arn = KMS key arn.<br> enabled = KMS key is enabled.<br> } | <pre>object({<br> key_id = string<br> key_arn = string<br> enabled = bool<br> })</pre> | `null` | no |
@@ -47,6 +49,7 @@
4749
| Name | Description |
4850
|------|-------------|
4951
| <a name="output_eks"></a> [eks](#output\_eks) | EKS details. |
52+
| <a name="output_external_deployments_operator"></a> [external\_deployments\_operator](#output\_external\_deployments\_operator) | "External\_deployments\_operator info"<br> {<br> irsa\_role = irsa role arn<br> service\_account\_name = service account name<br> } |
5053
| <a name="output_external_dns_irsa_role_arn"></a> [external\_dns\_irsa\_role\_arn](#output\_external\_dns\_irsa\_role\_arn) | "External\_dns info"<br> {<br> irsa\_role = irsa role arn.<br> zone\_id = hosted zone id for external\_dns Iam policy<br> zone\_name = hosted zone name for external\_dns Iam policy<br> } |
5154
| <a name="output_infra"></a> [infra](#output\_infra) | Infra details. |
5255
<!-- END OF PRE-COMMIT-TERRAFORM DOCS HOOK -->

examples/deploy/terraform/cluster/main.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,18 @@ module "irsa_policies" {
7373
additional_irsa_configs = var.irsa_policies
7474
}
7575

76+
# If you are enabling the IRSA configuration for external-deployments-operator
77+
module "irsa_external_deployments_operator" {
78+
source = "./../../../../modules/irsa"
79+
use_cluster_odc_idp = local.is_eks_account_same
80+
eks_info = module.eks.info
81+
external_deployments_operator = var.irsa_external_deployments_operator
82+
83+
providers = {
84+
aws = aws.global
85+
}
86+
}
87+
7688
# Provider configuration for the account where the hosted zone is defined.
7789
# Useful in configurations where accounts do not have a public hosted zone(i.e us-gov regions) and internet routing(public DNS)
7890
# is instead defined in a different account. Configure the `global` aws alias accordingly,

examples/deploy/terraform/cluster/outputs.tf

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,14 @@ output "external_dns_irsa_role_arn" {
1919
EOF
2020
value = module.irsa_external_dns
2121
}
22+
23+
output "external_deployments_operator" {
24+
description = <<EOF
25+
"External_deployments_operator info"
26+
{
27+
irsa_role = irsa role arn
28+
service_account_name = service account name
29+
}
30+
EOF
31+
value = module.irsa_external_deployments_operator
32+
}

examples/deploy/terraform/cluster/variables.tf

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,15 @@ variable "use_fips_endpoint" {
117117
type = bool
118118
default = false
119119
}
120+
121+
variable "irsa_external_deployments_operator" {
122+
description = "Config to create IRSA role for the external deployments operator."
123+
124+
type = object({
125+
enabled = optional(bool, false)
126+
namespace = optional(string, "domino-compute")
127+
service_account_name = optional(string, "pham-juno-operator")
128+
})
129+
130+
default = {}
131+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
deploy_id = "ed-test-001"
2+
region = "us-west-2"
3+
ssh_pvt_key_path = "domino.pem"
4+
5+
default_node_groups = {
6+
compute = {
7+
availability_zone_ids = ["usw2-az1", "usw2-az2"]
8+
}
9+
gpu = {
10+
availability_zone_ids = ["usw2-az1", "usw2-az2"]
11+
}
12+
platform = {
13+
"availability_zone_ids" = ["usw2-az1", "usw2-az2"]
14+
}
15+
}
16+
17+
bastion = {
18+
enabled = true
19+
}
20+
21+
irsa_external_deployments_operator = {
22+
enabled = "true",
23+
namespace = "domino-compute",
24+
service_account_name = "test-operator-account"
25+
}

modules/irsa/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ No modules.
3333
| [aws_iam_policy.external_dns](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy) | resource |
3434
| [aws_iam_policy.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy) | resource |
3535
| [aws_iam_policy.trident_operator](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy) | resource |
36+
| [aws_iam_role.external_deployments_operator](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
3637
| [aws_iam_role.external_dns](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
3738
| [aws_iam_role.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
3839
| [aws_iam_role.trident_operator](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |
@@ -52,6 +53,7 @@ No modules.
5253
|------|-------------|------|---------|:--------:|
5354
| <a name="input_additional_irsa_configs"></a> [additional\_irsa\_configs](#input\_additional\_irsa\_configs) | Input for additional irsa configurations | <pre>list(object({<br> name = string<br> namespace = string<br> serviceaccount_name = string<br> policy = string #json<br> }))</pre> | `[]` | no |
5455
| <a name="input_eks_info"></a> [eks\_info](#input\_eks\_info) | cluster = {<br> specs {<br> name = Cluster name.<br> account\_id = AWS account id where the cluster resides.<br> }<br> oidc = {<br> arn = OIDC provider ARN.<br> url = OIDC provider url.<br> cert = {<br> thumbprint\_list = OIDC cert thumbprints.<br> url = OIDC cert URL.<br> }<br> } | <pre>object({<br> nodes = object({<br> roles = list(object({<br> arn = string<br> name = string<br> }))<br> })<br> cluster = object({<br> specs = object({<br> name = string<br> account_id = string<br> })<br> oidc = object({<br> arn = string<br> url = string<br> cert = object({<br> thumbprint_list = list(string)<br> url = string<br> })<br> })<br> })<br> })</pre> | n/a | yes |
56+
| <a name="input_external_deployments_operator"></a> [external\_deployments\_operator](#input\_external\_deployments\_operator) | Config to create IRSA role for the external deployments operator. | <pre>object({<br> enabled = optional(bool, false)<br> namespace = optional(string, "domino-compute")<br> service_account_name = optional(string, "pham-juno-operator")<br> })</pre> | `{}` | no |
5557
| <a name="input_external_dns"></a> [external\_dns](#input\_external\_dns) | Config to enable irsa for external-dns | <pre>object({<br> enabled = optional(bool, false)<br> hosted_zone_name = optional(string, null)<br> hosted_zone_private = optional(string, false)<br> namespace = optional(string, "domino-platform")<br> serviceaccount_name = optional(string, "external-dns")<br> rm_role_policy = optional(object({<br> remove = optional(bool, false)<br> detach_from_role = optional(bool, false)<br> policy_name = optional(string, "")<br> }), {})<br> })</pre> | `{}` | no |
5658
| <a name="input_netapp_trident_operator"></a> [netapp\_trident\_operator](#input\_netapp\_trident\_operator) | Config to create IRSA role for the netapp-trident-operator. | <pre>object({<br> enabled = optional(bool, false)<br> namespace = optional(string, "trident")<br> serviceaccount_name = optional(string, "trident-controller")<br> region = optional(string)<br> })</pre> | `{}` | no |
5759
| <a name="input_use_cluster_odc_idp"></a> [use\_cluster\_odc\_idp](#input\_use\_cluster\_odc\_idp) | Toogle to uset the oidc idp connector in the trust policy.<br> Set to `true` if the cluster and the hosted zone are in different aws accounts.<br> `rm_role_policy` used to facilitiate the cleanup if a node attached policy was used previously. | `bool` | `true` | no |
@@ -61,6 +63,7 @@ No modules.
6163

6264
| Name | Description |
6365
|------|-------------|
66+
| <a name="output_external_deployments_operator"></a> [external\_deployments\_operator](#output\_external\_deployments\_operator) | External deployments operator role info |
6467
| <a name="output_external_dns"></a> [external\_dns](#output\_external\_dns) | External\_dns info |
6568
| <a name="output_netapp_trident_operator"></a> [netapp\_trident\_operator](#output\_netapp\_trident\_operator) | NetApp Astra Trident NETAPP Operator role info |
6669
| <a name="output_roles"></a> [roles](#output\_roles) | Roles mapping info |
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
resource "aws_iam_role" "external_deployments_operator" {
2+
count = var.external_deployments_operator.enabled ? 1 : 0
3+
4+
name = "${local.name_prefix}-external-deployments-operator"
5+
assume_role_policy = jsonencode({
6+
Version = "2012-10-17"
7+
Statement = [
8+
{
9+
Action = "sts:AssumeRoleWithWebIdentity"
10+
Effect = "Allow"
11+
Principal = {
12+
Federated = local.oidc_provider_arn
13+
}
14+
Condition : {
15+
StringEquals : {
16+
"${trimprefix(local.oidc_provider_url, "https://")}:aud" : "sts.amazonaws.com",
17+
"${trimprefix(local.oidc_provider_url, "https://")}:sub" : "system:serviceaccount:${var.external_deployments_operator.namespace}:${var.external_deployments_operator.service_account_name}"
18+
}
19+
}
20+
},
21+
]
22+
})
23+
}

0 commit comments

Comments
 (0)