Совместное использование ресурсов между рабочими пространствами Terraform - PullRequest
0 голосов
/ 02 октября 2018

У меня есть инфраструктура, которую я развертываю, используя Terraform в AWS.Эту инфраструктуру можно развернуть в разных средах, для которых я использую рабочие пространства.

Большинство компонентов в развертывании следует создавать отдельно для каждой рабочей области, но у меня есть несколько ключевых компонентов, которыми я хочу поделитьсямежду ними, в первую очередь:

  • роли и разрешения IAM
  • Они должны использовать один и тот же шлюз API, но каждое рабочее пространство должно развертываться по разным путям и методам

Например:

resource "aws_iam_role" "lambda_iam_role" {
  name = "LambdaGeneralRole"
  policy = <...>
}

resource "aws_lambda_function" "my_lambda" {
  function_name = "lambda-${terraform.workspace}"
  role = "${aws_iam_role.lambda_iam_role.arn}"
}

Первый ресурс - это роль IAM, которая должна совместно использоваться всеми экземплярами этой лямбды и не должна создаваться повторно более одного раза.

Второй ресурсявляется лямбда-функцией, имя которой зависит от текущего рабочего пространства, поэтому каждое рабочее пространство будет развертываться и отслеживать состояние другой лямбды.

Как разделить ресурсы и их состояние между различными рабочими пространствами Terraform?

1 Ответ

0 голосов
/ 02 октября 2018

Для общих ресурсов я создаю их в отдельном шаблоне, а затем обращаюсь к ним, используя terraform_remote_state в шаблоне, где мне нужна информация о них.

Ниже описано, как я это реализую.возможно другие способы его реализации.YMMV

В шаблоне общих служб (куда вы бы поместили свою роль IAM) я использую бэкэнд Terraform для сохранения выходных данных для шаблона общих служб в Консуле.Вам также необходимо output любая информация, которую вы хотите использовать в других шаблонах.

шаблон share_services

terraform {
  backend "consul" {
    address = "consul.aa.example.com:8500"
    path    = "terraform/shared_services"
  }
}

resource "aws_iam_role" "lambda_iam_role" {
  name = "LambdaGeneralRole"
  policy = <...>
}

output "lambda_iam_role_arn" {
  value = "${aws_iam_role.lambda_iam_role.arn}"
}

«Бэкэнд» в Terraform определяеткак загружается состояние и как выполняется такая операция, как apply.Эта абстракция позволяет хранить нелокальное состояние файлов, выполнять удаленно и т. Д.

В отдельном шаблоне вы вызываете серверную часть как источник данных, используя terraform_remote_state, и можете использовать данные в этом шаблоне.

terraform_remote_state:

Извлекает метаданные состояния из удаленного бэкэнда

отдельный шаблон

data "terraform_remote_state" "shared_services" {
    backend = "consul"
    config {
        address = "consul.aa.example.com:8500"
        path    = "terraform/shared_services"
    }
}

# This is where you use the terraform_remote_state data source
resource "aws_lambda_function" "my_lambda" {
  function_name = "lambda-${terraform.workspace}"
  role = "${data.terraform_remote_state.shared_services.lambda_iam_role_arn}"
}

Ссылки :

https://www.terraform.io/docs/state/remote.html

https://www.terraform.io/docs/backends/

https://www.terraform.io/docs/providers/terraform/d/remote_state.html

...