Найкращі практики використання Terraform [закрито]


111

Я зараз переставляю територію на нашу інфраструктуру. Яка найкраща практика для фактичного керування файлами тераформи та стану? Я усвідомлюю, що це інфраструктура як код, і я зроблю свої .tf файли в git, але чи я також виконую tfstate? Чи повинен він мешкати десь як S3? Я хотів би врешті-решт, щоб CI керував усім цим, але це далеко розтягнулося і вимагає від мене розібратися з рухомими фрагментами файлів.

Я дійсно просто дивлюсь, щоб люди, як насправді, використовували подібний матеріал у виробництві

Відповіді:


85

Я також перебуваю в стані міграції існуючої інфраструктури AWS до Terraform, тому я маю на меті оновити відповідь у міру розвитку.

Я в значній мірі покладаюся на офіційні приклади Terraform та багаторазові проби та помилки, щоб виділити ті ділянки, в яких я був невизначений.

.tfstate файли

Конфігурація Terraform може використовуватися для надання безлічі коробок на різній інфраструктурі, кожна з яких може мати різний стан. Оскільки його також можуть управляти кілька людей, такий стан повинен знаходитися в централізованому місці (наприклад, S3), але не git.

Це можна підтвердити, дивлячись на Terraform .gitignore.

Контроль розробника

Наша мета - забезпечити більш високий контроль над інфраструктурою для розробників, зберігаючи повний аудит (журнал git) та можливість перевірки змін (витягнути запити). Зважаючи на це, новий робочий процес по інфраструктурі, на який я прагну, - це:

  1. Базова основа звичайних AMI, що включає модулі для багаторазового використання, наприклад лялькові.
  2. Основна інфраструктура, забезпечена DevOps за допомогою Terraform.
  3. Розробники змінюють конфігурацію Terraform в Git за потребою (кількість примірників; новий VPC; додавання регіону / зони доступності тощо).
  4. Налаштовано конфігурацію Git і подано запит на витяг, який перевіряється здоровим членом команди DevOps.
  5. Якщо це схвалено, зателефонуйте webhook до CI для створення та розгортання (не впевнені, як розділити кілька середовищ на даний момент)

Правка 1 - оновлення поточного стану

З моменту початку цієї відповіді я написав багато TF-коду і відчуваю себе більш комфортно в нашому стані справ. Ми помиляємося помилками та обмеженнями, але я погоджуюсь, що це властивість використання нового програмного забезпечення, що швидко змінюється.

Макет

У нас складна інфраструктура AWS з декількома VPC, кожен з декількома підмережами. Ключовим для легкого управління цим було визначення гнучкої систематики, яка охоплює регіон, довкілля, службу та власника, яку ми можемо використати для організації нашого інфраструктурного коду (як терапевтичного, так і маріонеткового).

Модулі

Наступним кроком було створення єдиного сховища git для зберігання наших модулів терраформи. Наша структура dir верхнього рівня для модулів виглядає так:

tree -L 1 .

Результат:

├── README.md
├── aws-asg
├── aws-ec2
├── aws-elb
├── aws-rds
├── aws-sg
├── aws-vpc
└── templates

Кожен встановлює певні стандартні параметри, але розкриває їх як змінні, які можуть бути замінені нашим "клеєм".

Клей

У нас є друге сховище, в glueякому використовуються згадані вище модулі. Він викладений у відповідності з нашим документом таксономії:

.
├── README.md
├── clientA
   ├── eu-west-1
      └── dev
   └── us-east-1
       └── dev
├── clientB
   ├── eu-west-1
      ├── dev
      ├── ec2-keys.tf
      ├── prod
      └── terraform.tfstate
   ├── iam.tf
   ├── terraform.tfstate
   └── terraform.tfstate.backup
└── clientC
    ├── eu-west-1
       ├── aws.tf
       ├── dev
       ├── iam-roles.tf
       ├── ec2-keys.tf
       ├── prod
       ├── stg
       └── terraform.tfstate
    └── iam.tf

Всередині клієнтського рівня у нас є специфічні .tfфайли облікового запису AWS, які надають глобальні ресурси (наприклад, ролі IAM); наступний рівень регіону з відкритими ключами EC2 SSH; Нарешті -то в нашому середовищі ( dev, stg, і prodт.д.) наш VPC розстановки, створення екземпляра і вдивляючись сполуками і т.д. зберігаються.

Бічна примітка: Як ви бачите, я суперечу своїм власним порадам вище зберігання terraform.tfstateв git. Це тимчасовий захід, поки я не перейду на S3, але мені підходить, оскільки наразі я єдиний розробник.

Наступні кроки

Це все ще ручний процес, але ще не в Дженкінсі, але ми працюємо з досить великою, складною інфраструктурою і поки що дуже хорошою. Як я вже казав, кілька помилок, але йде добре!

Редагувати 2 - Зміни

Минув майже рік, як я написав цю первинну відповідь, і стан і Terraform, і я суттєво змінилися. Зараз я на новій посаді, використовуючи Terraform для управління кластером Azure, і Terraform зараз v0.10.7.

Держава

Люди не раз казали мені, що держава не повинна їхати в Git - і вони вірні. Ми використовували це як проміжний захід з командою з двома особами, яка покладалася на спілкування та дисципліну розробників. Завдяки більшій, розподіленій команді ми зараз повністю використовуємо віддалений стан у S3 із блокуванням, передбаченим DynamoDB. В ідеалі це буде перенесено для консультування, тепер випал v1.0 скоротити перехресні постачальники хмар.

Модулі

Раніше ми створювали та використовували внутрішні модулі. Це все ще має місце, але з появою та зростанням реєстру Terraform ми намагаємось використовувати їх як принаймні основу.

Структура файлу

Нова позиція має набагато простішу систематику лише з двома потоками навколишнього середовища - devі prod. У кожного є свої змінні та результати, використовуючи наші модулі, створені вище. remote_stateПровайдер також допомагає в обміні виходів створених ресурсів між середовищами. Наш сценарій - це субдомени в різних групах ресурсів Azure до глобально керованого TLD.

├── main.tf
├── dev
   ├── main.tf
   ├── output.tf
   └── variables.tf
└── prod
    ├── main.tf
    ├── output.tf
    └── variables.tf

Планування

Знову з додатковими викликами розподіленої команди, ми завжди зберігаємо результат своєї terraform planкоманди. Ми можемо перевірити і знати, що буде виконуватися без ризику деяких змін між planі applyетапом (хоча блокування допомагає в цьому). Не забудьте видалити цей файл плану, оскільки він потенційно може містити "секретні" змінні простого тексту.

Загалом ми дуже задоволені Terraform і продовжуємо вчитися та вдосконалюватись із новими функціями.


Чи були у вас удачі / проблеми після цієї відповіді? Вам здається дуже схожим на те, що я прагну зробити, але ви можете бути далі, ніж я.
Марк Янг

3
Мені цікаво, чому ви вважаєте, що файли tfstate не повинні зберігатися в git? Це просто тому, що стара держава не варто економити, чи є інші проблеми?
agbodike

3
@agbodike - Працюючи окремим розробником або частиною дуже невеликої команди, tfstate можна тримати в руці, якщо він регулярно вчиняється і натискається, щоб уникнути конфліктів. Наступним моїм кроком є ​​встановити це згідно зі своїми документами віддаленого стану в S3 (які також говорять: "це робить роботу з Terraform в команді складною, оскільки вона є частим джерелом конфліктів злиття. Віддалений стан допомагає полегшити ці проблеми".) . Як і в більшості речей, хоча хороша комунікативна комунікація може допомогти полегшити більшість / всі питання, незалежно від тактики, щоб утримувати стан :-)
Ewan

1
@ the0ther - Я боюся, що моє основне сховище є власником, однак я зараз працюю над особистим, який я зробить загальнодоступним найближчим часом.
Еван

2
Будь-яка удача на Git repo @Ewan? Я хотів би побачити, що ти робиш.
Девід

85

Ми активно використовуємо Terraform, і наша рекомендована настройка така:

Макет файлу

Ми настійно рекомендуємо зберігати код Terraform для кожного вашого середовища (наприклад, етап, prod, qa) в окремих наборах шаблонів (і, отже, в окремих .tfstateфайлах). Це важливо, щоб ваші окремі середовища фактично були ізольовані один від одного під час внесення змін. В іншому випадку, хоч возитися з деяким кодом у постановці, занадто легко підірвати щось у програмі. Дивіться Terraform, VPC, і чому ви хочете, щоб файл tfstate за env мав колоритне обговорення того, чому.

Тому наш типовий макет файлу виглядає так:

stage
   main.tf
   vars.tf
   outputs.tf
prod
   main.tf
   vars.tf
   outputs.tf
global
   main.tf
   vars.tf
   outputs.tf

Весь код Terraform для стадії VPC переходить у stageпапку, весь код для prod VPC переходить у prodпапку, а весь код, який живе поза VPC (наприклад, користувачі IAM, теми SNS, відра S3), переходить у globalпапку. .

Зауважте, що, як правило, ми зазвичай розбиваємо код Terraform на 3 файли:

  • vars.tf: Вхідні змінні.
  • outputs.tf: Вихідні змінні.
  • main.tf: Фактичні ресурси.

Модулі

Зазвичай ми визначаємо нашу інфраструктуру у двох папках:

  1. infrastructure-modules: Ця папка містить невеликі модулі з багаторазовим використанням, які можуть бути використані повторно. Подумайте про кожен модуль як креслення, як створити єдину частину інфраструктури, наприклад VPC або базу даних.
  2. infrastructure-live: Ця папка містить фактичну живу, запущену інфраструктуру, яку вона створює, комбінуючи модулі в infrastructure-modules. Подумайте про код у цій папці як про фактичні будинки, які ви побудували з креслення.

Модуль Terraform просто будь-який набір шаблонів терраформіровать в папці. Наприклад, ми могли б мати папку з ім'ям vpcв infrastructure-modulesякий визначає всі таблиці маршрутизації, підмережі, шлюзи, списки контролю доступу і т.д. для одного VPC:

infrastructure-modules
   vpc
     main.tf
     vars.tf
     outputs.tf

Потім ми можемо використовувати цей модуль в infrastructure-live/stageі infrastructure-live/prodдля створення сценічних і випуску VPC. Наприклад, ось що infrastructure-live/stage/main.tfможе виглядати так:

module "stage_vpc" {
  source = "git::git@github.com:gruntwork-io/module-vpc.git//modules/vpc-app?ref=v0.0.4"

  vpc_name         = "stage"
  aws_region       = "us-east-1"
  num_nat_gateways = 3
  cidr_block       = "10.2.0.0/18"
}

Щоб використовувати модуль, ви використовуєте moduleресурс і вказуєте його sourceполе на локальний шлях на вашому жорсткому диску (наприклад source = "../infrastructure-modules/vpc"), або, як у прикладі вище, URL-адресу Git (див. Джерела модуля ). Перевага URL-адреси Git полягає в тому, що ми можемо вказати конкретний git sha1 або tag ( ref=v0.0.4). Тепер ми не лише визначаємо нашу інфраструктуру як купу невеликих модулів, але ми можемо модифікувати ці модулі та ретельно оновити чи відкатати за потребою.

Ми створили ряд пакетів інфраструктури для багаторазового використання, протестованих та задокументованих пакетів для створення VPC, кластерів Docker, баз даних тощо, і під кришкою, більшість з них є просто модифікованими модулями Terraform.

Держава

Коли ви використовуєте Terraform для створення ресурсів (наприклад, екземпляри EC2, бази даних, VPC), він записує інформацію про те, що було створено у .tfstateфайлі. Для внесення змін до цих ресурсів всім членам вашої команди потрібен доступ до цього самого .tfstateфайлу, але НЕ слід перевіряти його в Git (див. Тут для пояснення чому ).

Натомість ми рекомендуємо зберігати .tfstateфайли у S3, включивши віддалений стан Terraform , який автоматично натискатиме / витягує останні файли кожного разу при запуску Terraform. Обов’язково ввімкніть версію у своєму відрі S3, щоб ви могли повернутись до старих .tfstateфайлів, якщо ви якось пошкодили останню версію. Однак важлива примітка: Terraform не забезпечує блокування . Тож якщо два учасники команди terraform applyодночасно працюють в одному .tfstateфайлі, вони можуть перезаписати зміни один одного.

Щоб вирішити цю проблему, ми створили інструмент з відкритим кодом під назвою Terragrunt , який є тонкою обгорткою для Terraform, яка використовує Amazon DynamoDB для забезпечення блокування (який повинен бути повністю безкоштовним для більшості команд). Перевірте Додати автоматичне віддалене блокування стану та конфігурацію для Terraform з Terragrunt для отримання додаткової інформації.

Подальше читання

Ми нещодавно розпочали серію публікацій в блозі під назвою "Всебічний посібник з тераформи", який детально описує всі найкращі практики, які ми навчились використовувати Terraform в реальному світі.

Оновлення: всеосяжний посібник із серії публікацій блогу Terraform став настільки популярним, що ми розширили його до книги під назвою Terraform: Up & Running !


Я думаю, що це правильна відповідь. Використовуйте модулі, версуйте їх та тримайте окремі середовища.
wrangler

Чи потрібно повторно виконувати крок віддаленої конфігурації кожного разу, коли ви хочете працювати над іншим компонентом тераформи / середовищем / модулем / будь-яким іншим випадком, якщо не використовується терагрунт або інша обгортка?
jmreicha

@jmreicha: Вам потрібно запуститись, remote configякщо ви тільки що перевірили свої конфігурації Terraform або якщо ви хочете змінити попередню віддалену конфігурацію. Terraform 0.9 введе концепцію backends, яка багато чого спростить. Дивіться цей PR для отримання детальної інформації.
Євгеній Брікман

Просто для того, щоб я зрозумів - я працюю над "сценою" середовища, але потім починаю працювати над "продуктом". Мені потрібно буде повторити remote configкоманду, щоб вказати на стан prod. Якщо припустити різні стани для середовища. Це так? Я з нетерпінням чекаю v0.9.
jmreicha

Якщо ви збиралися розгорнути такий самий набір .tfфайлів у двох різних середовищах, так, вам потрібно запускати remote configкожного разу при переключенні. Це, очевидно, дуже схильне до помилок, тому я не рекомендую реально використовувати цю техніку. Натомість перегляньте рекомендований макет файлів Terraform у цій публікації блогу разом із способами використання модулів Terraform у цій публікації блогу .
Євген Брікман

9

Раніше remote configце було дозволено, але тепер його замінили " мішечками ", тому дистанційний терраформ більше не доступний.

terraform remote config -backend-config="bucket=<s3_bucket_to_store_tfstate>" -backend-config="key=terraform.tfstate" -backend=s3
terraform remote pull
terraform apply
terraform remote push

Докладніше див. У документах .


Чи потрібно віддалене джерело переналаштовувати кожен раз, коли ви хочете працювати над іншим компонентом тераформи / середовищем / модулем / будь-яким іншим?
jmreicha

6

Більш глибоко висвітлював @ Євген Брікман, але конкретно відповідаючи на питання ОП:

Яка найкраща практика для фактичного керування файлами тераформи та стану?

Використовуйте git для TF-файлів. Але не перевіряйте файли State у (тобто tfstate). Замість цього використовуйте Terragruntдля синхронізації / блокування файлів стану до S3.

але чи я також вчиняю tfstate?

Немає.

Чи повинен він мешкати десь як S3?

Так


2

Я знаю, що тут багато відповідей, але мій підхід зовсім інший.

   Modules
   Environment management 
   Separation of duties

Модулі

  1. Створюйте модулі для логічних наборів ресурсів. Приклад: Якщо ваша мета - розгортання API, для якого потрібні DB, HA VM, автоматичне масштабування, DNS, PubSub та сховище об'єктів, то всі ці ресурси повинні бути шаблоновані в одному модулі.
  2. Уникайте створення модулів, які використовують один ресурс. Це можна і було зроблено, і багато модулів у реєстрі роблять це, але це практика, яка допомагає з доступністю ресурсів, а не з організацією інфраструктури. Приклад: Модуль для AWS EC2 допомагає користувачеві отримати доступ до EC2, роблячи складніші конфігурації більш простими для виклику, але модуль на зразок прикладу в 1. допомагає користувачеві при оркеструванні інфраструктури, керованої додатками, компонентами або послугами.
    1. Уникайте декларацій ресурсів у своїй робочій області. Це більше про те, щоб ваш код був охайним та організованим. Оскільки модулі легко спрощені, ви більше контролюєте свої версії.

Управління довкіллям

IaC зробив процес SDLC важливим для управління інфраструктурою, і не нормально розраховувати на розвиток інфраструктури розвитку, а також середовищ додатків для розробки.

  1. Не використовуйте папки для керування своїми середовищами IaC. Це призводить до дрейфу, оскільки немає загального шаблону для вашої інфраструктури.
  2. Використовуйте єдину робочу область та змінні для керування специфікаціями середовища. Приклад: Запишіть свої модулі так, що при зміні змінної середовища (var.stage популярна) план змінюється відповідно до ваших вимог. Зазвичай середовища повинні змінюватись якомога менше, оскільки кількість, експозиція та ємність зазвичай є змінними конфігураціями. Dev може розгорнути 1 ВМ з 1 ядром і 1 ГБ ОЗУ в приватній топології, але виробництво може бути 3 ВМ з 2 ядрами і 4 ГБ ОЗУ з додатковою загальнодоступною топологією. Звичайно, ви можете мати більше варіантів: dev може запускати процес баз даних на тому ж сервері, що і додаток, щоб заощадити витрати, але виробництво може мати виділений екземпляр DB. Всім цим можна керувати, змінивши єдину змінну, потрійні заяви та інтерполяцію.

Розмежування обов'язків

Якщо ви є невеликою організацією або працюєте з особистою інфраструктурою, це насправді не застосовується, але це допоможе вам керувати своїми операціями.

  1. Розбийте свою інфраструктуру за обов'язками, відповідальністю чи командами. Приклад: Центральний ІТ-контроль, що лежить в основі спільних служб (віртуальні мережі, підмережі, загальнодоступні IP-адреси, групи журналів, ресурси управління, багатонадійні БД, спільні ключі тощо), в той час як команда API контролює лише ресурси, необхідні для їх обслуговування (віртуальних машин, LB) , PubSub тощо) та користуються центральними послугами ІТ за допомогою джерел даних та віддалених пошуків стану.
    1. Доступ урядової команди. Приклад: Центральний ІТ може мати права адміністратора, але команда API має доступ лише до обмеженого набору відкритих хмарних API.

Це також допомагає вирішити проблеми з випуском, оскільки ви знайдете, що деякі ресурси рідко змінюються, а інші змінюються весь час. Поділ знімає ризик та складність.

Ця стратегія проводить паралелі зі стратегією багаторазового обліку AWS. Прочитайте для отримання додаткової інформації.

CI / CD

Це своя тема, але Terraform дуже добре працює в хорошому трубопроводі. Найпоширенішою помилкою тут є трактування КІ як срібної кулі. Технічно Terraform має забезпечувати інфраструктуру лише на етапах монтажного трубопроводу. Це буде окремо від того, що відбувається на етапах CI, коли типово перевіряє і тестує шаблони.

Примітка: Написано на мобільному телефоні, тому вибачте про помилки.


0

Перш ніж відповіді були дуже твердими та інформативними, я спробую додати сюди свої 2 центи

Загальні рекомендації щодо структуризації коду

  1. Простіше і швидше працювати з меншою кількістю ресурсів:

    • Cmds terraform planі terraformзастосувати обидва роблять хмарні дзвінки API, щоб перевірити стан ресурсів.
    • Якщо у вас є вся інфраструктура в одній композиції, це може зайняти багато хвилин (навіть якщо ви маєте кілька файлів в одній папці).
  2. Радіус вибуху менший із меншими ресурсами:

    • Ізоляція непов'язаних ресурсів один від одного, розміщення їх в окремих складах (папках) знижує ризик, якщо щось піде не так.
  3. Почніть свій проект, використовуючи віддалений стан:

    • Ваш ноутбук не є місцем джерела правди для вашої інфраструктури.
    • Управління tfstateфайлом в git - це кошмар.
    • Пізніше, коли інфраструктурні шари починають зростати в будь-якому напрямку (кількість залежностей або ресурсів).
    • приклад модуля: https://github.com/cloudposse/terraform-aws-tfstate-backend
    • посібник ref: https://github.com/camptocamp/terraboard
  4. Спробуйте практикувати послідовну структуру та назву конвенції:

    • Як і процедурний код, код Terraform повинен бути написаний для того, щоб люди прочитали його спочатку, послідовність допоможе, коли зміни відбудуться через півроку.
    • Можна переміщувати ресурси у файлі стану Terraform, але це може бути складніше, якщо у вас є непослідовна структура та імена.
  5. Зберігайте модулі ресурсів максимально просто.

  6. Не варто жорсткого коду, які можна передавати як змінні або виявити за допомогою джерел даних.

  7. Використовуйте dataджерела та terraform_remote_stateконкретно як клей між інфраструктурними модулями всередині композиції.

( ref article: https://www.terraform-best-practices.com/code-structure )


Приклад:

Простіше і швидше працювати з меншою кількістю ресурсів, тому нижче ми представляємо рекомендований макет коду.

ПРИМІТКА. Так само, як посилання не слід чітко дотримуватися, оскільки кожен проект має свої специфічні характеристики

.
├── 1_tf-backend #remote AWS S3 + Dynamo Lock tfstate 
   ├── main.tf
   ├── ...
├── 2_secrets
   ├── main.tf
   ├── ...
├── 3_identities
   ├── account.tf
   ├── roles.tf
   ├── group.tf
   ├── users.tf
   ├── ...
├── 4_security
   ├── awscloudtrail.tf
   ├── awsconfig.tf
   ├── awsinspector.tf
   ├── awsguarduty.tf
   ├── awswaf.tf
   └── ...
├── 5_network
   ├── account.tf
   ├── dns_remote_zone_auth.tf
   ├── dns.tf
   ├── network.tf
   ├── network_vpc_peering_dev.tf
   ├── ...
├── 6_notifications
   ├── ...
├── 7_containers
   ├── account.tf
   ├── container_registry.tf
   ├── ...
├── config
   ├── backend.config
   └── main.config
└── readme.md

0

Я вважаю, що небагато найкращих практик потрібно дотримуватися при використанні тераформи для оркестрування інфраструктури

  1. Не пишіть знову той самий код (повторне використання)
  2. Зберігайте окрему конфігурацію середовища, щоб легко її підтримувати.
  3. Використовуйте віддалений бекенд s3 (зашифрований) та динамо-БД для обробки блокування одночасності
  4. Створіть модуль і використовуйте цей модуль в основній інфраструктурі кілька разів, це як функція багаторазового використання, яку можна викликати багаторазово, передаючи різні параметри.

Обробляйте декілька середовищ

Більшість рекомендованих час - це використання робочої області тераформи для обробки декількох середовищ, але я вважаю, що використання робочої області може змінюватися залежно від способу роботи в організації. Інше зберігає код Terraform для кожного з ваших середовищ (наприклад, етап, prod, QA) для розділення станів середовища. Однак у цьому випадку ми просто копіюємо той самий код у багатьох місцях.

├── main.tf
├── dev
   ├── main.tf
   ├── output.tf
   └── variables.tf
└── prod
├── main.tf
├── output.tf
└── variables.tf

Я дотримувався певного підходу до обробки та уникав дублювання одного і того ж коду тераформи, зберігаючи кожну папку середовища, оскільки я вважаю, що більшість часу все середовище буде на 90% однаковим.

├── deployment
 ├── 01-network.tf
 ├── 02-ecs_cluster.tf
 ├── 03-ecs_service.tf
 ├── 04-eks_infra.tf
 ├── 05-db_infra.tf
 ├── 06-codebuild-k8s.tf
 ├── 07-aws-secret.tf
 ├── backend.tf
 ├── provider.tf
 └── variables.tf
├── env
 ├── dev
  ├── dev.backend.tfvar
  └── dev.variables.tfvar
 └── prod
 ├── prod.backend.tfvar
 └── prod.variables.tfvar
├── modules
 └── aws
 ├── compute
  ├── alb_loadbalancer
  ├── alb_target_grp
  ├── ecs_cluster
  ├── ecs_service
  └── launch_configuration
 ├── database
  ├── db_main
  ├── db_option_group
  ├── db_parameter_group
  └── db_subnet_group
 ├── developertools
 ├── network
  ├── internet_gateway
  ├── nat_gateway
  ├── route_table
  ├── security_group
  ├── subnet
  ├── vpc
 └── security
 ├── iam_role
 └── secret-manager
└── templates

Конфігурація, що стосується середовищ

Зберігайте окремі конфігурацію та параметри, що стосуються оточення, у файлі змінної та передайте це значення для налаштування інфраструктури. наприклад, як показано нижче

  • dev.backend.tfvar

      region = "ap-southeast-2"
      bucket = "dev-samplebackendterraform"
      key = "dev/state.tfstate"
      dynamo_db_lock = "dev-terraform-state-lock"
  • dev.variable.tfvar

    environment                     =   "dev"
    vpc_name                        =   "demo"
    vpc_cidr_block                  =   "10.20.0.0/19"
    private_subnet_1a_cidr_block    =   "10.20.0.0/21"
    private_subnet_1b_cidr_block    =   "10.20.8.0/21"
    public_subnet_1a_cidr_block     =   "10.20.16.0/21"
    public_subnet_1b_cidr_block     =   "10.20.24.0/21"

Умовний пропуск інфраструктурної частини

Створіть конфігурацію у специфічному файлі змінної env і на основі цієї змінної вирішіть створити або пропустити цю частину. Таким чином, виходячи з потреби, конкретну частину інфраструктури можна пропустити.

variable vpc_create {
   default = "true"
}

module "vpc" {
  source = "../modules/aws/network/vpc"
  enable = "${var.vpc_create}"
  vpc_cidr_block = "${var.vpc_cidr_block}"
  name = "${var.vpc_name}"
 }

 resource "aws_vpc" "vpc" {
    count                = "${var.enable == "true" ? 1 : 0}"
    cidr_block           = "${var.vpc_cidr_block}"
    enable_dns_support   = "true"
   enable_dns_hostnames = "true"
}

внизу потрібна команда для ініціалізації та виконання інфрачервоних змін для кожного середовища, CD у потрібну папку середовища.

  terraform init -var-file=dev.variables.tfvar -backend-config=dev.backend.tfvar ../../deployment/

  terraform apply -var-file=dev.variables.tfvar ../../deployment

Довідково: https://github.com/mattyait/devops_terraform


0

Мені не подобається ідея папок, тому що це призведе до різних джерел у середовищі, і це має тенденцію до дрейфу.

Кращий підхід - мати єдиний стек для всіх середовищ (скажімо, dev, prepredd та prod). Працювати над використанням одного середовища terraform workspace.

terraform workspace new dev

Це створює нову робочу область. Це включає в себе виділений файл стану та змінну, terraform.workspaceяку ви можете використовувати у своєму коді.

resource "aws_s3_bucket" "bucket" {
  bucket = "my-tf-test-bucket-${terraform.workspace}"
}

Таким чином ви отримаєте відра, що називається

  • my-tf-test-bucket-dev
  • my-tf-test-bucket-препрод
  • my-tf-test-bucket-prod

після застосування до робочих просторів вище (використовувати terraform workspace select <WORKSPACE>для зміни середовища). Щоб зробити код захищеним від багатьох регіонів, зробіть це так:

data "aws_region" "current" {}

resource "aws_s3_bucket" "bucket" {
  bucket = "my-tf-test-bucket-${data.aws_region.current.name}-${terraform.workspace}"
}

дістатись (для регіону «Схід-1»)

  • my-tf-test-bucket-us-east-1-dev
  • my-tf-test-bucket-us-east-1-prepredd
  • my-tf-test-bucket-us-east-1-prod

0

Деякі найкращі практики Terraform, яких слід дотримуватися:

  1. Уникайте жорсткого кодування: Іноді розробники вручну створювали ресурси безпосередньо. Вам потрібно позначити ці ресурси та використовувати імпорт тераформи, щоб включити їх у коди. Зразок:

    account_number = "123456789012" account_alias = "моя компанія"

  2. Запустіть Terraform з докерного контейнера: Terraform випускає офіційний контейнер Docker, який дозволяє легко керувати, яку версію можна запустити.

Рекомендується запустити контейнер Terraform Docker, коли ви встановлюєте завдання збірки в конвеєрі CI / CD.

TERRAFORM_IMAGE=hashicorp/terraform:0.11.7
TERRAFORM_CMD="docker run -ti --rm -w /app -v ${HOME}/.aws:/root/.aws -v ${HOME}/.ssh:/root/.ssh -v `pwd`:/app $TERRAFORM_IMAGE"

Детальніше, будь ласка, зверніться до мого блогу: https://medium.com/tech-darwinbox/how-darwinbox-manages-infrastructure-at-scale-with-terraform-371e2c5f04d3


0

Я хотів би внести свій внесок у цю тему.

  • Швидше за все, це буде AWS S3 + DynamoDB, якщо ви не використовуєте Terraform Cloud.
  • Окрема інфраструктура (мережа + RBAC) виробництва та непродовольчих засобів.
  • Плануйте відключити доступ до файлів стану (доступ до мережі та RBAC) поза межами визначеної мережі (наприклад, пул агента розгортання).
  • Не підтримуйте інфраструктуру резервного середовища Terraform у середовищі виконання. Використовуйте окремий рахунок.
  • Увімкніть версію об’єктів у своїх програмах Terraform, щоб уникнути втрат змін та файлів станів, а також зберегти історію стану Terraform.

У деяких спеціальних випадках буде потрібно ручний доступ до файлів стану Terraform. Такі речі, як рефакторинг, порушення змін або виправлення дефектів потребують виконання операцій стану Terraform оперативним персоналом. Для таких випадків плануйте надзвичайний контрольований доступ до стану Terraform, використовуючи хост бастіону, VPN тощо.

Перегляньте більш довгий блог найкращих практик, який детально висвітлює це питання, включаючи вказівки щодо конвеєрів CI / CD


-1

Якщо ви все ще шукаєте кращого рішення, погляньте на робочі простори, які можуть замінити підтримання різних структур папок середовища, можуть мати певні змінні робочої області.

Як Євген Брікман згадав , що краще мати структуру модулів.


-1

Використовуйте хмару тераформи для управління та збереження станів разом із порадами вище.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.