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.

AWS EKSAWS Lambda (Java) Terraform (IaC)VPC/Subnets/IGW Node GroupsIAM EC2 (Amazon Linux 2)Maven

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.

Voir le repository GitHub
1) Contexte & objectifs

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).
2) Architecture cible & choix techniques
  • 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).

3) Fichiers clés — Terraform & Java
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>
4) Déploiement & tests — EKS + Lambda

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!"
5) Compétences mises en œuvre (KPI pédagogiques)
  • 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.
6) Problèmes rencontrés & solutions
ProblèmeSolution
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.
7) Nettoyage & maîtrise des coûts
  • 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.