Projet Cloud – Déploiement d’un cluster EKS & d’une Lambda Java (Terraform, Free Tier)
Objectif
Mettre en place une infrastructure cloud automatisée sur AWS comprenant : un cluster Kubernetes (EKS) déployé avec Terraform et une fonction AWS Lambda en Java, le tout opéré depuis une VM EC2 Free Tier.
Ce que ça prouve : maîtrise du provisioning IaC, compréhension d’EKS/Node Groups, packaging Java/Maven pour Lambda, et gestion des coûts Free Tier.
Livrables : code Terraform (provider.tf
, variables.tf
, main.tf
, iam.tf
, outputs.tf
), projet Java (pom.xml
, App.java
), procédure de nettoyage.
Contexte. Projet d’apprentissage DevOps/Cloud : prouver qu’on sait provisionner une infra AWS avec Terraform, opérer un cluster EKS et déployer une Lambda Java ; le tout depuis une VM EC2 Free Tier pour éviter les coûts.
- Déploiement automatisé : Terraform → EKS (VPC, subnets, route, Node Group, IAM).
- Service serverless : Lambda Java packagée avec Maven et testée via la console.
- Gestion des coûts : ressources nettoyées après tests (Node Groups/Cluster/EC2).
- Poste d’admin : instance EC2 t2.micro (Amazon Linux 2) avec Docker + Terraform.
- Réseau : VPC dédié, subnets publics (IGW + route table), SG ouverts minimalement.
- EKS : 1 Cluster + 1 Node Group autoscaling (IP publique activée sur les subnets).
- IAM : rôles/policies pour EKS, nœuds et exécution Lambda (principes du moindre privilège).
# EC2 — installation des outils
sudo yum update -y
sudo yum install -y docker
sudo systemctl enable --now docker
# Terraform (Amazon Linux 2)
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo yum install terraform -y
# Provisioning
terraform init
terraform plan
terraform apply
Incident réel résolu : CREATE_FAILED au niveau des Node Groups → activer
map_public_ip_on_launch = true
sur les subnets publics (sinon pas d’IP attribuée).
infra/
├── provider.tf # Provider AWS, région
├── variables.tf # Noms, versions, CIDR, tailles
├── main.tf # VPC/Subnets/Routes + EKS + Node Group + SG
├── iam.tf # Rôles & policies (EKS, Nodes, Lambda)
├── outputs.tf # Endpoints, OIDC, ARNs utiles
hello-lambda/
├── pom.xml
└── src/main/java/com/infoline/lambda/App.java
provider.tf
provider "aws" {
region = var.aws_region
}
variables.tf
variable "aws_region" { default = "eu-west-3" }
variable "cluster_name" { default = "infoline-eks-cluster" }
variable "vpc_cidr" { default = "10.0.0.0/16" }
Lambda — App.java (handler)
package com.infoline.lambda;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
public class App implements RequestHandler<String, String> {
@Override
public String handleRequest(String input, Context context) {
return "Hello, " + input + " from Lambda!";
}
}
pom.xml (extrait)
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.2.1</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration><source>1.8</source><target>1.8</target></configuration>
</plugin>
EKS (Terraform). Création du VPC + subnets + IGW + RT + cluster + node group → statut “Actif” dans la console EKS.
Lambda (Java). Build Maven, upload du JAR, configuration du handler puis test.
# Build Java (sur EC2)
sudo yum install -y maven
cd ~/hello-lambda
mvn clean package
# Artefact : target/hello-lambda-1.0-SNAPSHOT.jar
# Dans la console AWS Lambda :
# Runtime : Java 8/11
# Handler : com.infoline.lambda.App::handleRequest
# Test : "Steve" → "Hello, Steve from Lambda!"
- IaC Terraform : modéliser réseau + EKS + IAM ; rejouabilité/traçabilité.
- Kubernetes managé : EKS + Node Groups, compréhension réseau et IP publiques.
- Serverless Java : handler, packaging Maven, test & debug.
- FinOps : usage Free Tier, nettoyage pour éviter tout coût.
Problème | Solution |
---|---|
CREATE_FAILED sur le Node Group (pas d’IP publique) | Activer map_public_ip_on_launch = true sur les subnets publics. |
Handler Lambda non résolu | Vérifier le FQCN : com.infoline.lambda.App::handleRequest . |
Erreur Maven “source release … not supported” | Configurer maven-compiler-plugin (source/target = 1.8 ou 11). |
Risque de coûts | Supprimer Node Groups & Cluster en console puis terraform destroy et terminer l’EC2. |
- Supprimer d’abord les Node Groups, puis le Cluster EKS (console).
- Lancer
terraform destroy
sur le projet. - Stop/terminate l’instance EC2 et surveiller l’onglet Billing.