Skip to content

Commit fd4f5cc

Browse files
feat: provisioned EKS with Terraform and updated frontend banner message
1 parent 767b540 commit fd4f5cc

32 files changed

+1238
-1
lines changed

.gitignore

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,28 @@ test/tracetesting/tracetesting-vars.yaml
5454
*.apk
5555

5656
!src/currency/build
57+
58+
# -----------------------------
59+
# Terraform
60+
# -----------------------------
61+
**/.terraform/ # Terraform plugins and provider binaries
62+
**/.terraform.lock.hcl # Dependency lock file (optional: only ignore if not needed)
63+
**/*.tfstate # Terraform state files
64+
**/*.tfstate.backup # State backup
65+
**/*.tfplan # Terraform plan files
66+
**/crash.log # Crash logs
67+
68+
# -----------------------------
69+
# Local Environment
70+
# -----------------------------
71+
*.log
72+
*.bak
73+
*.swp
74+
.DS_Store
75+
76+
# -----------------------------
77+
# VSCode and IDEs
78+
# -----------------------------
79+
.vscode/
80+
.idea/
81+
*.code-workspace

argocd-app.yaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
apiVersion: argoproj.io/v1alpha1
2+
kind: Application
3+
metadata:
4+
name: ultimate-devops-app
5+
namespace: argocd
6+
spec:
7+
destination:
8+
server: https://kubernetes.default.svc
9+
namespace: default
10+
project: default
11+
source:
12+
repoURL: https://github.com/neamulkabiremon/ultimate-devops-project-demo
13+
targetRevision: main
14+
path: kubernetes
15+
syncPolicy:
16+
automated:
17+
prune: true
18+
selfHeal: true
19+
syncOptions:
20+
- CreateNamespace=true
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.terraform.lock.hcl
2+
.terraform/
3+
*.tfstate
4+
*.tfstate.*
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# terraform {
2+
# backend "s3" {
3+
# bucket = "your-terraform-state-bucket-name"
4+
# key = "eks/${var.env}/terraform.tfstate"
5+
# region = "us-east-2"
6+
# dynamodb_table = "terraform-locks"
7+
# encrypt = true
8+
# }
9+
# }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
env = "dev"
2+
region = "us-east-2"
3+
zone1 = "us-east-2a"
4+
zone2 = "us-east-2b"
5+
eks_name = "eks-dev"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
env = "prod"
2+
region = "us-east-2"
3+
zone1 = "us-east-2a"
4+
zone2 = "us-east-2b"
5+
eks_name = "eks-prod"
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
env = "staging"
2+
region = "us-east-2"
3+
zone1 = "us-east-2a"
4+
zone2 = "us-east-2b"
5+
eks_name = "eks-staging"

infrastructure/eks-cluster/main.tf

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
# -----------------------------
2+
# VPC / Networking Module
3+
# -----------------------------
4+
module "network" {
5+
source = "./modules/network"
6+
env = var.env
7+
region = var.region
8+
zone1 = var.zone1
9+
zone2 = var.zone2
10+
vpc_cidr = "10.0.0.0/16"
11+
eks_name = var.eks_name
12+
}
13+
14+
# -----------------------------
15+
# IAM Module
16+
# -----------------------------
17+
module "iam" {
18+
source = "./modules/iam"
19+
env = var.env
20+
eks_name = var.eks_name
21+
}
22+
23+
# -----------------------------
24+
# EKS Module
25+
# -----------------------------
26+
module "eks" {
27+
source = "./modules/eks"
28+
env = var.env
29+
eks_name = var.eks_name
30+
eks_version = "1.30"
31+
vpc_id = module.network.vpc_id
32+
subnet_ids = module.network.private_subnet_ids
33+
cluster_role = module.iam.eks_cluster_role_arn
34+
node_role = module.iam.eks_node_role_arn
35+
}
36+
37+
# -----------------------------
38+
# Wait for EKS to be Ready
39+
# -----------------------------
40+
resource "null_resource" "wait_for_cluster" {
41+
provisioner "local-exec" {
42+
command = "echo 'Waiting for the EKS cluster to be ready...'"
43+
}
44+
45+
depends_on = [module.eks]
46+
}
47+
48+
# -----------------------------
49+
# OIDC Provider
50+
# -----------------------------
51+
resource "aws_iam_openid_connect_provider" "oidc" {
52+
url = module.eks.oidc_url
53+
client_id_list = ["sts.amazonaws.com"]
54+
thumbprint_list = ["9e99a48a9960b14926bb7f3b02e22da0afd40f78"]
55+
depends_on = [null_resource.wait_for_cluster] # optional, but useful
56+
}
57+
58+
# -----------------------------
59+
# Addons Module (Helm, Metrics, LBC, etc.)
60+
# -----------------------------
61+
module "addons" {
62+
source = "./modules/addons"
63+
cluster_name = module.eks.cluster_name
64+
cluster_region = var.region
65+
vpc_id = module.network.vpc_id
66+
67+
providers = {
68+
helm = helm.eks
69+
kubernetes = kubernetes.eks
70+
}
71+
72+
depends_on = [null_resource.wait_for_cluster]
73+
}
74+
75+
# -----------------------------
76+
# Storage Module (EFS, EBS, CSI)
77+
# -----------------------------
78+
# module "storage" {
79+
# source = "./modules/storage"
80+
# cluster_name = module.eks.cluster_name
81+
# subnet_ids = module.network.private_subnet_ids
82+
# cluster_sg_id = data.aws_eks_cluster.eks.vpc_config[0].cluster_security_group_id
83+
# oidc_url = module.eks.oidc_url
84+
# oidc_arn = aws_iam_openid_connect_provider.oidc.arn
85+
86+
# providers = {
87+
# helm = helm.eks
88+
# kubernetes = kubernetes.eks
89+
# }
90+
91+
# depends_on = [module.addons]
92+
# }
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
terraform {
2+
required_providers {
3+
helm = {
4+
source = "hashicorp/helm"
5+
version = "~> 2.11"
6+
}
7+
kubernetes = {
8+
source = "hashicorp/kubernetes"
9+
version = "~> 2.24"
10+
}
11+
}
12+
}
13+
14+
15+
# ----------------------------------
16+
# Metrics Server
17+
# ----------------------------------
18+
resource "helm_release" "metrics_server" {
19+
name = "metrics-server"
20+
repository = "https://kubernetes-sigs.github.io/metrics-server/"
21+
chart = "metrics-server"
22+
namespace = "kube-system"
23+
version = "3.12.1"
24+
}
25+
26+
# ----------------------------------
27+
# Cluster Autoscaler with IRSA
28+
# ----------------------------------
29+
resource "aws_iam_role" "autoscaler" {
30+
name = "${var.cluster_name}-cluster-autoscaler"
31+
32+
assume_role_policy = jsonencode({
33+
Version = "2012-10-17"
34+
Statement = [{
35+
Effect = "Allow"
36+
Principal = {
37+
Service = "pods.eks.amazonaws.com"
38+
}
39+
Action = ["sts:AssumeRole", "sts:TagSession"]
40+
}]
41+
})
42+
}
43+
44+
resource "aws_iam_policy" "autoscaler" {
45+
name = "${var.cluster_name}-cluster-autoscaler"
46+
policy = file("${path.module}/policies/autoscaler.json")
47+
}
48+
49+
resource "aws_iam_role_policy_attachment" "autoscaler" {
50+
role = aws_iam_role.autoscaler.name
51+
policy_arn = aws_iam_policy.autoscaler.arn
52+
}
53+
54+
resource "aws_eks_pod_identity_association" "autoscaler" {
55+
cluster_name = var.cluster_name
56+
namespace = "kube-system"
57+
service_account = "cluster-autoscaler"
58+
role_arn = aws_iam_role.autoscaler.arn
59+
}
60+
61+
resource "helm_release" "autoscaler" {
62+
name = "cluster-autoscaler"
63+
repository = "https://kubernetes.github.io/autoscaler"
64+
chart = "cluster-autoscaler"
65+
namespace = "kube-system"
66+
version = "9.37.0"
67+
68+
set {
69+
name = "rbac.serviceAccount.name"
70+
value = "cluster-autoscaler"
71+
}
72+
73+
set {
74+
name = "autoDiscovery.clusterName"
75+
value = var.cluster_name
76+
}
77+
78+
set {
79+
name = "awsRegion"
80+
value = var.cluster_region
81+
}
82+
83+
depends_on = [helm_release.metrics_server]
84+
}
85+
86+
# ----------------------------------
87+
# AWS Load Balancer Controller with IRSA
88+
# ----------------------------------
89+
resource "aws_iam_role" "lbc" {
90+
name = "${var.cluster_name}-aws-lbc"
91+
92+
assume_role_policy = jsonencode({
93+
Version = "2012-10-17"
94+
Statement = [{
95+
Effect = "Allow"
96+
Principal = {
97+
Service = "pods.eks.amazonaws.com"
98+
}
99+
Action = ["sts:AssumeRole", "sts:TagSession"]
100+
}]
101+
})
102+
}
103+
104+
resource "aws_iam_policy" "lbc" {
105+
name = "${var.cluster_name}-aws-lbc"
106+
policy = file("${path.module}/policies/aws-lbc.json")
107+
}
108+
109+
resource "aws_iam_role_policy_attachment" "lbc" {
110+
role = aws_iam_role.lbc.name
111+
policy_arn = aws_iam_policy.lbc.arn
112+
}
113+
114+
resource "aws_eks_pod_identity_association" "lbc" {
115+
cluster_name = var.cluster_name
116+
namespace = "kube-system"
117+
service_account = "aws-load-balancer-controller"
118+
role_arn = aws_iam_role.lbc.arn
119+
}
120+
121+
resource "helm_release" "aws_lbc" {
122+
name = "aws-load-balancer-controller"
123+
repository = "https://aws.github.io/eks-charts"
124+
chart = "aws-load-balancer-controller"
125+
namespace = "kube-system"
126+
version = "1.7.2"
127+
128+
set {
129+
name = "clusterName"
130+
value = var.cluster_name
131+
}
132+
133+
set {
134+
name = "region"
135+
value = var.cluster_region
136+
}
137+
138+
set {
139+
name = "vpcId"
140+
value = var.vpc_id
141+
}
142+
143+
set {
144+
name = "serviceAccount.name"
145+
value = "aws-load-balancer-controller"
146+
}
147+
148+
depends_on = [helm_release.autoscaler]
149+
}
150+
151+
# ----------------------------------
152+
# Ingress NGINX
153+
# ----------------------------------
154+
# resource "helm_release" "nginx" {
155+
# name = "external"
156+
# repository = "https://kubernetes.github.io/ingress-nginx"
157+
# chart = "ingress-nginx"
158+
# namespace = "ingress"
159+
# create_namespace = true
160+
# version = "4.10.1"
161+
# wait = false
162+
163+
# values = [file("${path.module}/values/nginx-values.yaml")]
164+
165+
# depends_on = [helm_release.aws_lbc]
166+
# }
167+
168+
# ----------------------------------
169+
# Cert Manager
170+
# ----------------------------------
171+
# resource "helm_release" "cert_manager" {
172+
# name = "cert-manager"
173+
# repository = "https://charts.jetstack.io"
174+
# chart = "cert-manager"
175+
# namespace = "cert-manager"
176+
# create_namespace = true
177+
# version = "v1.14.5"
178+
179+
# set {
180+
# name = "installCRDs"
181+
# value = "true"
182+
# }
183+
184+
# depends_on = [helm_release.nginx]
185+
# }
186+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
output "autoscaler_role_arn" {
2+
value = aws_iam_role.autoscaler.arn
3+
}
4+
5+
output "lbc_role_arn" {
6+
value = aws_iam_role.lbc.arn
7+
}

0 commit comments

Comments
 (0)