Automatiser un déploiement serverless en 15 minutes : GitHub Actions + AWS Lambda avec Terraform (OpenTofu)

Un guide express pensé pour la communauté DevOps de Normandie (Caen, Rouen, Le Havre).

Les start‑up de Caen au Havre, les ESN de Rouen et même les freelances dispersés entre le Calvados et la Manche ont un besoin commun : déployer vite, proprement et à moindre coût. Le triptyque GitHub Actions, AWS Lambda et Terraform (OpenTofu) répond parfaitement à ce défi. Suivez ce tutoriel pas‑à‑pas et livrez votre première fonction serverless en moins de 15 minutes, sans quitter votre bureau normand (ni le couchsurfing avec vue sur la mer !).


Pourquoi ce stack ?

  • GitHub Actions : déjà intégré à vos dépôts GitHub, facile à déclencher à chaque push.
  • AWS Lambda : 1 million d’invocations gratuites par mois, idéal pour tester sans exploser votre budget, que vous soyez à Cherbourg‑en‑Cotentin ou à Évreux.
  • Terraform (OpenTofu) : infra‑as‑code 100 % open‑source, gère la création comme la destruction de ressources.

1. Prérequis

Outil Version conseillée Installation rapide
Git & GitHub ≥ 2.44 sudo apt install git sur votre VM OVH Gravelines (à 2 h de Rouen)
Terraform / OpenTofu ≥ 1.8 brew install opentofu ou choco install opentofu
AWS CLI ≥ 2.14 brew install awscli
Compte AWS Free Tier Sélectionner la région eu-west-3 (Paris) pour une latence minimale depuis la Normandie

Astuce local SEO : Pensez à taguer vos ressources AWS avec location=normandie pour retrouver vos stacks dédiés !


2. Bootstrap du dépôt GitHub

Créez un nouveau repo public ou privé, par exemple serverless-normandie-demo.

mkdir serverless-normandie-demo && cd $_
git init
gh repo create serverless-normandie-demo --private

Arborescence minimale :

.
├── src/            # votre code Lambda (Python, Node.js, etc.)
├── iac/            # fichiers .tf OpenTofu
└── .github/
    └── workflows/
        └── deploy.yml

3. Écrire l’infra avec Terraform (OpenTofu)

iac/main.tf :

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
  required_version = ">= 1.8.0"
}

provider "aws" {
  region = "eu-west-3" # Paris, proche des équipes de Normandie
}

resource "aws_iam_role" "lambda_exec" {
  name               = "lambda_exec_role_normandie"
  assume_role_policy = data.aws_iam_policy_document.lambda.json
}

data "aws_iam_policy_document" "lambda" {
  statement {
    actions = ["sts:AssumeRole"]
    principals {
      type        = "Service"
      identifiers = ["lambda.amazonaws.com"]
    }
  }
}

resource "aws_lambda_function" "hello_normandie" {
  function_name = "helloNormandie"
  role          = aws_iam_role.lambda_exec.arn
  handler       = "handler.hello"
  runtime       = "nodejs20.x"
  filename      = "${path.module}/../src/hello.zip"
  timeout       = 10
}

4. Ajouter vos secrets GitHub

Dans Settings → Secrets and variables → Actions, créez :

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGIONeu-west-3

Tip Rouen Devs : Activez les GitHub Environments pour valider vos déploiements vers l’environnement production-normandie.


5. Le workflow GitHub Actions

.github/workflows/deploy.yml :

name: Deploy Lambda to AWS (Normandie edition)

on:
  push:
    branches:
      - main

jobs:
  plan-and-apply:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup OpenTofu
        uses: opentofu/setup-opentofu@v1
        with:
          tofu_version: '1.8.0'

      - name: Tofu Init
        run: |
          cd iac
          tofu init

      - name: Tofu Plan
        run: |
          cd iac
          tofu plan -out=tfplan

      - name: Tofu Apply
        if: github.ref == 'refs/heads/main'
        run: |
          cd iac
          tofu apply -auto-approve tfplan

En un push sur main, la fonction AWS Lambda est compilée, empaquetée et déployée en région Paris, idéale pour les sites web hébergés dans le Calvados.


6. Tester depuis la Normandie

  1. Naviguez dans la console AWS → LambdahelloNormandie.
  2. Cliquez sur Test puis choisissez un événement par défaut.
  3. Vérifiez la réponse « Bonjour Normandie ! » dans la sortie JSON.

Pour un test HTTP, configurez l’AWS Lambda Function URL ou API Gateway :

curl https://abc123.lambda-url.eu-west-3.on.aws/
# → Bonjour Normandie !

La latence depuis Caen devrait rester sous 25 ms.


7. Nettoyer : rollback facilité

Lorsque votre démonstration au prochain meetup Caen DevOps est terminée :

cd iac && tofu destroy

Vos ressources AWS sont supprimées, pas de mauvaise surprise sur la facture.


8. Aller plus loin

  • Observabilité : branchez AWS CloudWatch Logs et exportez vers Grafana Cloud (datacenter Roubaix).
  • Multi-cloud normand : répliquez le tuto avec Azure Functions (région France Centre) pour comparer la latence depuis la Seine-Maritime.
  • Runner auto‑hébergé : implémentez un runner GitHub sur un VPS à Rouen pour réduire encore le cold‑start des jobs.

FAQ pour les développeurs normands

⏱️ Combien de temps dure réellement le déploiement ?
La phase tofu apply prend ~40 s. Ajoutez le packaging Lambda : comptez 2 à 3 minutes de bout en bout.
💸 Le Free Tier suffit‑il si mon trafic vient de Caen ?
Oui : 1 million d’invocations/ mois. Au‑delà, chaque 1 million supplémentaire coûte environ 0,20 € dans la région Paris — un café sur le port du Havre !
🌐 Puis‑je héberger la Lambda en région eu-west-1 (Irlande) ?
Oui, mais la latence réseau depuis la Normandie est 15‑30 ms plus élevée qu’en eu-west-3. Gardez‑le pour un public international.

Conclusion

En combinant GitHub Actions, AWS Lambda et Terraform (OpenTofu), vous disposez d’une chaîne CI/CD serverless‑friendly et 100 % as‑code. Mieux encore, elle s’adapte parfaitement aux réalités des équipes Normandie Tech : rapidité de mise en place, facturation à l’usage et scalabilité sans stress.

Prêt à montrer votre fonction serverless ? Partagez‑la lors du prochain Rouen Cloud & DevOps Meetup, ou envoyez‑nous le lien sur X/Twitter avec le hashtag #ServerlessNormandie.


Ressources utiles

Article rédigé avec amour depuis la côte d’Albâtre, par rm3a.

Laisse moi un commentaire !

Laisser un commentaire