provider "aws" { region = local.region } provider "kubernetes" { host = module.eks_blueprints.eks_cluster_endpoint cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data) exec { api_version = "client.authentication.k8s.io/v1beta1" command = "aws" # This requires the awscli to be installed locally where Terraform is executed args = ["eks", "get-token", "--cluster-name", module.eks_blueprints.eks_cluster_id] } } provider "helm" { kubernetes { host = module.eks_blueprints.eks_cluster_endpoint cluster_ca_certificate = base64decode(module.eks_blueprints.eks_cluster_certificate_authority_data) exec { api_version = "client.authentication.k8s.io/v1beta1" command = "aws" # This requires the awscli to be installed locally where Terraform is executed args = ["eks", "get-token", "--cluster-name", module.eks_blueprints.eks_cluster_id] } } } data "aws_availability_zones" "available" {} locals { name = "latam-containers-roadshow" region = var.aws_region vpc_cidr = "10.0.0.0/16" azs = slice(data.aws_availability_zones.available.names, 0, 3) tags = { Blueprint = local.name GithubRepo = "github.com/aws-ia/terraform-aws-eks-blueprints" } } #--------------------------------------------------------------- # EKS Blueprints #--------------------------------------------------------------- module "eks_blueprints" { source = "github.com/aws-ia/terraform-aws-eks-blueprints?ref=v4.16.0" cluster_name = local.name cluster_version = "1.21" vpc_id = module.vpc.vpc_id private_subnet_ids = module.vpc.private_subnets node_security_group_additional_rules = { ingress_nodes_karpenter_port = { description = "Cluster API to Nodegroup for Karpenter" protocol = "tcp" from_port = 8443 to_port = 8443 type = "ingress" source_cluster_security_group = true } } # Add karpenter.sh/discovery tag so that we can use this as securityGroupSelector in karpenter provisioner node_security_group_tags = { "karpenter.sh/discovery/${local.name}" = local.name } managed_node_groups = { mg_5 = { node_group_name = "managed-ondemand" instance_types = ["m5.large"] desired_size = 2 max_size = 2 min_size = 2 subnet_ids = module.vpc.private_subnets } } tags = local.tags } module "eks_blueprints_kubernetes_addons" { source = "github.com/aws-ia/terraform-aws-eks-blueprints//modules/kubernetes-addons?ref=v4.16.0" eks_cluster_id = module.eks_blueprints.eks_cluster_id # EKS Managed Add-ons enable_amazon_eks_vpc_cni = true enable_amazon_eks_coredns = true enable_amazon_eks_kube_proxy = true # Add-ons enable_aws_load_balancer_controller = true enable_metrics_server = true enable_cluster_autoscaler = false enable_karpenter = false enable_aws_cloudwatch_metrics = false enable_aws_for_fluentbit = false aws_for_fluentbit_helm_config = { name = "aws-for-fluent-bit" chart = "aws-for-fluent-bit" repository = "https://aws.github.io/eks-charts" version = "0.1.16" namespace = "logging" aws_for_fluent_bit_cw_log_group = "/aws/containerinsights/${module.eks_blueprints.eks_cluster_id}/application" # Optional aws_for_fluentbit_cwlog_retention_in_days = 90 create_namespace = true values = [templatefile("./helm_values/aws-for-fluentbit-values.yaml", { region = local.region aws_for_fluent_bit_cw_log_group = "/aws/containerinsights/${module.eks_blueprints.eks_cluster_id}/application" })] set = [ { name = "nodeSelector.kubernetes\\.io/os" value = "linux" } ] } tags = local.tags depends_on = [module.eks_blueprints.managed_node_groups] } #--------------------------------------------------------------- # 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.name}" = "shared" "kubernetes.io/role/elb" = 1 } private_subnet_tags = { "kubernetes.io/cluster/${local.name}" = "shared" "kubernetes.io/role/internal-elb" = 1 } tags = local.tags }