terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = ">= 3.72" } kubernetes = { source = "hashicorp/kubernetes" version = ">= 2.10" } helm = { source = "hashicorp/helm" version = ">= 2.4.1" } } } provider "aws" {} provider "kubernetes" { host = module.eks_blueprints.eks_cluster_endpoint cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data) token = data.aws_eks_cluster_auth.this.token } provider "helm" { kubernetes { host = module.eks_blueprints.eks_cluster_endpoint cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data) token = data.aws_eks_cluster_auth.this.token } } data "aws_eks_cluster_auth" "this" { name = module.eks_blueprints.eks_cluster_id } data "aws_availability_zones" "available" { filter { name = "opt-in-status" values = ["opt-in-not-required"] } } locals { name = "tah-demo-cluster" cluster_name = local.name vpc_cidr = "10.0.0.0/16" azs = slice(data.aws_availability_zones.available.names, 0, 3) tags = { Blueprint = local.cluster_name } } #--------------------------------------------------------------- # EKS Blueprints #--------------------------------------------------------------- module "eks_blueprints" { source = "github.com/aws-ia/terraform-aws-eks-blueprints?ref=v4.27.0" cluster_name = local.cluster_name cluster_version = "1.24" vpc_id = module.vpc.vpc_id private_subnet_ids = module.vpc.private_subnets cluster_endpoint_private_access = true managed_node_groups = { mg_5a = { node_group_name = "managed-ondemand-a" instance_types = ["m5.xlarge"] min_size = 1 max_size = 4 desired_size = var.num_nodes_az1 subnet_ids = [module.vpc.private_subnets[0]] additional_iam_policies = [ "arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess", "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy", "arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess" ] } mg_5b = { node_group_name = "managed-ondemand-b" instance_types = ["m5.xlarge"] min_size = 1 max_size = 4 desired_size = var.num_nodes_az2 subnet_ids = [module.vpc.private_subnets[1]] additional_iam_policies = [ "arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess", "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy", "arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess" ] } mg_5c = { node_group_name = "managed-ondemand-c" instance_types = ["m5.xlarge"] min_size = 1 max_size = 4 desired_size = var.num_nodes_az3 subnet_ids = [module.vpc.private_subnets[2]] additional_iam_policies = [ "arn:aws:iam::aws:policy/AWSXrayWriteOnlyAccess", "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy", "arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess" ] } } tags = local.tags } module "eks_blueprints_kubernetes_addons" { source = "github.com/aws-ia/terraform-aws-eks-blueprints?ref=v4.27.0/modules/kubernetes-addons" eks_cluster_id = module.eks_blueprints.eks_cluster_id eks_cluster_endpoint = module.eks_blueprints.eks_cluster_endpoint eks_oidc_provider = module.eks_blueprints.oidc_provider eks_cluster_version = module.eks_blueprints.eks_cluster_version # EKS Managed Add-ons enable_amazon_eks_vpc_cni = true enable_amazon_eks_coredns = true enable_amazon_eks_kube_proxy = true enable_amazon_eks_aws_ebs_csi_driver = true # Add-ons enable_aws_load_balancer_controller = true enable_metrics_server = true enable_amazon_eks_adot = true tags = local.tags depends_on = [ module.eks_blueprints ] } #--------------------------------------------------------------- # Supporting Resources #--------------------------------------------------------------- module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 3.0" name = local.name cidr = local.vpc_cidr azs = local.azs public_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k)] private_subnets = [for k, v in local.azs : cidrsubnet(local.vpc_cidr, 8, k + 10)] enable_nat_gateway = true single_nat_gateway = true enable_dns_hostnames = true # Manage so we can name manage_default_network_acl = true default_network_acl_tags = { Name = "${local.name}-default" } manage_default_route_table = true default_route_table_tags = { Name = "${local.name}-default" } manage_default_security_group = true default_security_group_tags = { Name = "${local.name}-default" } public_subnet_tags = { "kubernetes.io/cluster/${local.cluster_name}" = "shared" "kubernetes.io/role/elb" = 1 } private_subnet_tags = { "kubernetes.io/cluster/${local.cluster_name}" = "shared" "kubernetes.io/role/internal-elb" = 1 } tags = local.tags } output "configure_kubectl" { description = "Configure kubectl: make sure you're logged in with the correct AWS profile and run the following command to update your kubeconfig" value = module.eks_blueprints.configure_kubectl }