Skip to content

Commit 29013e6

Browse files
stevehipwellbarryib
authored andcommitted
docs: Use IRSA for Node Termination Handler IAM policy attachement in Instance Refresh example (terraform-aws-modules#1373)
1 parent b8295d4 commit 29013e6

File tree

2 files changed

+57
-32
lines changed

2 files changed

+57
-32
lines changed

examples/instance_refresh/main.tf

+55-30
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
# Based on the official aws-node-termination-handler setup guide at https://github.com/aws/aws-node-termination-handler#infrastructure-setup
2+
13
provider "aws" {
24
region = var.region
35
}
@@ -50,7 +52,7 @@ module "vpc" {
5052
enable_dns_hostnames = true
5153
}
5254

53-
data "aws_iam_policy_document" "node_term" {
55+
data "aws_iam_policy_document" "aws_node_termination_handler" {
5456
statement {
5557
effect = "Allow"
5658
actions = [
@@ -76,22 +78,17 @@ data "aws_iam_policy_document" "node_term" {
7678
"sqs:ReceiveMessage"
7779
]
7880
resources = [
79-
module.node_term_sqs.sqs_queue_arn
81+
module.aws_node_termination_handler_sqs.sqs_queue_arn
8082
]
8183
}
8284
}
8385

84-
resource "aws_iam_policy" "node_term" {
85-
name = "node-term-${local.cluster_name}"
86-
policy = data.aws_iam_policy_document.node_term.json
87-
}
88-
89-
resource "aws_iam_role_policy_attachment" "node_term_policy" {
90-
policy_arn = aws_iam_policy.node_term.arn
91-
role = module.eks.worker_iam_role_name
86+
resource "aws_iam_policy" "aws_node_termination_handler" {
87+
name = "${local.cluster_name}-aws-node-termination-handler"
88+
policy = data.aws_iam_policy_document.aws_node_termination_handler.json
9289
}
9390

94-
data "aws_iam_policy_document" "node_term_events" {
91+
data "aws_iam_policy_document" "aws_node_termination_handler_events" {
9592
statement {
9693
effect = "Allow"
9794
principals {
@@ -110,16 +107,16 @@ data "aws_iam_policy_document" "node_term_events" {
110107
}
111108
}
112109

113-
module "node_term_sqs" {
110+
module "aws_node_termination_handler_sqs" {
114111
source = "terraform-aws-modules/sqs/aws"
115112
version = "~> 3.0.0"
116113
name = local.cluster_name
117114
message_retention_seconds = 300
118-
policy = data.aws_iam_policy_document.node_term_events.json
115+
policy = data.aws_iam_policy_document.aws_node_termination_handler_events.json
119116
}
120117

121-
resource "aws_cloudwatch_event_rule" "node_term_event_rule" {
122-
name = "${local.cluster_name}-nth-rule"
118+
resource "aws_cloudwatch_event_rule" "aws_node_termination_handler_asg" {
119+
name = "${local.cluster_name}-asg-termination"
123120
description = "Node termination event rule"
124121
event_pattern = jsonencode(
125122
{
@@ -134,24 +131,46 @@ resource "aws_cloudwatch_event_rule" "node_term_event_rule" {
134131
)
135132
}
136133

137-
resource "aws_cloudwatch_event_target" "node_term_event_target" {
138-
rule = aws_cloudwatch_event_rule.node_term_event_rule.name
139-
target_id = "ANTHandler"
140-
arn = module.node_term_sqs.sqs_queue_arn
134+
resource "aws_cloudwatch_event_target" "aws_node_termination_handler_asg" {
135+
target_id = "${local.cluster_name}-asg-termination"
136+
rule = aws_cloudwatch_event_rule.aws_node_termination_handler_asg.name
137+
arn = module.aws_node_termination_handler_sqs.sqs_queue_arn
141138
}
142139

143-
module "node_term_role" {
140+
resource "aws_cloudwatch_event_rule" "aws_node_termination_handler_spot" {
141+
name = "${local.cluster_name}-spot-termination"
142+
description = "Node termination event rule"
143+
event_pattern = jsonencode(
144+
{
145+
"source" : [
146+
"aws.ec2"
147+
],
148+
"detail-type" : [
149+
"EC2 Spot Instance Interruption Warning"
150+
]
151+
"resources" : module.eks.workers_asg_arns
152+
}
153+
)
154+
}
155+
156+
resource "aws_cloudwatch_event_target" "aws_node_termination_handler_spot" {
157+
target_id = "${local.cluster_name}-spot-termination"
158+
rule = aws_cloudwatch_event_rule.aws_node_termination_handler_spot.name
159+
arn = module.aws_node_termination_handler_sqs.sqs_queue_arn
160+
}
161+
162+
module "aws_node_termination_handler_role" {
144163
source = "terraform-aws-modules/iam/aws//modules/iam-assumable-role-with-oidc"
145164
version = "4.1.0"
146165
create_role = true
147166
role_description = "IRSA role for ANTH, cluster ${local.cluster_name}"
148167
role_name_prefix = local.cluster_name
149168
provider_url = replace(module.eks.cluster_oidc_issuer_url, "https://", "")
150-
role_policy_arns = [aws_iam_policy.node_term.arn]
169+
role_policy_arns = [aws_iam_policy.aws_node_termination_handler.arn]
151170
oidc_fully_qualified_subjects = ["system:serviceaccount:${var.namespace}:${var.serviceaccount}"]
152171
}
153172

154-
resource "helm_release" "anth" {
173+
resource "helm_release" "aws_node_termination_handler" {
155174
depends_on = [
156175
module.eks
157176
]
@@ -173,29 +192,35 @@ resource "helm_release" "anth" {
173192
}
174193
set {
175194
name = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
176-
value = module.node_term_role.iam_role_arn
195+
value = module.aws_node_termination_handler_role.iam_role_arn
177196
type = "string"
178197
}
179198
set {
180199
name = "enableSqsTerminationDraining"
181200
value = "true"
182201
}
202+
set {
203+
name = "enableSpotInterruptionDraining"
204+
value = "true"
205+
}
183206
set {
184207
name = "queueURL"
185-
value = module.node_term_sqs.sqs_queue_id
208+
value = module.aws_node_termination_handler_sqs.sqs_queue_id
186209
}
187210
set {
188211
name = "logLevel"
189-
value = "DEBUG"
212+
value = "debug"
190213
}
191214
}
192215

193216
# Creating the lifecycle-hook outside of the ASG resource's `initial_lifecycle_hook`
194217
# ensures that node termination does not require the lifecycle action to be completed,
195218
# and thus allows the ASG to be destroyed cleanly.
196-
resource "aws_autoscaling_lifecycle_hook" "node_term" {
197-
name = "node_term-${local.cluster_name}"
198-
autoscaling_group_name = module.eks.workers_asg_names[0]
219+
resource "aws_autoscaling_lifecycle_hook" "aws_node_termination_handler" {
220+
for_each = toset(module.eks.workers_asg_names)
221+
222+
name = "aws-node-termination-handler"
223+
autoscaling_group_name = each.value
199224
lifecycle_transition = "autoscaling:EC2_INSTANCE_TERMINATING"
200225
heartbeat_timeout = 300
201226
default_result = "CONTINUE"
@@ -227,8 +252,8 @@ module "eks" {
227252
key = "foo"
228253
value = "buzz"
229254
propagate_at_launch = true
230-
},
255+
}
231256
]
232-
},
257+
}
233258
]
234259
}

examples/instance_refresh/outputs.tf

+2-2
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ output "region" {
2525

2626
output "sqs_queue_asg_notification_arn" {
2727
description = "SQS queue ASG notification ARN"
28-
value = module.node_term_sqs.sqs_queue_arn
28+
value = module.aws_node_termination_handler_sqs.sqs_queue_arn
2929
}
3030

3131
output "sqs_queue_asg_notification_url" {
3232
description = "SQS queue ASG notification URL"
33-
value = module.node_term_sqs.sqs_queue_id
33+
value = module.aws_node_termination_handler_sqs.sqs_queue_id
3434
}

0 commit comments

Comments
 (0)