Как лучше всего использовать созданные ресурсы в Terraform? - PullRequest
0 голосов
/ 03 июня 2019

Я начну новый проект Terraform на AWS. VPC уже создан, и я хочу знать, как лучше интегрировать его в мой код. Должен ли я создать его снова, и Terraform обнаружит его и не переопределит? Или я должен использовать источник данных для этого? Или есть другой лучший способ, как Terraform Import?

Я также хочу иметь возможность в будущем развернуть всю инфраструктуру в другом регионе или другой учетной записи.

Спасибо.

Ответы [ 2 ]

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

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


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

resource "aws_vpc" "example" {
  # fill in here all the same settings that the existing object already has

  cidr_block = "10.0.0.0/16"
}

# Can then use that vpc's id in other resources using:
#    aws_vpc.example.id

Но вместо немедленного запуска terraform apply вы можете сначала запустить terraform import, чтобы указать Terraform связать этот блок ресурсов с существующим VPC, используя его идентификатор, назначенный AWS:

terraform import aws_vpc.example vpc-abcd1234

Если вы затем запустите terraform plan, вы увидите, что никаких изменений не требуется, поскольку Terraform обнаружил, что конфигурация соответствует существующему объекту.Если Terraform действительно предлагает некоторые изменения, вы можете либо принять их, запустив terraform apply, либо продолжить обновлять конфигурацию, пока она не будет соответствовать существующему объекту.

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


Если вы предпочитаете сохранить то, что управляет существующая системаVPC, вы также можете использовать функцию Источники данных , чтобы найти существующий VPC, не назначая его Terraform.

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

data "aws_vpc" "example" {
  tags = {
    Name = "example-VPC-name"
  }
}

# Can then use that vpc's id in other resources using:
#    data.aws_vpc.example.id

В некоторых случаях пользователи вводят дополнительныеперенаправление для поиска VPC каким-либо иным способом, кроме непосредственного обращения к API-интерфейсам AWS VPC.Это более сложная конфигурация, и параметры здесь довольно широки, но, например, если вы используете хранилище параметров SSM, вы можете поместить VPC в параметр хранилища параметров и извлечь его, используя источник данных aws_ssm_parameter .

Если существующей системой, управляющей VPC, является CloudFormation, вы также можете использовать aws_cloudformation_export или aws_cloudformation_stack для получения информации из API CloudFormation.

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

Если вы счастливы управлять им с помощью terraform, двигаясь вперед, вы можете импортировать существующие ресурсы в ваше состояние terraform. Вот страница использования для этого https://www.terraform.io/docs/import/usage.html

Сначала вам нужно определить блок ресурсов внутри вашей конфигурации для vpc. Вы можете сделать что-то вроде:

resource "aws_vpc" "existing" {
  cidr_block       = "172.16.0.0/16"

  tags = {
    Name = "prod"
  }
}

, а затем в кли запустить команду

terraform import aws_vpc.existing <vpc-id>

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

Как вы и предлагали, вы можете использовать источник данных для vpc. Это может быть полезно, если вы хотите управлять им вне terraform, вместо того, чтобы иметь возможность уничтожить vpc, если он запущен неопытным пользователем.

Некоторые клиенты, с которыми я работал, предпочитают управлять ресурсами, такими как vpcs / subnets (и другая базовая инфраструктура), в отдельных сценариях terraform, к которым имеют доступ только старшие инженеры. Это может избежать сценариев бедствий, когда люди случайно разрушают основную инфраструктуру.

Я лично предпочитаю управлять всем моим кодом terraform в репозитории git, который затем развертывается с использованием инструмента CI / CD, даже если над ним работает только я. Некоторые люди, возможно, не видят смысла в том, чтобы тратить время на создание конвейера, и могут придерживаться его локального запуска.

В этом посте содержатся отличные рекомендации по запуску terraform в автоматизированной среде https://learn.hashicorp.com/terraform/development/running-terraform-in-automation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...