참고

[AWS] 가장쉽게 VPC 개념잡기

VPC 생성

참고: https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest

module "vpc" {
  source               = "terraform-aws-modules/vpc/aws"
  version              = "~> 3.19.0"
  name                 = "terraform-vpc"
  cidr                 = "${lookup(var.cidr_ab, var.environment)}.0.0/16"
  private_subnets      = local.private_subnets
  public_subnets       = local.public_subnets
  azs                  = local.availability_zones
  enable_dns_hostnames = true
  enable_dns_support   = true
  create_igw           = true
}

기본 route table에 internet gateway 추가

resource "aws_default_route_table" "terraform-route-table" {
  default_route_table_id = module.vpc.default_route_table_id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = module.vpc.igw_id
  }
}

subnet의 route table에 gateway가 없으면 아래와 같은 에러 메세지가 뜨면서 조인 안됨 → 참고

Instances failed to join the kubernetes cluster

Cluster 생성

resource "aws_eks_cluster" "terraform_pipeline_cluster" {
  name     = var.cluster
  version  = var.kubernetes_version
  role_arn = var.role_arn

  vpc_config {
    subnet_ids              = var.subnet_ids
    endpoint_private_access = false
    endpoint_public_access  = true
  }

  # Ensure that IAM Role permissions are created before and deleted after EKS Cluster handling.
  # Otherwise, EKS will not be able to properly delete EKS managed EC2 infrastructure such as Security Groups.
  depends_on = [
    var.cluster_policy_role,
    var.vpn_resource_controller_role,
  ]
}

모듈로 생성

module "cluster" {
  source                       = "../../modules/cluster"
  cluster                      = var.cluster
  kubernetes_version           = var.kubernetes_version
  role_arn                     = module.aws_iam.aws_iam_role
  subnet_ids                   = module.vpc.public_subnets
  cluster_policy_role          = module.aws_iam.aws_iam_eks_cluster_policy_role
  vpn_resource_controller_role = module.aws_iam.aws_iam_vpc_resource_controller_role
}

Node Group 생성

resource "aws_eks_node_group" "terraform_pipeline_node_group" {
  cluster_name    = var.cluster
  node_group_name = var.name
  node_role_arn   = var.role_arn
  subnet_ids      = var.subnet_ids
  disk_size       = var.disk_size
  instance_types  = var.instance_types

  scaling_config {
    desired_size = var.desired_size
    min_size     = var.min_size
    max_size     = var.max_size
  }

  update_config {
    max_unavailable = var.max_unavailable
  }

  # Ensure that IAM Role permissions are created before and deleted after EKS Node Group handling.
  # Otherwise, EKS will not be able to properly delete EC2 Instances and Elastic Network Interfaces.
  depends_on = [
    var.node_policy_role,
    var.cni_policy_role,
    var.ecr_policy_role,
  ]
}

cluster에 위에서 만든 cluster name을 넣어주면 자동으로 join이 됨

모듈로 만들기

module "cpu_node_group" {
  source           = "../../modules/node_group"
  cluster          = module.cluster.name
  name             = "cpu-node-group"
  role_arn         = module.aws_iam.aws_iam_role
  subnet_ids       = module.vpc.public_subnets
  disk_size        = 100
  instance_types   = ["t3.large"]
  desired_size     = 1
  min_size         = 1
  max_size         = 3
  max_unavailable  = 1
  node_policy_role = module.aws_iam.aws_iam_node_policy_role
  cni_policy_role  = module.aws_iam.aws_iam_cni_policy_role
  ecr_policy_role  = module.aws_iam.aws_iam_ecr_policy_role
}