mirror of
https://github.com/ysoftdevs/terraform-aws-eks.git
synced 2026-03-26 03:11:06 +01:00
feat: Add support for Karpenter v1 controller IAM role permissions (#3126)
* chore: update controller IAM role permissions to support karpenter v1 * Update versions.tf * Revert "Update versions.tf" This reverts commit f0e5c791443301ef7f802c627efe7f7226b95046. * fix: Add support for both v1 and prior to v1 controller permission policy --------- Co-authored-by: Bryant Biggs <bryantbiggs@gmail.com>
This commit is contained in:
@@ -84,346 +84,7 @@ resource "aws_iam_role" "controller" {
|
||||
data "aws_iam_policy_document" "controller" {
|
||||
count = local.create_iam_role ? 1 : 0
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedEC2InstanceActions"
|
||||
resources = [
|
||||
"arn:${local.partition}:ec2:*::image/*",
|
||||
"arn:${local.partition}:ec2:*::snapshot/*",
|
||||
"arn:${local.partition}:ec2:*:*:spot-instances-request/*",
|
||||
"arn:${local.partition}:ec2:*:*:security-group/*",
|
||||
"arn:${local.partition}:ec2:*:*:subnet/*",
|
||||
"arn:${local.partition}:ec2:*:*:launch-template/*",
|
||||
]
|
||||
|
||||
actions = [
|
||||
"ec2:RunInstances",
|
||||
"ec2:CreateFleet"
|
||||
]
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedEC2InstanceActionsWithTags"
|
||||
resources = [
|
||||
"arn:${local.partition}:ec2:*:*:fleet/*",
|
||||
"arn:${local.partition}:ec2:*:*:instance/*",
|
||||
"arn:${local.partition}:ec2:*:*:volume/*",
|
||||
"arn:${local.partition}:ec2:*:*:network-interface/*",
|
||||
"arn:${local.partition}:ec2:*:*:launch-template/*",
|
||||
"arn:${local.partition}:ec2:*:*:spot-instances-request/*",
|
||||
]
|
||||
actions = [
|
||||
"ec2:RunInstances",
|
||||
"ec2:CreateFleet",
|
||||
"ec2:CreateLaunchTemplate"
|
||||
]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:RequestTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:RequestTag/karpenter.sh/nodepool"
|
||||
values = ["*"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedResourceCreationTagging"
|
||||
resources = [
|
||||
"arn:${local.partition}:ec2:*:*:fleet/*",
|
||||
"arn:${local.partition}:ec2:*:*:instance/*",
|
||||
"arn:${local.partition}:ec2:*:*:volume/*",
|
||||
"arn:${local.partition}:ec2:*:*:network-interface/*",
|
||||
"arn:${local.partition}:ec2:*:*:launch-template/*",
|
||||
"arn:${local.partition}:ec2:*:*:spot-instances-request/*",
|
||||
]
|
||||
actions = ["ec2:CreateTags"]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:RequestTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "ec2:CreateAction"
|
||||
values = [
|
||||
"RunInstances",
|
||||
"CreateFleet",
|
||||
"CreateLaunchTemplate",
|
||||
]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:RequestTag/karpenter.sh/nodepool"
|
||||
values = ["*"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedResourceTagging"
|
||||
resources = ["arn:${local.partition}:ec2:*:*:instance/*"]
|
||||
actions = ["ec2:CreateTags"]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:ResourceTag/karpenter.sh/nodepool"
|
||||
values = ["*"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "ForAllValues:StringEquals"
|
||||
variable = "aws:TagKeys"
|
||||
values = [
|
||||
"karpenter.sh/nodeclaim",
|
||||
"Name",
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedDeletion"
|
||||
resources = [
|
||||
"arn:${local.partition}:ec2:*:*:instance/*",
|
||||
"arn:${local.partition}:ec2:*:*:launch-template/*"
|
||||
]
|
||||
|
||||
actions = [
|
||||
"ec2:TerminateInstances",
|
||||
"ec2:DeleteLaunchTemplate"
|
||||
]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:ResourceTag/karpenter.sh/nodepool"
|
||||
values = ["*"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowRegionalReadActions"
|
||||
resources = ["*"]
|
||||
actions = [
|
||||
"ec2:DescribeAvailabilityZones",
|
||||
"ec2:DescribeImages",
|
||||
"ec2:DescribeInstances",
|
||||
"ec2:DescribeInstanceTypeOfferings",
|
||||
"ec2:DescribeInstanceTypes",
|
||||
"ec2:DescribeLaunchTemplates",
|
||||
"ec2:DescribeSecurityGroups",
|
||||
"ec2:DescribeSpotPriceHistory",
|
||||
"ec2:DescribeSubnets"
|
||||
]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:RequestedRegion"
|
||||
values = [local.region]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowSSMReadActions"
|
||||
resources = coalescelist(var.ami_id_ssm_parameter_arns, ["arn:${local.partition}:ssm:${local.region}::parameter/aws/service/*"])
|
||||
actions = ["ssm:GetParameter"]
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowPricingReadActions"
|
||||
resources = ["*"]
|
||||
actions = ["pricing:GetProducts"]
|
||||
}
|
||||
|
||||
dynamic "statement" {
|
||||
for_each = local.enable_spot_termination ? [1] : []
|
||||
|
||||
content {
|
||||
sid = "AllowInterruptionQueueActions"
|
||||
resources = [try(aws_sqs_queue.this[0].arn, null)]
|
||||
actions = [
|
||||
"sqs:DeleteMessage",
|
||||
"sqs:GetQueueAttributes",
|
||||
"sqs:GetQueueUrl",
|
||||
"sqs:ReceiveMessage"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowPassingInstanceRole"
|
||||
resources = var.create_node_iam_role ? [aws_iam_role.node[0].arn] : [var.node_iam_role_arn]
|
||||
actions = ["iam:PassRole"]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "iam:PassedToService"
|
||||
values = ["ec2.amazonaws.com"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedInstanceProfileCreationActions"
|
||||
resources = ["*"]
|
||||
actions = ["iam:CreateInstanceProfile"]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:RequestTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:RequestTag/topology.kubernetes.io/region"
|
||||
values = [local.region]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:RequestTag/karpenter.k8s.aws/ec2nodeclass"
|
||||
values = ["*"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedInstanceProfileTagActions"
|
||||
resources = ["*"]
|
||||
actions = ["iam:TagInstanceProfile"]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/topology.kubernetes.io/region"
|
||||
values = [local.region]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:RequestTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/topology.kubernetes.io/region"
|
||||
values = [local.region]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:ResourceTag/karpenter.k8s.aws/ec2nodeclass"
|
||||
values = ["*"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:RequestTag/karpenter.k8s.aws/ec2nodeclass"
|
||||
values = ["*"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowScopedInstanceProfileActions"
|
||||
resources = ["*"]
|
||||
actions = [
|
||||
"iam:AddRoleToInstanceProfile",
|
||||
"iam:RemoveRoleFromInstanceProfile",
|
||||
"iam:DeleteInstanceProfile"
|
||||
]
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/kubernetes.io/cluster/${var.cluster_name}"
|
||||
values = ["owned"]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringEquals"
|
||||
variable = "aws:ResourceTag/topology.kubernetes.io/region"
|
||||
values = [local.region]
|
||||
}
|
||||
|
||||
condition {
|
||||
test = "StringLike"
|
||||
variable = "aws:ResourceTag/karpenter.k8s.aws/ec2nodeclass"
|
||||
values = ["*"]
|
||||
}
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowInstanceProfileReadActions"
|
||||
resources = ["*"]
|
||||
actions = ["iam:GetInstanceProfile"]
|
||||
}
|
||||
|
||||
statement {
|
||||
sid = "AllowAPIServerEndpointDiscovery"
|
||||
resources = ["arn:${local.partition}:eks:${local.region}:${local.account_id}:cluster/${var.cluster_name}"]
|
||||
actions = ["eks:DescribeCluster"]
|
||||
}
|
||||
|
||||
dynamic "statement" {
|
||||
for_each = var.iam_policy_statements
|
||||
|
||||
content {
|
||||
sid = try(statement.value.sid, null)
|
||||
actions = try(statement.value.actions, null)
|
||||
not_actions = try(statement.value.not_actions, null)
|
||||
effect = try(statement.value.effect, null)
|
||||
resources = try(statement.value.resources, null)
|
||||
not_resources = try(statement.value.not_resources, null)
|
||||
|
||||
dynamic "principals" {
|
||||
for_each = try(statement.value.principals, [])
|
||||
|
||||
content {
|
||||
type = principals.value.type
|
||||
identifiers = principals.value.identifiers
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "not_principals" {
|
||||
for_each = try(statement.value.not_principals, [])
|
||||
|
||||
content {
|
||||
type = not_principals.value.type
|
||||
identifiers = not_principals.value.identifiers
|
||||
}
|
||||
}
|
||||
|
||||
dynamic "condition" {
|
||||
for_each = try(statement.value.conditions, [])
|
||||
|
||||
content {
|
||||
test = condition.value.test
|
||||
values = condition.value.values
|
||||
variable = condition.value.variable
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
source_policy_documents = var.enable_v1_permissions ? [data.aws_iam_policy_document.v1[0].json] : [data.aws_iam_policy_document.v033[0].json]
|
||||
}
|
||||
|
||||
resource "aws_iam_policy" "controller" {
|
||||
|
||||
Reference in New Issue
Block a user