Terraform: инфраструктура на уровне кода | страница 47



aws_security_group.instance.id

Вы можете использовать идентификатор этой группы безопасности в аргументе vpc_security_group_ids ресурса aws_instance:

resource "aws_instance" "example" {

  ami                    = "ami-0c55b159cbfafe1f0"

  instance_type          = "t2.micro"

  vpc_security_group_ids = [aws_security_group.instance.id]

  user_data = <<-EOF

              #!/bin/bash

              echo "Hello, World" > index.html

              nohup busybox httpd -f -p 8080 &

              EOF

  tags = {

    Name = "terraform-example"

  }

}

Ссылаясь в одном ресурсе на другой, вы создаете неявную зависимость. Terraform анализирует такие зависимости, строит из них граф и применяет его для автоматического определения порядка, в котором должны создаваться ресурсы. ­Например, если бы этот код развертывался с нуля, система Terraform знала бы о том, что группу безопасности нужно создать раньше, чем сервер EC2, поскольку последний использует ID этой группы. Вы можете даже вывести граф зависимостей с помощью команды graph:

$ terraform graph

digraph {

        compound = "true"

        newrank = "true"

        subgraph "root" {

                "[root] aws_instance.example"

                  [label = "aws_instance.example", shape = "box"]

                "[root] aws_security_group.instance"

                  [label = "aws_security_group.instance", shape = "box"]

                "[root] provider.aws"

                  [label = "provider.aws", shape = "diamond"]

                "[root] aws_instance.example" ->

                  "[root] aws_security_group.instance"

                "[root] aws_security_group.instance" ->

                  "[root] provider.aws"

                "[root] meta.count-boundary (EachMode fixup)" ->

                  "[root] aws_instance.example"

                "[root] provider.aws (close)" ->

                  "[root] aws_instance.example"

                "[root] root" ->

                  "[root] meta.count-boundary (EachMode fixup)"

                "[root] root" ->

                  "[root] provider.aws (close)"

        }

}

Вывод выполнен на языке описания графов под названием DOT. Сам граф можно отобразить, как это сделано на рис. 2.7, с использованием настольного приложенияGraphviz или его веб-версии GraphvizOnline (bit.ly/2mPbxmg).

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