1 votes

Partager une ressource AWS API Gateway entre des espaces de travail Terraform ?

J'ai vu des espaces de travail Terraform recommandés pour la gestion des différentes étapes (staging, production). Cela semble bien fonctionner pour la plupart des choses car vous créez généralement différentes ressources dont le nom contient le stade/espace de travail ou, s'il s'agit d'une ressource partagée, vous l'importez dans chaque état d'espace de travail.

Cependant, je ne suis pas sûr de la façon dont je dois procéder avec les passerelles API. Ce type de ressource ne peut pas être importé dans l'état, ce qui signifie que si vous la créez dans la phase de test, vous devez la supprimer et la réimporter dans la production.

Comment gérez-vous les étapes et les passerelles API ?

2voto

Jubei Points 308

Utilisez "count" et "splat syntax". La "syntaxe splat" est "*" devant une variable. (par exemple shared_resource.example.*.id ) En utilisant cette syntaxe, terraform n'obtient pas d'erreur en utilisant une ressource qui n'est pas créée à cause de count:0. Je pense qu'il s'agit d'un bug.

Par exemple

Dans la première étape, le job CI utilise development l'espace de travail, puis la ressource partagée est créée. Dans l'exemple suivant, une ressource aws_api_gateway_rest_api nommée "exemple" est créée. Ensuite, en utilisant production Dans l'espace de travail, la ressource n'est pas créée mais terraform lit les données de "aws_api_gateway_rest_api.example".

# this resource is created when using development workspace
resource "aws_api_gateway_rest_api" "example" {
    count = "${terraform.workspace == "development" ? 1 : 0}"
    name  = "this is example"
}

data "aws_api_gateway_rest_api" "example" {
    count = "${terraform.workspace == "production" ? 1 : 0}"
    name  = "this is example"
}

En utilisant la ressource, vous devez spécifier la valeur de la ressource comme suit.

resource "sample_resource" "example" {
    rest_api_id = "${terraform.workspace == "production" ? join("", data.aws_api_gateway_rest_api.example.*.id) : join("", aws_api_gateway_rest_api.example.*.id)}"
}

0voto

sanjayparmar Points 625

Tout d'abord, Tfstate doit être stocké dans un backend distant. multiple backend disponible sur

Terraform démarre avec un seul espace de travail nommé "default".

Configuration S3 comme backend backend.tf

terraform {
  backend "s3" {
    region = "eu-south-1"
    bucket = "backend.terraform"
    key = "state.tfstate"

  }
}

Il est recommandé d'activer la gestion des versions pour les fichiers d'état. Pousser l'état local vers S3

terraform state push

Créer un espace de travail

 terraform workspace new dev

Created and switched to workspace 'dev'

 terraform workspace new preprod

Sélectionnez l'espace de travail de développement :

terraform workspace select dev

maintenant, une fois que vous avez appliqué terraform apply votre fichier tfstate sera stocké dans S3

Puis appeler une variable en fonction de l'espace de travail actuel

bucket = "${terraform.workspace == "prod" ? var.bucket_demo_prod : var.bucket_demo}"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X