Skip to content

Commit 9f852e7

Browse files
authored
Merge pull request #4 from DataDog/gabedos/iam-task-role
fix: Create task execution role
2 parents ca25dae + 75de73f commit 9f852e7

File tree

2 files changed

+86
-39
lines changed

2 files changed

+86
-39
lines changed

modules/ecs_fargate/iam.tf

Lines changed: 79 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
# ==============================
2+
# Task Execution Role
3+
# ==============================
4+
5+
# Will create or edit the *task execution role*
6+
# only if the user provides a Datadog API key secret ARN
7+
# in order to provide permissions to access the secret
8+
19
locals {
2-
edit_execution_role = var.execution_role_arn != null
3-
create_execution_role = !local.edit_execution_role
410
create_dd_secret_perms = var.dd_api_key_secret_arn != null
11+
edit_execution_role = var.execution_role_arn != null && local.create_dd_secret_perms
12+
create_execution_role = var.execution_role_arn == null && local.create_dd_secret_perms
513
}
614

715
# ==============================
@@ -23,6 +31,63 @@ resource "aws_iam_policy" "dd_secret_access" {
2331
policy = data.aws_iam_policy_document.dd_secret_access[0].json
2432
}
2533

34+
# ==============================
35+
# Case 1: User provides existing Task Execution Role
36+
# ==============================
37+
data "aws_iam_role" "ecs_task_exec_role" {
38+
count = local.edit_execution_role ? 1 : 0
39+
name = element(split("/", var.execution_role_arn), 1)
40+
}
41+
42+
resource "aws_iam_role_policy_attachment" "existing_role_dd_secret" {
43+
count = local.edit_execution_role ? 1 : 0
44+
role = data.aws_iam_role.ecs_task_exec_role[0].name
45+
policy_arn = aws_iam_policy.dd_secret_access[0].arn
46+
}
47+
48+
# ==============================
49+
# Case 2: Create a Task Execution Role
50+
# ==============================
51+
resource "aws_iam_role" "new_ecs_task_execution_role" {
52+
count = local.create_execution_role ? 1 : 0
53+
name = "${var.family}-ecs-task-exec-role"
54+
55+
assume_role_policy = jsonencode({
56+
Version = "2012-10-17"
57+
Statement = [{
58+
Effect = "Allow"
59+
Principal = {
60+
Service = "ecs-tasks.amazonaws.com"
61+
}
62+
Action = "sts:AssumeRole"
63+
}]
64+
})
65+
}
66+
67+
resource "aws_iam_role_policy_attachment" "new_ecs_task_execution_role_policy" {
68+
count = local.create_execution_role ? 1 : 0
69+
role = aws_iam_role.new_ecs_task_execution_role[0].name
70+
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
71+
}
72+
73+
resource "aws_iam_role_policy_attachment" "new_role_dd_secret" {
74+
count = local.create_execution_role ? 1 : 0
75+
role = aws_iam_role.new_ecs_task_execution_role[0].name
76+
policy_arn = aws_iam_policy.dd_secret_access[0].arn
77+
}
78+
79+
# ==============================
80+
# Task Role
81+
# ==============================
82+
83+
# Will create or edit the *task role* always
84+
# in order to add permissions for the ecs_fargate check
85+
86+
locals {
87+
edit_task_role = var.task_role_arn != null
88+
create_task_role = var.task_role_arn == null
89+
}
90+
2691
# ==============================
2792
# ECS Task Permissions Policy
2893
# ==============================
@@ -44,11 +109,12 @@ resource "aws_iam_policy" "dd_ecs_task_permissions" {
44109
}
45110

46111
# ==============================
47-
# Case 1: User provides existing Task Execution Role
112+
# Case 1: User provides existing Task Role
48113
# ==============================
114+
49115
data "aws_iam_role" "ecs_task_role" {
50-
count = local.edit_execution_role ? 1 : 0
51-
name = element(split("/", var.execution_role_arn), 1)
116+
count = local.edit_task_role ? 1 : 0
117+
name = element(split("/", var.task_role_arn), 1)
52118
}
53119

54120
# Always attach `dd_ecs_task_permissions`
@@ -58,19 +124,14 @@ resource "aws_iam_role_policy_attachment" "existing_role_ecs_task_permissions" {
58124
policy_arn = aws_iam_policy.dd_ecs_task_permissions.arn
59125
}
60126

61-
# Conditionally attach `dd_secret_access` only if required
62-
resource "aws_iam_role_policy_attachment" "existing_role_dd_secret" {
63-
count = local.edit_execution_role && local.create_dd_secret_perms ? 1 : 0
64-
role = data.aws_iam_role.ecs_task_role[0].name
65-
policy_arn = aws_iam_policy.dd_secret_access[0].arn
66-
}
67127

68128
# ==============================
69-
# Case 2: Create a Task Execution Role
129+
# Case 2: Create a Task Role
70130
# ==============================
71-
resource "aws_iam_role" "ecs_task_execution" {
72-
count = local.create_execution_role ? 1 : 0
73-
name = "${var.family}-ecs-task-exec-role"
131+
132+
resource "aws_iam_role" "new_ecs_task_role" {
133+
count = local.create_task_role ? 1 : 0
134+
name = "${var.family}-ecs-task-role"
74135

75136
assume_role_policy = jsonencode({
76137
Version = "2012-10-17"
@@ -84,22 +145,9 @@ resource "aws_iam_role" "ecs_task_execution" {
84145
})
85146
}
86147

87-
resource "aws_iam_role_policy_attachment" "ecs_task_execution_policy" {
88-
count = local.create_execution_role ? 1 : 0
89-
role = aws_iam_role.ecs_task_execution[0].name
90-
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
91-
}
92-
93148
# Always attach `dd_ecs_task_permissions`
94149
resource "aws_iam_role_policy_attachment" "new_role_ecs_task_permissions" {
95-
count = local.create_execution_role ? 1 : 0
96-
role = aws_iam_role.ecs_task_execution[0].name
150+
count = local.create_task_role ? 1 : 0
151+
role = aws_iam_role.new_ecs_task_role[0].name
97152
policy_arn = aws_iam_policy.dd_ecs_task_permissions.arn
98-
}
99-
100-
# Conditionally attach `dd_secret_access` only if required
101-
resource "aws_iam_role_policy_attachment" "new_role_dd_secret" {
102-
count = local.create_execution_role && local.create_dd_secret_perms ? 1 : 0
103-
role = aws_iam_role.ecs_task_execution[0].name
104-
policy_arn = aws_iam_policy.dd_secret_access[0].arn
105-
}
153+
}

modules/ecs_fargate/main.tf

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ resource "aws_ecs_task_definition" "this" {
2323

2424
enable_fault_injection = var.enable_fault_injection
2525

26-
# If we editted the provided execution role, use that, otherwise use the one we created
27-
execution_role_arn = local.edit_execution_role ? var.execution_role_arn : aws_iam_role.ecs_task_execution[0].arn
26+
# Prioritize the user-provided task execution role over the one created by the module
27+
execution_role_arn = var.execution_role_arn != null ? var.execution_role_arn : (length(aws_iam_role.new_ecs_task_execution_role) > 0 ? aws_iam_role.new_ecs_task_execution_role[0].arn : null)
28+
2829
family = var.family
2930

3031
# Fargate incompatible parameter
@@ -74,7 +75,8 @@ resource "aws_ecs_task_definition" "this" {
7475
}
7576

7677
skip_destroy = var.skip_destroy
77-
task_role_arn = var.task_role_arn
78+
# Prioritize the user-provided task role over the one created by the module
79+
task_role_arn = var.task_role_arn != null ? var.task_role_arn : (length(aws_iam_role.new_ecs_task_role) > 0 ? aws_iam_role.new_ecs_task_role[0].arn : null)
7880

7981
dynamic "volume" {
8082
for_each = var.volume
@@ -139,11 +141,8 @@ resource "aws_ecs_task_definition" "this" {
139141
tags = var.tags
140142

141143
depends_on = [
142-
aws_iam_role_policy_attachment.ecs_task_execution_policy,
143-
aws_iam_role_policy_attachment.existing_role_dd_secret,
144-
aws_iam_role_policy_attachment.new_role_ecs_task_permissions,
145-
aws_iam_role_policy_attachment.new_role_dd_secret,
146-
aws_iam_role_policy_attachment.new_role_ecs_task_permissions
144+
aws_iam_role.new_ecs_task_role,
145+
aws_iam_role.new_ecs_task_execution_role,
147146
]
148147

149148
lifecycle {

0 commit comments

Comments
 (0)