Today, in this blog post, we will explore how to create an Amazon Elastic Kubernetes Service (EKS) cluster using Terraform. We’ll walk through the entire process step-by-step, focusing on essential configurations, including setting up the IAM user and making necessary script adjustments. Let’s dive in!
Prerequisites
Required Tools:
- Terraform installed on your local system.
- AWS CLI configured with your credentials
Architecture:
1. Folder Structure
project-root/
├── main.tf # Core Terraform configuration
├── variables.tf # Input variable definitions
├── outputs.tf # Output definitions
└── README.md # Documentation
2. IAM User Creation
3. Terraform Script Overview
Main.tf
The main configuration includes setting the provider, defining the VPC, subnets, IAM roles, and the EKS cluster.
Provider Setup:
provider "aws" { region = var.aws_region }
VPC Creation:
resource "aws_vpc" "eks_vpc" { cidr_block = var.vpc_cidr_block enable_dns_support = true enable_dns_hostnames = true tags = { Name = "${var.cluster_name}-vpc" } }
Subnets:
resource "aws_subnet" "example_subnet" { count = length(var.subnet_cidr_blocks) vpc_id = aws_vpc.eks_vpc.id cidr_block = var.subnet_cidr_blocks[count.index] availability_zone = data.aws_availability_zones.available.names[count.index] tags = { Name = "${var.cluster_name}-subnet-${count.index}" } }
EKS Cluster:
resource "aws_eks_cluster" "eks_cluster" { name = var.cluster_name role_arn = aws_iam_role.eks_role.arn vpc_config { subnet_ids = aws_subnet.example_subnet[*].id } }
IAM Role for EKS
resource "aws_iam_role" "eks_role" { name = "${var.cluster_name}-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Allow" Principal = { Service = "eks.amazonaws.com" } Action = "sts:AssumeRole" } ] }) }
Policy Attachments for IAM Role
resource "aws_iam_role_policy_attachment" "eks_policies" { for_each = toset([ "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy", "arn:aws:iam::aws:policy/AmazonEKSVPCResourceController", ]) role = aws_iam_role.eks_role.name policy_arn = each.value }
outputs.tf
Define outputs to display the EKS cluster’s key details:
output "eks_cluster_name" { description = "Name of the EKS cluster" value = aws_eks_cluster.eks_cluster.name } output "eks_cluster_endpoint" { description = "EKS Cluster endpoint" value = aws_eks_cluster.eks_cluster.endpoint } output "eks_cluster_arn" { description = "EKS Cluster ARN" value = aws_eks_cluster.eks_cluster.arn }
variables.tf
Customize the variables for the Terraform configuration:
variable "aws_region" { description = "AWS region to deploy resources" default = "ap-south-1" } variable "cluster_name" { description = "Name of the EKS cluster" default = "alvin-eks-cluster" } variable "vpc_cidr_block" { description = "CIDR block for the VPC" default = "10.0.0.0/16" } variable "subnet_cidr_blocks" { description = "List of CIDR blocks for the subnets" type = list(string) default = ["10.0.1.0/24", "10.0.2.0/24"] }
4. Execution Steps
Initialize Terraform:
Run the initialization command to set up the working environment:
bash
terraform init
Plan Configuration:
Generate and review the execution plan:
bash
terraform plan
Before executing the terraform apply command, I retrieved and reviewed the EKS output.
Apply Configuration:
Apply the configuration to create the resources:
bash
terraform apply
Validate the EKS cluster:
- Navigate to the **Amazon EKS console**.
- Review the cluster’s status and configuration details to ensure it has been created.
To destroy the resources
- Run the following command:
terraform destroy
Conclusion
This setup provides an easy and secure way to deploy an EKS cluster on AWS. It’s flexible and can be adjusted to fit your needs, making it a great starting point for exploring DevOps and cloud-native solutions.
A big thank you for exploring TechsBucket! Your visit means a lot to us, and we’re grateful for your time on our platform. If you have any feedback or suggestions, we’d love to hear them.