# IAM cluster role =========================================================== data "aws_iam_policy_document" "cluster_assume" { statement { effect = "Allow" actions = ["sts:AssumeRole"] principals { type = "Service" identifiers = ["eks.amazonaws.com"] } } } resource "aws_iam_role" "cluster" { name = local.cluster_role_name assume_role_policy = data.aws_iam_policy_document.cluster_assume.json tags = local.tags } resource "aws_iam_role_policy_attachment" "cluster" { for_each = toset([ "arn:${data.aws_partition.current.partition}:iam::aws:policy/AmazonEKSClusterPolicy", "arn:${data.aws_partition.current.partition}:iam::aws:policy/AmazonEKSVPCResourceController", ]) role = aws_iam_role.cluster.name policy_arn = each.value } # CloudWatch log group ------------------------------------------------------- resource "aws_cloudwatch_log_group" "cluster" { name = "/aws/eks/${var.cluster_name}/cluster" retention_in_days = 90 tags = local.tags } # EKS cluster ================================================================ resource "aws_eks_cluster" "this" { name = var.cluster_name version = var.kubernetes_version role_arn = aws_iam_role.cluster.arn vpc_config { subnet_ids = var.subnet_ids security_group_ids = var.security_group_ids endpoint_private_access = var.endpoint_private_access endpoint_public_access = var.endpoint_public_access public_access_cidrs = var.endpoint_public_access ? var.public_access_cidrs : null } enabled_cluster_log_types = var.cluster_log_types dynamic "encryption_config" { for_each = var.secrets_encryption_kms_key_arn != null ? [var.secrets_encryption_kms_key_arn] : [] content { resources = ["secrets"] provider { key_arn = encryption_config.value } } } access_config { authentication_mode = "API_AND_CONFIG_MAP" bootstrap_cluster_creator_admin_permissions = false } tags = local.tags depends_on = [ aws_iam_role_policy_attachment.cluster, aws_cloudwatch_log_group.cluster, ] } # Add-ons ==================================================================== resource "aws_eks_addon" "this" { for_each = var.cluster_addons cluster_name = aws_eks_cluster.this.name addon_name = each.key addon_version = each.value.version resolve_conflicts_on_update = each.value.resolve_conflicts service_account_role_arn = each.value.service_account_role_arn tags = local.tags } # Access entries ============================================================= resource "aws_eks_access_entry" "this" { for_each = var.access_entries cluster_name = aws_eks_cluster.this.name principal_arn = each.value.principal_arn type = each.value.type kubernetes_groups = each.value.kubernetes_groups tags = local.tags } resource "aws_eks_access_policy_association" "this" { for_each = local.policy_assoc_map cluster_name = aws_eks_cluster.this.name principal_arn = var.access_entries[each.value.entry_key].principal_arn policy_arn = each.value.policy_arn access_scope { type = each.value.scope namespaces = each.value.scope == "namespace" ? each.value.namespaces : null } depends_on = [aws_eks_access_entry.this] }