Skip to content

Déployer un bucket S3 sur Scaleway avec Terraform

Vous n’êtes pas sans savoir que la sauvegarde de vos données est une chose à prendre très au sérieux. Perso, je l’ai compris suite à l’incendie d’OVH 😅. Depuis, j’ai mis en place un script pour effectuer les sauvegardes de mon serveur. Je les externalise vers un stockage S3 AWS (j’ai prévu de faire un article pour vous présenter tout ça !). 

“Cool, mais c’est quoi le rapport avec cet article ?” 

J’y viens, j’y viens ! 😉.

Au début, tout se passait à merveille avec le fait d’utiliser un bucket S3 sur AWS, puis mon free tier s’est terminé…  Pour ceux à qui ça ne parle pas, le free tier permet d’essayer gratuitement les services AWS avec des limites spécifiées pendant 1 an. 

J’ai commencé à avoir une petite facture (bon ok, c’était quelques centimes, mais quand même 🐀). J’ai cherché une solution gratuite et je suis rapidement tombé sur Scaleway (vous commencez à faire le rapprochement avec le titre ? 😏). 

L’offre proposée par ce cloud provider, qui plus est, français, répond totalement à mes besoins. 

Je peux bénéficier de 75 GB de stockage par mois à condition d’être en single AZ. Et petit plus, j’ai la même capacité en trafic sortant. Ce qui est très pratique dans mon cas si je souhaite restaurer mes sauvegardes ! 

Update 12/01/2024

Depuis décembre 2023, l’object storage Scaleway qui était jusqu’à présent gratuit pour les 75GB premier GB n’est plus qu’un lointain souvenir… 😭 Attention à vos factures… 🥲

https://www.scaleway.com/en/docs/changelog/?a=object-storage-473dbde2-9521

Du coup, top départ. Mon nouveau projet est lancé ! 🥳

À l’époque sur AWS, j’avais fait du bon gros clic-clic bouton depuis la console pour mettre en place mon bucket S3 et les permissions. 😅

Mais il faut bien apprendre de ses erreurs non ? 

Aujourd’hui, on va utiliser Terraform avec le provider Scaleway pour effectuer le déploiement du bucket S3 ! (là, normalement, vous ne devez plus vous poser de questions par rapport au titre de l’article 😂). Et n’oubliez pas, l’Infra as Code, c’est la vie ! 😜

Création d’un compte Scaleway

Avant toute chose, il faut créer un compte Scaleway. Rien de bien compliqué, c’est très intuitif, on se laisse guider et ça ne prend que quelques minutes. cf la documentation officielle.

PS: pour l’empreinte bancaire, il faut aller sur le site ou application de votre banque, sur la transaction d’un euro, vous aurez un code à 4 chiffres. Entrez-le dans la console Scaleway (attention, le code est valide dix jours).

Bon, maintenant que tout est prêt, passons à la partie Terraform !

Configuration du provider Scaleway

Nous allons utiliser le provider Scaleway pour déployer nos ressources. Mais avant, il faut que l’on configure nos credentials Scaleway afin de s’authentifier via des access key et secret key. cf la documentation 🙂

Je me rends dans la console Scaleway et je génère une API Key sans date d’expiration pour mon utilisateur.

Dans le cadre de cet article, je passerai par des variables d’environnements. J’exporte alors mes clés fraîchement créées :

export SCW_ACCESS_KEY="XXXXXXXXXXX"
export SCW_SECRET_KEY="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
export SCW_DEFAULT_ORGANIZATION_ID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

Pour trouver votre organisation_id, il faut se rendre dans “Organization Dashboard” aller sur votre projet par défaut puis dans l’onglet setting.

Nous sommes désormais prêts à écrire nos premiers fichiers Terraform.

Commençons par indiquer quelles versions du provider Scaleway et de Terraform, nous souhaitons pour notre projet. Créons un fichier version.tf

$ vim version.tf

terraform {
  required_providers {
	scaleway = {
  	source = "scaleway/scaleway"
	}
  }
  required_version = ">= 0.13"
}

On crée ensuite un fichier provider.tf pour indiquer à terraform lequel utiliser. On indique également dans quelle zone et région nos ressources vont être déployées. Je passe ses informations en tant que variable afin de rendre le code plus flexible. Les valeurs sont définies dans le fichier variables.tf.

$ vim provider.tf

provider "scaleway" {
  zone   = var.zone
  region = var.region
}
$ vim variables.tf

variable "zone" {
  type	= string
  default = "fr-par-1"
}

variable "region" {
  type	= string
  default = "fr-par"
}

Création d’un projet Scaleway

Nous allons créer un projet dédié à notre déploiement. Cela permet d’isoler nos ressources et d’y appliquer des permissions uniquement sur celles au sein de ce projet. Créons un fichier project.tf que nous nommerons “terraform-bucket-scaleway”.

$ vim project.tf

resource "scaleway_account_project" "project" {
  name = "terraform-bucket-scaleway"
}

Création d’une application Scaleway

D’après la documentation, une application est un utilisateur dit “non-humain” au sein d’une organisation. Ça tombe bien, je souhaite créer une clé d’API qui n’est pas liée à un utilisateur, pour déployer via Terraform. 

Pour ce faire, je crée un fichier application.tf dans lequel je définis le nom de mon application et une description :

$ vim application.tf

resource "scaleway_iam_application" "main" {
  name    	= "application-terraform-bucket"
  description = "terraform bucket app"
}

Création du bucket et de ses permissions

Ici, nous allons créer notre bucket dans le projet que nous avons créé précédemment. Nous définissons également son nom, dans mon cas : “terraform-s3-bucket”.

Créons le fichier bucket.tf :

$ vim bucket.tf

resource "scaleway_object_bucket" "terraform-bucket" {
  name = "terraform-s3-bucket"
  project_id = scaleway_account_project.project.id

  lifecycle_rule {
	enabled = true
	expiration {
  	days = "7"
	}
  }
}

J’ai déclaré une lifecycle rule, qui permet de mettre en place une règle sur les objets stockés sur le bucket. Ici, une expiration qui définit le moment où les objets expirent afin de les supprimer automatiquement au bout de 7 jours. Cela me permet de limiter la taille du bucket et de ne pas dépasser la limite des 75 GB et de rester dans le “free tier”.

Création d’une policy

Ajoutons un peu de sécurité ! La policy que nous allons mettre en place a pour but de limiter les droits d’écriture sur notre ressource. Ainsi, nous nous assurons qu’uniquement notre application peut écrire dans le bucket. 

Créons le fichier policy.tf:

$ vim policy.tf

resource scaleway_iam_policy "s3_write_object" {
  name = "s3 write object"
  description = "gives app write to object storage in project"
  application_id = scaleway_iam_application.main.id
  rule {
	project_ids = [scaleway_account_project.project.id]
	permission_set_names = ["ObjectStorageObjectsWrite"]
  }
}

Déployer notre code terraform

Ahhhh on va enfin déployer toutes nos ressources. 🥳

Pour ce faire, commençons par lancer la commande terraform init. Qui a pour but d’initialiser le backend terraform et d’installer les providers requis : 

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Reusing previous version of scaleway/scaleway from the dependency lock file
- Installing scaleway/scaleway v2.19.0...
- Installed scaleway/scaleway v2.19.0
Terraform has been successfully initialized!

Maintenant, faisons la commande terraform plan, afin de vérifier quelles ressources vont être déployées :

$ terraform plan

[..SNIP..]
Plan: 4 to add, 0 to change, 0 to destroy.

Vous devez avoir 4 ressources en “plan to add” :

  • scaleway_account_project.terraform_bucket
  • scaleway_iam_application.s3_bucket_terraform
  • scaleway_iam_policy.s3_write_object
  • scaleway_object_bucket.terraform-bucket

Si tout est ok, c’est parti pour le déploiement. Lançons la commande terraform apply :

$ terraform apply

[..SNIP..]
scaleway_account_project.terraform_bucket: Creating...
scaleway_iam_application.s3_bucket_terraform: Creating...
scaleway_iam_application.s3_bucket_terraform: Creation complete after 0s
scaleway_account_project.terraform_bucket: Creation complete after 0s
scaleway_iam_policy.s3_write_object: Creating...
scaleway_object_bucket.terraform-bucket: Creating...
scaleway_iam_policy.s3_write_object: Creation complete after 1s
scaleway_object_bucket.terraform-bucket: Creation complete after 4s

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Coooool, il semblerait que nous ayons notre bucket déployé dans notre projet !! 🥳

Vous pouvez vérifier la présence de ces ressources depuis votre console Scaleway et valider que tout est bon.

Installation et configuration de la CLI AWS

Ce serait sympa de pouvoir stocker des objets sur ce bucket non ? C’est un peu le but de cet article, il me semble ? 😅

Nous allons utiliser la CLI AWS. Si ce n’est pas déjà fait, il faut l’installer en suivant cette documentation.

Ensuite, si vous avez bien suivi 😏, il y a juste notre application qui a le droit d’écrire dans notre bucket. Il faut que l’on lui génère une clé d’API. 

Rendez-vous dans votre console Scaleway dans la section IAM puis API Key. Nous allons également réduire les droits uniquement sur notre projet où se trouve notre bucket :

Attention : gardez bien ces informations, surtout la secret key qui ne sera plus accessible par la suite. 

À ce stade, nous avons toutes les billes pour configurer la CLI AWS et nous pouvons lancer la commande aws configure. Il faut désormais indiquer 3 informations :

  • l’access key de votre application
  • l’id du projet où se trouvent vos ressources (vous le trouverez dans la section settings de votre projet).
  • la secret key de votre application

Les informations seront présentées sous cette forme :

access_key : application_access_key@project_id
secret-key : application_secret_key


Si vous voulez plus de détails, je vous laisse consulter la documentation.

$ aws configure

AWS Access Key ID : XXXXXXXXXXXX@xxxxxx-xxx-xxxx-xxxx-xxxxx
AWS Secret Access Key : xxxxx-xxxxx-xxxx-xxxx-xxxxxxxx
Default region name [fr-par]:
Default output format [None]:

Tester l’upload de fichiers

Allez, le moment de vérité, celui que vous attendez tous… Nous allons copier un fichier sur notre bucket ! 😁

Nous allons utiliser la commande suivante :

aws s3 cp --storage-class ONEZONE_IA toto s3://terraform-s3-bucket

Détaillons un peu les différents arguments :

  • cp : pour indiquer que l’on souhaite copier un fichier
  • –storage-class : pour indiquer la classe de storage, ici je choisis ONEZONE_IA pour bénéficier du free tier
  • toto : qui est le fichier à upload sur notre bucket (assurez-vous d’avoir votre fichier sur votre machine)
  • s3://terraform-s3-bucket : pour indiquer l’adresse de notre bucket

Le résultat de la commande devrait vous retourner ceci :

$ aws s3 cp --storage-class ONEZONE_IA toto s3://terraform-s3-bucket
upload: ./toto to s3://terraform-s3-bucket/toto 

Vous pouvez également vérifier depuis la console Scaleway et valider la présence de notre fichier :

Youhouuuuuuuu, it worksssss 🥳🥳🥳

Conclusion

Et voilàààààà, on arrive à la fin de cet article. Dans lequel on a déployé un bucket S3 sur Scaleway via Terraform. Vous pouvez récupérer le projet Terraform sur mon gitlab juste ici.

Ça m’a permis de faire la découverte du cloud Scaleway. Connaissant uniquement AWS, la prise en main se fait très bien. La documentation est très complète, facilement compréhensible. Je n’ai vraiment pas eu de peine.

J’ai également fait mes premiers pas sur le provider Terraform Scaleway (logique me diriez-vous 😅). Là aussi, aucune douleur. La documentation est au top.

Chose à laquelle je ne m’attendais pas, c’était d’apprendre à utiliser la CLI AWS avec un autre cloud provider. Pour ne rien vous cacher, j’ai passé plusieurs jours pour trouver une configuration fonctionnelle (surtout trouver la syntaxe pour l’access key). Mais c’était très instructif !

Au risque de me répéter, la documentation Scaleway est vraiment bien. Que ce soit pour la partie cloud provider ou provider terraform.

J’espère que cet article vous aura plu et que vous avez appris autant que moi à la suite de celui-ci 😅.

Si vous avez des remarques ou des axes d’améliorations à me remonter, je suis dispo sur linkedin ou twitter 🙂.

Published inNon classé