Skip to content

Commit 6f4211d

Browse files
feat: use security-group module instead of resource (#68)
* feat: use security-group module instead of resource * Auto Format Co-authored-by: cloudpossebot <[email protected]>
1 parent e0c08e9 commit 6f4211d

File tree

13 files changed

+365
-259
lines changed

13 files changed

+365
-259
lines changed

README.md

Lines changed: 102 additions & 91 deletions
Large diffs are not rendered by default.

README.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ usage: |2-
129129
oidc_provider_enabled = var.oidc_provider_enabled
130130
131131
workers_role_arns = [module.eks_node_group.eks_node_group_role_arn]
132-
workers_security_group_ids = []
133132
}
134133
135134
module "eks_node_group" {
@@ -161,3 +160,5 @@ contributors:
161160
github: "aknysh"
162161
- name: "Igor Rodionov"
163162
github: "goruha"
163+
- name: Vladimir Syromyatnikov
164+
github: SweetOps

docs/terraform.md

Lines changed: 95 additions & 84 deletions
Large diffs are not rendered by default.

examples/complete/fixtures.us-east-2.tfvars

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,5 @@ kubernetes_labels = {}
3333
before_cluster_joining_userdata = <<-EOT
3434
printf "\n\n###\nExample output from before_cluster_joining_userdata\n###\n\n"
3535
EOT
36+
37+
remote_access_enabled = true

examples/complete/main.tf

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,16 @@ module "subnets" {
5454
context = module.this.context
5555
}
5656

57+
module "ssh_key_pair" {
58+
source = "cloudposse/key-pair/aws"
59+
version = "0.18.0"
60+
61+
ssh_public_key_path = "./"
62+
generate_ssh_key = "true"
63+
64+
context = module.this.context
65+
}
66+
5767
module "eks_cluster" {
5868
source = "cloudposse/eks-cluster/aws"
5969
version = "0.28.0"
@@ -79,23 +89,31 @@ data "null_data_source" "wait_for_cluster_and_kubernetes_configmap" {
7989
inputs = {
8090
cluster_name = module.eks_cluster.eks_cluster_id
8191
kubernetes_config_map_id = module.eks_cluster.kubernetes_config_map_id
92+
ec2_ssh_key = module.ssh_key_pair.key_name
8293
}
8394
}
8495

8596
module "eks_node_group" {
8697
source = "../../"
8798

88-
subnet_ids = module.subnets.public_subnet_ids
89-
cluster_name = data.null_data_source.wait_for_cluster_and_kubernetes_configmap.outputs["cluster_name"]
90-
instance_types = var.instance_types
91-
desired_size = var.desired_size
92-
min_size = var.min_size
93-
max_size = var.max_size
94-
kubernetes_version = var.kubernetes_version
95-
kubernetes_labels = var.kubernetes_labels
96-
disk_size = var.disk_size
97-
99+
subnet_ids = module.subnets.public_subnet_ids
100+
cluster_name = data.null_data_source.wait_for_cluster_and_kubernetes_configmap.outputs["cluster_name"]
101+
instance_types = var.instance_types
102+
desired_size = var.desired_size
103+
min_size = var.min_size
104+
max_size = var.max_size
105+
kubernetes_version = var.kubernetes_version
106+
kubernetes_labels = var.kubernetes_labels
107+
disk_size = var.disk_size
108+
ec2_ssh_key = module.ssh_key_pair.key_name
109+
remote_access_enabled = var.remote_access_enabled
98110
before_cluster_joining_userdata = var.before_cluster_joining_userdata
99111

100112
context = module.this.context
113+
114+
depends_on = [
115+
module.ssh_key_pair,
116+
module.eks_cluster,
117+
data.null_data_source.wait_for_cluster_and_kubernetes_configmap
118+
]
101119
}

examples/complete/outputs.tf

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,3 +87,18 @@ output "eks_node_group_status" {
8787
description = "Status of the EKS Node Group"
8888
value = module.eks_node_group.eks_node_group_status
8989
}
90+
91+
output "eks_node_group_security_group_id" {
92+
description = "ID of the EKS cluster Security Group for remote access to EKS Node Group"
93+
value = module.eks_node_group.eks_node_group_remote_access_security_group_id
94+
}
95+
96+
output "eks_node_group_security_group_arn" {
97+
description = "ARN of the EKS cluster Security Group for remote access to EKS Node Group"
98+
value = module.eks_node_group.eks_node_group_remote_access_security_group_arn
99+
}
100+
101+
output "eks_node_group_security_group_name" {
102+
description = "Name of the EKS cluster Security Group for remote access to EKS Node Group"
103+
value = module.eks_node_group.eks_node_group_remote_access_security_group_name
104+
}

examples/complete/variables.tf

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,3 +116,8 @@ variable "before_cluster_joining_userdata" {
116116
default = ""
117117
description = "Additional commands to execute on each worker node before joining the EKS cluster (before executing the `bootstrap.sh` script). For more info, see https://kubedex.com/90-days-of-aws-eks-in-production"
118118
}
119+
120+
variable "remote_access_enabled" {
121+
type = bool
122+
description = "Whether to enable remote access to EKS node group, requires `ec2_ssh_key` to be defined."
123+
}

launch-template.tf

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ locals {
3939

4040
launch_template_vpc_security_group_ids = (
4141
local.need_remote_access_sg ?
42-
concat(data.aws_eks_cluster.this[0].vpc_config[*].cluster_security_group_id, aws_security_group.remote_access.*.id) : []
42+
concat(data.aws_eks_cluster.this[0].vpc_config[*].cluster_security_group_id, module.security_group.*.id, var.security_groups) : []
4343
)
4444

4545
# launch_template_key = join(":", coalescelist(local.launch_template_vpc_security_group_ids, ["closed"]))
@@ -74,7 +74,7 @@ resource "aws_launch_template" "default" {
7474
# Never include instance type in launch template because it is limited to just one
7575
# https://docs.aws.amazon.com/eks/latest/APIReference/API_CreateNodegroup.html#API_CreateNodegroup_RequestSyntax
7676
image_id = local.launch_template_ami == "" ? null : local.launch_template_ami
77-
key_name = local.have_ssh_key ? var.ec2_ssh_key : null
77+
key_name = local.remote_access_enabled ? var.ec2_ssh_key : null
7878

7979
dynamic "tag_specifications" {
8080
for_each = var.resources_to_tag

main.tf

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,10 @@ locals {
77
need_ami_id = local.enabled ? local.features_require_ami && length(local.configured_ami_image_id) == 0 : false
88
need_imds_settings = var.metadata_http_endpoint != "enabled" || var.metadata_http_put_response_hop_limit != 1 || var.metadata_http_tokens != "optional"
99
features_require_launch_template = local.enabled ? length(var.resources_to_tag) > 0 || local.need_userdata || local.features_require_ami || local.need_imds_settings : false
10-
11-
have_ssh_key = var.ec2_ssh_key != null && var.ec2_ssh_key != ""
12-
13-
need_remote_access_sg = local.enabled && local.have_ssh_key && local.generate_launch_template
14-
15-
get_cluster_data = local.enabled ? (local.need_cluster_kubernetes_version || local.need_bootstrap || local.need_remote_access_sg) : false
16-
17-
autoscaler_enabled = var.enable_cluster_autoscaler != null ? var.enable_cluster_autoscaler : var.cluster_autoscaler_enabled == true
10+
remote_access_enabled = local.enabled && var.remote_access_enabled
11+
need_remote_access_sg = local.generate_launch_template && local.remote_access_enabled
12+
get_cluster_data = local.enabled ? (local.need_cluster_kubernetes_version || local.need_bootstrap || local.need_remote_access_sg) : false
13+
autoscaler_enabled = var.enable_cluster_autoscaler != null ? var.enable_cluster_autoscaler : var.cluster_autoscaler_enabled == true
1814
#
1915
# Set up tags for autoscaler and other resources
2016
#
@@ -37,6 +33,9 @@ locals {
3733
}
3834
)
3935
node_group_tags = merge(local.node_tags, local.autoscaler_enabled ? local.autoscaler_tags : {})
36+
37+
# hack to prevent failure when var.remote_access_enabled is false
38+
vpc_id = try(data.aws_eks_cluster.this[0].vpc_config[0].vpc_id, null)
4039
}
4140

4241
module "label" {
@@ -55,7 +54,7 @@ data "aws_eks_cluster" "this" {
5554

5655
# Support keeping 2 node groups in sync by extracting common variable settings
5756
locals {
58-
ng_needs_remote_access = local.have_ssh_key && ! local.use_launch_template
57+
ng_needs_remote_access = local.remote_access_enabled && ! local.use_launch_template
5958
ng = {
6059
cluster_name = var.cluster_name
6160
node_role_arn = join("", aws_iam_role.default.*.arn)
@@ -82,10 +81,9 @@ locals {
8281
}
8382

8483
# Configure remote access via Launch Template if we are using one
85-
need_remote_access = local.ng_needs_remote_access
86-
ec2_ssh_key = local.have_ssh_key ? var.ec2_ssh_key : "none"
87-
# Keep sorted so that change in order does not trigger replacement via random_pet
88-
source_security_group_ids = local.ng_needs_remote_access ? sort(var.source_security_group_ids) : []
84+
need_remote_access = local.ng_needs_remote_access
85+
ec2_ssh_key = local.remote_access_enabled ? var.ec2_ssh_key : "none"
86+
source_security_group_ids = local.ng_needs_remote_access ? sort(concat(module.security_group.*.id, var.security_groups)) : []
8987
}
9088
}
9189

@@ -96,15 +94,14 @@ resource "random_pet" "cbd" {
9694
length = 1
9795

9896
keepers = {
99-
node_role_arn = local.ng.node_role_arn
100-
subnet_ids = join(",", local.ng.subnet_ids)
101-
disk_size = local.ng.disk_size
102-
instance_types = join(",", local.ng.instance_types)
103-
ami_type = local.ng.ami_type
104-
release_version = local.ng.release_version
105-
version = local.ng.version
106-
capacity_type = local.ng.capacity_type
107-
97+
node_role_arn = local.ng.node_role_arn
98+
subnet_ids = join(",", local.ng.subnet_ids)
99+
disk_size = local.ng.disk_size
100+
instance_types = join(",", local.ng.instance_types)
101+
ami_type = local.ng.ami_type
102+
release_version = local.ng.release_version
103+
version = local.ng.version
104+
capacity_type = local.ng.capacity_type
108105
need_remote_access = local.ng.need_remote_access
109106
ec2_ssh_key = local.ng.need_remote_access ? local.ng.ec2_ssh_key : "handled by launch template"
110107
# Any change in security groups requires a new node group, because you cannot delete a security group while it is in use
@@ -115,8 +112,7 @@ resource "random_pet" "cbd" {
115112
# source_security_group_ids = join(",", local.ng.source_security_group_ids, aws_security_group.remote_access.*.id)
116113
#
117114
source_security_group_ids = local.need_remote_access_sg ? "generated for launch template" : join(",", local.ng.source_security_group_ids)
118-
119-
launch_template_id = local.use_launch_template ? local.launch_template_id : "none"
115+
launch_template_id = local.use_launch_template ? local.launch_template_id : "none"
120116
}
121117
}
122118

@@ -180,7 +176,7 @@ resource "aws_eks_node_group" "default" {
180176
aws_iam_role_policy_attachment.amazon_eks_worker_node_autoscale_policy,
181177
aws_iam_role_policy_attachment.amazon_eks_cni_policy,
182178
aws_iam_role_policy_attachment.amazon_ec2_container_registry_read_only,
183-
aws_security_group.remote_access,
179+
module.security_group,
184180
# Also allow calling module to create an explicit dependency
185181
# This is useful in conjunction with terraform-aws-eks-cluster to ensure
186182
# the cluster is fully created and configured before creating any node groups
@@ -243,7 +239,7 @@ resource "aws_eks_node_group" "cbd" {
243239
aws_iam_role_policy_attachment.amazon_eks_worker_node_autoscale_policy,
244240
aws_iam_role_policy_attachment.amazon_eks_cni_policy,
245241
aws_iam_role_policy_attachment.amazon_ec2_container_registry_read_only,
246-
aws_security_group.remote_access,
242+
module.security_group,
247243
# Also allow calling module to create an explicit dependency
248244
# This is useful in conjunction with terraform-aws-eks-cluster to ensure
249245
# the cluster is fully created and configured before creating any node groups

outputs.tf

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ output "eks_node_group_status" {
2929
}
3030

3131
output "eks_node_group_remote_access_security_group_id" {
32-
description = "The ID of the security group generated to allow SSH access to the nodes, if this module generated one"
33-
value = join("", aws_security_group.remote_access.*.id)
32+
description = "ID of the EKS cluster Security Group for remote access to EKS Node Group"
33+
value = module.security_group.id
34+
}
35+
36+
output "eks_node_group_remote_access_security_group_arn" {
37+
description = "ARN of the EKS cluster Security Group for remote access to EKS Node Group"
38+
value = module.security_group.arn
39+
}
40+
41+
output "eks_node_group_remote_access_security_group_name" {
42+
description = "Name of the EKS cluster Security Group for remote access to EKS Node Group"
43+
value = module.security_group.name
3444
}

0 commit comments

Comments
 (0)