Как развернуть определенный файл tf (Terraform)

У меня есть 3 файла .tf в корневом каталоге terraform:

  • vpc.tf
  • подсети.tf
  • instances.tf
  • Вместе с каталогом .terraform после запуска terraform init

Я хотел бы развернуть только vpc.tf, работающий примерно так:

terraform apply vpc.tf #here, vpc.tf is a terraform file

Но это не работает (я получаю ошибку Go: «zip: недопустимый zip-файл»). Если я просто побегу

terraform apply

он попытается применить все конфигурации во всех трех файлах terraform (vpc.tf, subnets.tf и instances.tf), чего я не хочу. Кажется, что способ заставить это работать - это создать совершенно другую папку и запустить что-то вроде

terraform apply vpc/ #here, vpc/ is a folder that containers vpc.tf file

который работает. Проблема с этим подходом заключается в том, что если у меня есть 2 или более файла terraform в папке vpc/, я снова возвращаюсь к первой проблеме. Кажется, решение для этого состоит в том, чтобы иметь определенный ресурс в определенной папке, но это не кажется чистым, поскольку я могу предвидеть, что, если инфраструктура будет расти, у меня будет несколько папок, содержащих несколько файлов terraform. Итак, вопрос:

Есть ли способ «применить терраформирование» определенного файла терраформирования и игнорировать все остальные в папке? Я упускаю что-то основное в терраформе?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
0
6 030
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Другой вариант, который не решает именно ваши потребности, но выполним, — это таргетинг на ресурсы с использованием аргумента -target, например:

terraform plan -target digitalocean_loadbalancer.public -out run.plan

https://www.terraform.io/docs/commands/plan.html#resource-targeting

голосование против, потому что это не ответ на вопрос, и сам терраформ не рекомендует его использовать.

Simon Ernesto Cardenas Zarate 27.06.2019 20:31
Ответ принят как подходящий

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

Это прямо упоминается в Документация Terraform для -target:

This targeting capability is provided for exceptional circumstances, such as recovering from mistakes or working around Terraform limitations. It is not recommended to use -target for routine operations, since this can lead to undetected configuration drift and confusion about how the true state of resources relates to configuration.

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

Если вы не хотите, чтобы две вещи менялись одновременно (например, настройка VPC, а также настройка приложения, которое находится в этом VPC, или настройка тестовой и рабочей версий приложения), то они должны находиться в разных каталогах. и использовать разные файлы состояния.

Это обеспечивает хорошее разделение вещей, сводя к минимуму радиус взрыва, но при этом упрощает применение фрагментов вещей, которые связаны одновременно.

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

причина, по которой я хочу разделить VPC и подсети, заключается в том, что в настоящее время у нас уже есть 1 vpc и множество микросервисов, находящихся в одном и том же vpc. Это упрощает настройку внутренней сети. Если бы мне нужно было настроить vpc для каждого микросервиса, мне также пришлось бы настроить пиринг vpc, если мне нужна внутренняя сеть. Я заметил, что у большинства людей просто есть все в одном большом файле terraform (vpc, подсети, секгруппы, маршрутизация, lb и автомасштабирование). Хотя я обнаружил, что этот подход достаточно хорош для репликации инфраструктуры, он не позволяет повторно использовать более мелкие компоненты.

Simon Ernesto Cardenas Zarate 27.06.2019 20:38

Зачем вам нужны отдельные подсети для каждого микросервиса? Честно говоря, если вы хотите такого разделения сети, то вам почти наверняка лучше использовать большой старый сетевой разделитель VPC и одноранговых узлов, если это необходимо. Лично я не считаю это полезным и, как правило, использую 1 VPC на регион для каждой учетной записи AWS. Если что-то требует большего разделения, они также получают отдельную учетную запись AWS (например, тестовая/производственная или разные команды, имеющие полное право собственности).

ydaetskcoR 27.06.2019 21:17

ydaetskcoR, Подсети — это сетевая концепция, предназначенная для целей а) разделения сети на более мелкие диапазоны IP-адресов и б) изоляции трафика с помощью маршрутизации. Имеет смысл использовать подсети, если вы ищете брандмауэр между группами машин, если в их существующей сети есть свободные адреса. Мне любопытно, по каким причинам вы предлагаете вместо этого создать VPC?

Evan Byrne 30.12.2020 21:32

@ЭванБ. Я знаю о подсетях, но вы обычно не используете подсети для изоляции сетевых ресурсов, кроме как на общедоступном/частном уровне для AWS. Вместо этого вы используете группы безопасности в качестве брандмауэров с отслеживанием состояния, а не NACL без отслеживания состояния, которые позволяют контролировать трафик между подсетями и управлять трафиком таким образом намного сложнее. Группы безопасности всегда должны быть вашим предпочтительным способом управления сетевым трафиком внутри VPC.

ydaetskcoR 02.01.2021 18:44

ydaetskcoR, списки контроля доступа к сети могут быть размещены в подсетях, которые поддерживают все функции, предоставляемые группами безопасности, а также поддерживают использование смешанной логики «разрешить/запретить». Какие сетевые ACL вы считаете «болезненными»? В наши дни интерфейс практически идентичен панели инструментов AWS.

Evan Byrne 03.01.2021 07:12

NACL могут быть проблемой, потому что вы не можете делать особенно мелкие вещи (например, от группы безопасности к группе безопасности) и не имеете состояния, поэтому вам необходимо разрешить эфемерный обратный трафик порта, который потенциально позволяет трафику с большим числом портов также пересекать NACL (например, службы ECS на основе моста с динамическими номерами портов используют номера портов от 32768 до 61000). Группы безопасности являются строго лучшим подходом, и NACL обычно рекомендуются только в том случае, если они требуются для какой-либо меры контроля, которая не поддается изменению (например, нормативная).

ydaetskcoR 04.01.2021 10:14

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

ydaetskcoR 04.01.2021 10:28

Нет, к сожалению, Терраформ не имеет возможности применять определенный файл .tf. Терраформ применяет все файлы .tf в том же каталоге.

Но вы можете применить конкретный код с закомментируйте и раскомментировать. Например, у вас есть 2 файла .tf "1ст.тф" и "2й.тф" в одном каталоге для создания ресурсов для GCP (облачная платформа Google):

Затем "1ст.тф" имеет следующий код:

provider "google" {
  credentials = file("myCredentials.json")
  project     = "myproject-113738"
  region      = "asia-northeast1"
}

resource "google_project_service" "project" {
  service = "iam.googleapis.com"
  disable_dependent_services = true
}

И "2й.тф" имеет этот код ниже:

resource "google_service_account" "service_account_1" {
  display_name = "Service Account 1"
  account_id   = "service-account-1"
}

resource "google_service_account" "service_account_2" {
  display_name = "Service Account 2"
  account_id   = "service-account-2"
}

Теперь, во-первых, вы хотите применить только код в "1ст.тф", поэтому вам нужно закомментируйте код в "2й.тф":

1ст.тф:

provider "google" {
  credentials = file("myCredentials.json")
  project     = "myproject-113738"
  region      = "asia-northeast1"
}

resource "google_project_service" "project" {
  service = "iam.googleapis.com"
  disable_dependent_services = true
}

2nd.tf (Комментарий отсутствует):

# resource "google_service_account" "service_account_1" {
#   display_name = "Service Account 1"
#   account_id   = "service-account-1"
# }

# resource "google_service_account" "service_account_2" {
#   display_name = "Service Account 2"
#   account_id   = "service-account-2"
# }

Затем вы подаете заявку:

terraform apply -auto-approve

Далее, дополнительно вы хотите применить код в "2й.тф", поэтому вам нужно раскомментировать код в "2й.тф":

1ст.тф:

provider "google" {
  credentials = file("myCredentials.json")
  project     = "myproject-113738"
  region      = "asia-northeast1"
}

resource "google_project_service" "project" {
  service = "iam.googleapis.com"
  disable_dependent_services = true
}

2nd.tf (Раскомментировать):

resource "google_service_account" "service_account_1" {
  display_name = "Service Account 1"
  account_id   = "service-account-1"
}

resource "google_service_account" "service_account_2" {
  display_name = "Service Account 2"
  account_id   = "service-account-2"
}

Затем вы подаете заявку:

terraform apply -auto-approve

Таким образом, вы можете применить конкретный код с закомментируйте и раскомментировать.

Другие вопросы по теме