Назад | Перейти на главную страницу

Совместное использование ресурса AWS API Gateway между рабочими пространствами Terraform?

Я видел рабочие области Terraform, рекомендованные для управления разными этапами (стадия, производство). Кажется, что это хорошо работает с большинством вещей, поскольку вы обычно создаете разные ресурсы, в названии которых есть этап / рабочая область, или, если это общий ресурс, вы импортируете его в каждое состояние рабочей области.

Однако я не уверен, как мне поступить со шлюзами API. Этот тип ресурса не может быть импортирован в состоянии, а это означает, что если вы создаете его на стадии подготовки, вам придется удалить его и повторно импортировать в производственной среде.

Как вы справляетесь со стадиями и шлюзами API?

Используйте синтаксис «count» и «splat». "синтаксис splat" - это "*" перед переменной. (например. shared_resource.example.*.id) При использовании этого синтаксиса terraform не выдает ошибку при использовании ресурса, который не создан из-за count: 0. Думаю, это как ошибка.

Например

На первом этапе задание CI использует development рабочая область, то создается общий ресурс. В следующем примере создается ресурс aws_api_gateway_rest_api с именем «example». Далее, используя production рабочая область, ресурс не создается, но терраформно считывает данные "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"
}

Используя ресурс, вы должны указать значение ресурса следующим образом.

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)}"
}

Во-первых, Tfstate следует сохранить в Remote. несколько бэкэнд доступный

Terraform начинается с единственной рабочей области с именем «default».

Настроить S3 как бэкэнд backend.tf

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

  }
}

Рекомендуется включить управление версиями для файлов состояния. Подтолкнуть местный штат к S3

terraform state push

Создать рабочее пространство

 terraform workspace new dev

Created and switched to workspace 'dev'

 terraform workspace new preprod

Выберите рабочее пространство разработчика:

terraform workspace select dev

теперь, когда вы подали заявку terraform apply ваш файл tfstate будет храниться в S3

Затем вызовите переменную в зависимости от текущего рабочего пространства

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