Как terraform узнает, какой ресурс должен запускаться в первую очередь для ускорения инфраструктуры? - PullRequest
1 голос
/ 19 июня 2019

Я использую terraform, чтобы раскрутить Aws-DMS.Чтобы раскрутить DMS, нам нужны группы подсетей, задача репликации dms, конечные точки dms, экземпляр репликации dms.Я настроил все, используя документацию terraform.Мой вопрос заключается в том, как terraform узнает, какую задачу нужно выполнить в первую очередь, чтобы ускорить другие задачи зависимости?Нужно ли объявлять его где-нибудь в terraform или он достаточно умен, чтобы работать соответственно?

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Terraform использует ссылки в конфигурации для определения порядка.

Рассмотрим следующий пример:

resource "aws_s3_bucket" "example" {
  bucket = "terraform-dependencies-example"
  acl    = "private"
}

resource "aws_s3_bucket_object" "example" {
  bucket  = aws_s3_bucket.example.bucket # reference to aws_s3_bucket.example
  key     = "example"
  content = "example"
}

В приведенном выше примере ресурс aws_s3_bucket_object.example содержит выражение, которое ссылается на aws_s3_bucket.example.bucket, и поэтому Terraform может сделать вывод, что aws_s3_bucket.example должно быть создано до aws_s3_bucket_object.example.


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

Одна из ситуаций, в которой это может произойти, - это политики AWS IAM, где график, созданный естественным образом по ссылкам, будет иметь следующую форму:

both aws_lambda_function and aws_iam_role_policy depend only on aws_iam_role

Из-за модели данных AWS IAM мы должны сначала создать роль, а затем назначить ей политику в качестве отдельного шага, но объекты, выполняющие эту роль (в данном случае, только лямбда-функция AWS), принимают только ссылка на саму роль, а не на политику. С учетом зависимостей, созданных неявно ссылками, функция Lambda может быть потенциально создана до того, как ее роль получит необходимый доступ, что приведет к ошибкам, если функция попытается предпринять какие-либо действия до назначения политики.

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

resource "aws_iam_role" "example" {
  # ...
}

resource "aws_iam_role_policy" "example" {
  # ...
}

resource "aws_lambda_function" "exmaple" {
  depends_on = [aws_iam_role_policy.example]
}

Now the aws_lambda_function also depends on the aws_iam_role_policy


Для получения дополнительной информации о зависимостях ресурсов в Terraform см. Зависимости ресурсов в документации Terraform.

1 голос
/ 19 июня 2019

Terraform автоматически создаст ресурсы в порядке выполнения всех зависимостей.

Например: если вы определили идентификатор группы безопасности в своем определении DMS как "${aws_security_group.my_sg.id}", Terraform распознает эту зависимость и создаст группу безопасности до ресурса DMS.

0 голосов
/ 20 июня 2019

от: https://learn.hashicorp.com/terraform/getting-started/dependencies.html depen_on - это то, что вы ищете, если это не неявная зависимость.

# New resource for the S3 bucket our application will use.
resource "aws_s3_bucket" "example" {
  # NOTE: S3 bucket names must be unique across _all_ AWS accounts, so
  # this name must be changed before applying this example to avoid naming
  # conflicts.
  bucket = "terraform-getting-started-guide"
  acl    = "private"
}

# Change the aws_instance we declared earlier to now include "depends_on"
resource "aws_instance" "example" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"

  # Tells Terraform that this EC2 instance must be created only after the
  # S3 bucket has been created.
  depends_on = [aws_s3_bucket.example]
}
...