Читаем Terraform: инфраструктура на уровне кода полностью

Особенно полезным типом выражений является ссылка, которая позволяет обращаться к значениям с других участков кода. Чтобы указать ID группы безопасности, нужно сослаться на атрибут ресурса с помощью такого синтаксиса:

_..

PROVIDER — это имя провайдера (например, aws), TYPE — это тип ресурса (вроде security_group), NAME — имя этого ресурса (в нашем случае группа безопасности называется "instance"), а ATTRIBUTE — это либо один из аргументов ресурса (скажем, name), либо один из атрибутов, которые он экспортировал (список доступных атрибутов можно найти в документации каждого ресурса). Группа безопасности экспортирует атрибут под названием id, поэтому к нему можно обратиться с помощью такого выражения:

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 определяет наиболее эффективный способ реализации.

Рис. 2.7. Граф зависимостей для сервера EC2 и его группы безопасности

Выполнив команду apply, вы увидите, что Terraform хочет создать группу безопасности и заменить имеющийся сервер EC2 другим — с новыми пользовательскими данными:

$ terraform apply

(...)

Terraform will perform the following actions:

  # aws_instance.example must be replaced

-/+ resource "aws_instance" "example" {

        ami                          = "ami-0c55b159cbfafe1f0"

      ~ availability_zone            = "us-east-2c" -> (known after apply)

      ~ instance_state               = "running" -> (known after apply)

        instance_type                = "t2.micro"

        (...)

      + user_data                    = "c765373..." # forces replacement

      ~ volume_tags                  = {} -> (known after apply)

      ~ vpc_security_group_ids       = [

          - "sg-871fa9ec",

        ] -> (known after apply)

        (...)

  }

# aws_security_group.instance will be created

+ resource "aws_security_group" "instance" {

    + arn                    = (known after apply)

    + description            = "Managed by Terraform"

    + egress                 = (known after apply)

    + id                     = (known after apply)

    + ingress                = [

        + {

            + cidr_blocks      = [

                + "0.0.0.0/0",

              ]

            + description      = ""

            + from_port        = 8080

            + ipv6_cidr_blocks = []

            + prefix_list_ids  = []

            + protocol         = "tcp"

            + security_groups  = []

            + self             = false

            + to_port          = 8080

          },

        ]

      + name                   = "terraform-example-instance"

      + owner_id               = (known after apply)

      + revoke_rules_on_delete = false

      + vpc_id                 = (known after apply)

    }

Plan: 2 to add, 0 to change, 1 to destroy.

Do you want to perform these actions?

  Terraform will perform the actions described above.

  Only 'yes' will be accepted to approve.

Enter a value:

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги