module "BastionRole" { source = "../modules/security_identity_compliance/iam-role-v2" description = "EKS bastion instance profile" role-name = "BastionInstanceProfile" trusted-entity = "ec2.amazonaws.com" create-instance-profile = true policies = { EksAdmin = { description = "Eks read permissions required for kubectl" policy = jsonencode( { "Statement" : [ { "Sid" : "EksRead", "Action" : [ "eks:Describe*", "eks:List*" ], "Effect" : "Allow", "Resource" : "*" } ], "Version" : "2012-10-17" } ) } } } resource "aws_iam_role_policy_attachment" "BastionProfilePermissions" { role = module.BastionRole.name policy_arn = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore" } module "eks-bastion" { depends_on = [module.eks] # essential for initializing kubectl in userdata source = "../modules/compute/ec2" additional-tags = {} ami-id = data.aws_ami.this.id asso-eip = false asso-public-ip = true use-ipv6 = true data-volumes = {} ebs-encrypted = true instance-name = "${var.environment}-eks-bastion-${random_pet.pet.id}" instance-type = "t4g.micro" key-name = aws_key_pair.kp.key_name kms-key-id = module.KmsKeys.cmks.storage.arn root-volume-size = "8" # security-groups = [module.bastion-sg.id, module.eks.cluster_primary_security_group_id] security-groups = [module.bastion-sg.id] subnet-id = module.vpc.public_subnets[0] instance-profile = module.BastionRole.profile-name[0] spot-max-price = 0.0116 # t4g.micro user-data = < /tmp/aws-auth-patch.yml # /usr/local/bin/kubectl --kubeconfig=/root/.kube/config patch configmap/aws-auth -n kube-system --patch "$(cat /tmp/aws-auth-patch.yml)" # /usr/local/bin/kubectl --kubeconfig=/root/.kube/config get -n kube-system configmap/aws-auth -o yaml EOF } data "aws_ami" "this" { most_recent = true name_regex = "^al2023-ami-2023.*-kernel-6.1-arm64" owners = ["amazon"] filter { name = "virtualization-type" values = ["hvm"] } filter { name = "architecture" values = ["arm64"] } } resource "tls_private_key" "sshkey" { algorithm = "ED25519" } resource "aws_key_pair" "kp" { key_name = "${var.environment}-eks-bastion-${random_pet.pet.id}-key" public_key = tls_private_key.sshkey.public_key_openssh } module "bastion-sg" { source = "../modules/compute/security_group" description = "${var.environment}-eks-bastion-${random_pet.pet.id}-sg" egress = { r1 = "-1,-1,-1,0.0.0.0/0,Allow egress ipv4" r2 = "-1,-1,-1,::/0,Allow egress ipv6" } ingress = { r1 = "tcp,22,22,0.0.0.0/0,ssh" } name = "eks-bastion-${random_pet.pet.id}-sg" vpc-id = module.vpc.vpc_id }