├── EKS ├── .gitignore ├── ConfigurationFiles │ ├── deployment.yaml │ └── service.yaml ├── backend.tf ├── data.tf ├── main.tf ├── provider.tf ├── terraform.tfvars └── variables.tf ├── Jenkins Server ├── .gitignore ├── README.md ├── backend.tf ├── data.tf ├── jenkins-install.sh ├── main.tf ├── provider.tf ├── terraform.tfvars └── variables.tf ├── Jenkinsfile └── README.md /EKS/.gitignore: -------------------------------------------------------------------------------- 1 | .terraform/* 2 | .terraform.lock.hcl -------------------------------------------------------------------------------- /EKS/ConfigurationFiles/deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: nginx 5 | spec: 6 | selector: 7 | matchLabels: 8 | app: nginx 9 | replicas: 1 10 | template: 11 | metadata: 12 | labels: 13 | app: nginx 14 | spec: 15 | containers: 16 | - name: nginx 17 | image: nginx 18 | ports: 19 | - containerPort: 80 -------------------------------------------------------------------------------- /EKS/ConfigurationFiles/service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: nginx 5 | labels: 6 | app: nginx 7 | spec: 8 | ports: 9 | - name: http 10 | port: 80 11 | protocol: TCP 12 | targetPort: 80 13 | selector: 14 | app: nginx 15 | type: LoadBalancer -------------------------------------------------------------------------------- /EKS/backend.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | backend "s3" { 3 | bucket = "cicd-terraform-eks" 4 | key = "eks/terraform.tfstate" 5 | region = "us-east-1" 6 | } 7 | } -------------------------------------------------------------------------------- /EKS/data.tf: -------------------------------------------------------------------------------- 1 | data "aws_availability_zones" "azs" {} -------------------------------------------------------------------------------- /EKS/main.tf: -------------------------------------------------------------------------------- 1 | module "vpc" { 2 | source = "terraform-aws-modules/vpc/aws" 3 | 4 | name = "jenkins-vpc" 5 | cidr = var.vpc_cidr 6 | 7 | azs = data.aws_availability_zones.azs.names 8 | 9 | private_subnets = var.private_subnets 10 | public_subnets = var.public_subnets 11 | 12 | enable_dns_hostnames = true 13 | enable_nat_gateway = true 14 | single_nat_gateway = true 15 | 16 | tags = { 17 | "kubernetes.io/cluster/my-eks-cluster" = "shared" 18 | } 19 | 20 | public_subnet_tags = { 21 | "kubernetes.io/cluster/my-eks-cluster" = "shared" 22 | "kubernetes.io/role/elb" = 1 23 | } 24 | 25 | private_subnet_tags = { 26 | "kubernetes.io/cluster/my-eks-cluster" = "shared" 27 | "kubernetes.io/role/internal-elb" = 1 28 | } 29 | 30 | } 31 | 32 | module "eks" { 33 | source = "terraform-aws-modules/eks/aws" 34 | 35 | cluster_name = "my-eks-cluster" 36 | cluster_version = "1.24" 37 | 38 | cluster_endpoint_public_access = true 39 | 40 | vpc_id = module.vpc.vpc_id 41 | subnet_ids = module.vpc.private_subnets 42 | 43 | eks_managed_node_groups = { 44 | nodes = { 45 | min_size = 1 46 | max_size = 3 47 | desired_size = 2 48 | 49 | instance_type = ["t2.small"] 50 | } 51 | } 52 | 53 | tags = { 54 | Environment = "dev" 55 | Terraform = "true" 56 | } 57 | } -------------------------------------------------------------------------------- /EKS/provider.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = "us-east-1" 3 | } -------------------------------------------------------------------------------- /EKS/terraform.tfvars: -------------------------------------------------------------------------------- 1 | vpc_cidr = "192.168.0.0/16" 2 | private_subnets = ["192.168.1.0/24", "192.168.2.0/24", "192.168.3.0/24"] 3 | public_subnets = ["192.168.4.0/24", "192.168.5.0/24", "192.168.6.0/24"] -------------------------------------------------------------------------------- /EKS/variables.tf: -------------------------------------------------------------------------------- 1 | variable "vpc_cidr" { 2 | description = "VPC CIDR" 3 | type = string 4 | } 5 | 6 | variable "private_subnets" { 7 | description = "Subnets CIDR" 8 | type = list(string) 9 | } 10 | 11 | variable "public_subnets" { 12 | description = "Subnets CIDR" 13 | type = list(string) 14 | } -------------------------------------------------------------------------------- /Jenkins Server/.gitignore: -------------------------------------------------------------------------------- 1 | .terraform/* 2 | .terraform.lock.hcl -------------------------------------------------------------------------------- /Jenkins Server/README.md: -------------------------------------------------------------------------------- 1 | # terraform-jenkins-eks 2 | Deploying EKS Cluster using Terraform and Jenkins 3 | -------------------------------------------------------------------------------- /Jenkins Server/backend.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | backend "s3" { 3 | bucket = "cicd-terraform-eks" 4 | key = "jenkins/terraform.tfstate" 5 | region = "us-east-1" 6 | } 7 | } -------------------------------------------------------------------------------- /Jenkins Server/data.tf: -------------------------------------------------------------------------------- 1 | data "aws_ami" "example" { 2 | most_recent = true 3 | owners = ["amazon"] 4 | 5 | filter { 6 | name = "name" 7 | values = ["amzn2-ami-kernel-*-hvm-*-x86_64-gp2"] 8 | } 9 | 10 | filter { 11 | name = "root-device-type" 12 | values = ["ebs"] 13 | } 14 | 15 | filter { 16 | name = "virtualization-type" 17 | values = ["hvm"] 18 | } 19 | } 20 | 21 | data "aws_availability_zones" "azs" {} -------------------------------------------------------------------------------- /Jenkins Server/jenkins-install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # install jenkins 4 | sudo yum update -y 5 | sudo wget -O /etc/yum.repos.d/jenkins.repo \ 6 | https://pkg.jenkins.io/redhat-stable/jenkins.repo 7 | sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key 8 | sudo yum upgrade -y 9 | sudo amazon-linux-extras install java-openjdk11 -y 10 | sudo yum install jenkins -y 11 | sudo systemctl enable jenkins 12 | sudo systemctl start jenkins 13 | 14 | # then install git 15 | sudo yum install git -y 16 | 17 | #then install terraform 18 | sudo yum install -y yum-utils 19 | sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo 20 | sudo yum -y install terraform 21 | 22 | #finally install kubectl 23 | sudo curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.6/bin/linux/amd64/kubectl 24 | sudo chmod +x ./kubectl 25 | sudo mkdir -p $HOME/bin && sudo cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin -------------------------------------------------------------------------------- /Jenkins Server/main.tf: -------------------------------------------------------------------------------- 1 | # VPC 2 | module "vpc" { 3 | source = "terraform-aws-modules/vpc/aws" 4 | 5 | name = "jenkins-vpc" 6 | cidr = var.vpc_cidr 7 | 8 | azs = data.aws_availability_zones.azs.names 9 | public_subnets = var.public_subnets 10 | map_public_ip_on_launch = true 11 | 12 | enable_dns_hostnames = true 13 | 14 | tags = { 15 | Name = "jenkins-vpc" 16 | Terraform = "true" 17 | Environment = "dev" 18 | } 19 | 20 | public_subnet_tags = { 21 | Name = "jenkins-subnet" 22 | } 23 | } 24 | 25 | # SG 26 | module "sg" { 27 | source = "terraform-aws-modules/security-group/aws" 28 | 29 | name = "jenkins-sg" 30 | description = "Security Group for Jenkins Server" 31 | vpc_id = module.vpc.vpc_id 32 | 33 | ingress_with_cidr_blocks = [ 34 | { 35 | from_port = 8080 36 | to_port = 8080 37 | protocol = "tcp" 38 | description = "HTTP" 39 | cidr_blocks = "0.0.0.0/0" 40 | }, 41 | { 42 | from_port = 22 43 | to_port = 22 44 | protocol = "tcp" 45 | description = "SSH" 46 | cidr_blocks = "0.0.0.0/0" 47 | } 48 | ] 49 | 50 | egress_with_cidr_blocks = [ 51 | { 52 | from_port = 0 53 | to_port = 0 54 | protocol = "-1" 55 | cidr_blocks = "0.0.0.0/0" 56 | } 57 | ] 58 | 59 | tags = { 60 | Name = "jenkins-sg" 61 | } 62 | } 63 | 64 | # EC2 65 | module "ec2_instance" { 66 | source = "terraform-aws-modules/ec2-instance/aws" 67 | 68 | name = "Jenkins-Server" 69 | 70 | instance_type = var.instance_type 71 | key_name = "jenkins-server-key" 72 | monitoring = true 73 | vpc_security_group_ids = [module.sg.security_group_id] 74 | subnet_id = module.vpc.public_subnets[0] 75 | associate_public_ip_address = true 76 | user_data = file("jenkins-install.sh") 77 | availability_zone = data.aws_availability_zones.azs.names[0] 78 | 79 | tags = { 80 | Name = "Jenkins-Server" 81 | Terraform = "true" 82 | Environment = "dev" 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /Jenkins Server/provider.tf: -------------------------------------------------------------------------------- 1 | provider "aws" { 2 | region = "us-east-1" 3 | } -------------------------------------------------------------------------------- /Jenkins Server/terraform.tfvars: -------------------------------------------------------------------------------- 1 | vpc_cidr = "10.0.0.0/16" 2 | public_subnets = ["10.0.1.0/24"] 3 | instance_type = "t2.micro" -------------------------------------------------------------------------------- /Jenkins Server/variables.tf: -------------------------------------------------------------------------------- 1 | variable "vpc_cidr" { 2 | description = "VPC CIDR" 3 | type = string 4 | } 5 | 6 | variable "public_subnets" { 7 | description = "Subnets CIDR" 8 | type = list(string) 9 | } 10 | 11 | variable "instance_type" { 12 | description = "Instance Type" 13 | type = string 14 | } -------------------------------------------------------------------------------- /Jenkinsfile: -------------------------------------------------------------------------------- 1 | pipeline { 2 | agent any 3 | environment { 4 | AWS_ACCESS_KEY_ID = credentials('AWS_ACCESS_KEY_ID') 5 | AWS_SECRET_ACCESS_KEY = credentials('AWS_SECRET_ACCESS_KEY') 6 | AWS_DEFAULT_REGION = "us-east-1" 7 | } 8 | stages { 9 | stage('Checkout SCM'){ 10 | steps{ 11 | script{ 12 | checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[url: 'https://github.com/gauri17-pro/terraform-jenkins-eks.git']]) 13 | } 14 | } 15 | } 16 | stage('Initializing Terraform'){ 17 | steps{ 18 | script{ 19 | dir('EKS'){ 20 | sh 'terraform init' 21 | } 22 | } 23 | } 24 | } 25 | stage('Formatting Terraform Code'){ 26 | steps{ 27 | script{ 28 | dir('EKS'){ 29 | sh 'terraform fmt' 30 | } 31 | } 32 | } 33 | } 34 | stage('Validating Terraform'){ 35 | steps{ 36 | script{ 37 | dir('EKS'){ 38 | sh 'terraform validate' 39 | } 40 | } 41 | } 42 | } 43 | stage('Previewing the Infra using Terraform'){ 44 | steps{ 45 | script{ 46 | dir('EKS'){ 47 | sh 'terraform plan' 48 | } 49 | input(message: "Are you sure to proceed?", ok: "Proceed") 50 | } 51 | } 52 | } 53 | stage('Creating/Destroying an EKS Cluster'){ 54 | steps{ 55 | script{ 56 | dir('EKS') { 57 | sh 'terraform $action --auto-approve' 58 | } 59 | } 60 | } 61 | } 62 | stage('Deploying Nginx Application') { 63 | steps{ 64 | script{ 65 | dir('EKS/ConfigurationFiles') { 66 | sh 'aws eks update-kubeconfig --name my-eks-cluster' 67 | sh 'kubectl apply -f deployment.yaml' 68 | sh 'kubectl apply -f service.yaml' 69 | } 70 | } 71 | } 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # terraform-jenkins-eks 2 | Deploying EKS Cluster using Terraform and Jenkins 3 | --------------------------------------------------------------------------------