/** * # eks-ipv6-nginxpod * * ## Features * - Use terraform-aws-eks to deploy eks cluster and a nodegroup using spot instances * - Use Ipv6 for eks cluster * - Dependent VPC and roles are created * - use pod identity for EBS abd loadbalancer controller * - Create a bastion to manage EKS cluster * * */ data "aws_region" "this" {} # Eks Vpc on IPv6 resource "random_pet" "pet" { length = 1 } locals { vpc_cidr = "10.18.0.0/16" # ensure there is room for future expansion private_net_start = cidrsubnet(local.vpc_cidr, 2, 1) public_net_start = cidrsubnet(local.vpc_cidr, 2, 2) } data "aws_availability_zones" "this" { state = "available" } resource "random_shuffle" "Select2Az" { input = data.aws_availability_zones.this.names result_count = 2 } module "vpc" { source = "terraform-aws-modules/vpc/aws" version = "6.6.0" name = "lab-vpc" cidr = local.vpc_cidr azs = random_shuffle.Select2Az.result enable_ipv6 = true public_subnet_assign_ipv6_address_on_creation = true private_subnet_assign_ipv6_address_on_creation = true # private_subnet_ipv6_native = true # EKS requires free IPv4 addresses. see README private_subnets = cidrsubnets(local.private_net_start, 4, 4) # EKS requires free IPv4 addresses. see README public_subnets = cidrsubnets(local.public_net_start, 8, 8) # 2 AZ required by eks lbc public_subnet_ipv6_prefixes = [0, 1] private_subnet_ipv6_prefixes = [10, 11] public_subnet_tags = { "kubernetes.io/role/elb" = 1 } enable_dns_hostnames = true enable_dns_support = true # nat gateway and eigw (vpc module creates the dns64 /64 route to NGW) enable_nat_gateway = true # AWS public endpoints do not support IPv6 single_nat_gateway = true create_egress_only_igw = true enable_flow_log = false create_flow_log_cloudwatch_log_group = false create_flow_log_cloudwatch_iam_role = false manage_default_network_acl = false } # EKS resources module "CsiPodIdentity" { source = "../../modules/security_identity_compliance/iam-role-v2" description = "EKSCSIDriverRole" role-name = "AmazonEBSCSIDriverRole" trusted-entity = jsonencode( { "Version" : "2012-10-17", "Statement" : [ { "Effect" : "Allow", "Principal" : { "Service" : "pods.eks.amazonaws.com" }, "Action" : [ "sts:AssumeRole", "sts:TagSession" ] } ] } ) } # 2 policies are required for the ebs csi to work resource "aws_iam_role_policy_attachment" "CsiPodIdentity" { for_each = toset([ "arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess", "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy" ]) role = module.CsiPodIdentity.name policy_arn = each.value } locals { userdata = <