provider "aws" { region = local.region } data "aws_availability_zones" "available" {} locals { name = "ex-${replace(basename(path.cwd), "_", "-")}" cluster_version = "1.24" region = "eu-west-1" vpc_cidr = "10.0.0.0/16" azs = slice(data.aws_availability_zones.available.names, 0, 3) tags = { Example = local.name GithubRepo = "terraform-aws-eks" GithubOrg = "terraform-aws-modules" } } ################################################################################ # EKS Module ################################################################################ module "eks" { source = "../.." cluster_name = local.name cluster_version = local.cluster_version cluster_endpoint_public_access = true cluster_addons = { kube-proxy = {} vpc-cni = {} coredns = { configuration_values = jsonencode({ computeType = "Fargate" }) } } vpc_id = module.vpc.vpc_id subnet_ids = module.vpc.private_subnets control_plane_subnet_ids = module.vpc.intra_subnets # Fargate profiles use the cluster primary security group so these are not utilized create_cluster_security_group = false create_node_security_group = false fargate_profile_defaults = { iam_role_additional_policies = { additional = aws_iam_policy.additional.arn } } fargate_profiles = merge( { example = { name = "example" selectors = [ { namespace = "backend" labels = { Application = "backend" } }, { namespace = "app-*" labels = { Application = "app-wildcard" } } ] # Using specific subnets instead of the subnets supplied for the cluster itself subnet_ids = [module.vpc.private_subnets[1]] tags = { Owner = "secondary" } timeouts = { create = "20m" delete = "20m" } } }, { for i in range(3) : "kube-system-${element(split("-", local.azs[i]), 2)}" => { selectors = [ { namespace = "kube-system" } ] # We want to create a profile per AZ for high availability subnet_ids = [element(module.vpc.private_subnets, i)] } } ) tags = local.tags } ################################################################################ # Supporting Resources ################################################################################ module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 3.0" name = local.name cidr = local.vpc_cidr azs = local.azs private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 4, k)] public_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 48)] intra_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 52)] enable_nat_gateway = true single_nat_gateway = true enable_dns_hostnames = true enable_flow_log = true create_flow_log_cloudwatch_iam_role = true create_flow_log_cloudwatch_log_group = true public_subnet_tags = { "kubernetes.io/role/elb" = 1 } private_subnet_tags = { "kubernetes.io/role/internal-elb" = 1 } tags = local.tags } resource "aws_iam_policy" "additional" { name = "${local.name}-additional" policy = jsonencode({ Version = "2012-10-17" Statement = [ { Action = [ "ec2:Describe*", ] Effect = "Allow" Resource = "*" }, ] }) }