Ключавыя паняцці
Афіцыйная дакументацыя Terraform падрабязна апісвае ўсе аспекты канфігурацыі ў дэталях. Уважліва прачытайце яе, каб зразумець астатнюю частку гэтага раздзела.
У гэтым раздзеле апісваюцца ключавыя паняцці, якія выкарыстоўваюцца ў кнізе.
Рэсурс
Рэсурсам ёсць aws_vpc, aws_db_instance, і г.д. Рэсурс належыць правайдэру, прымае аргументы, вяртае атрыбуты і мае жыццёвы цыкл. Рэсурс можна быць створаны, атрыманы, абноўлены і выдалены.
Рэсурсны модуль
Рэсурсны модуль ёсць зборам звязаных рэсурсаў, якія сумесна выконваюць агульную задачу (напрыклад, AWS VPC Terraform module стварае VPC, падсеткі, NAT шлюз і г.д.). Ён залежыць ад канфігурацыі правайдэра, якую можна вызначыць у ім самім або ў структурах вышэйшага ўзроўню (напрыклад, у модулі інфраструктуры).
Інфраструктурны модуль
Інфраструктурны модуль ёсць зборам модуляў рэсурсаў, якія могуць быць лагічна не звязаны, але ў бягучай сітуацыі/праэкце/канфігурацыі служаць адной мэце. Ён вызначае канфігурацыю правайдэраў, якая перадаецца далейшым модулям рэсурсаў і самім рэсурсам. Звычайна ён абмежаваны працай у адной сутнасці на кожны лагічны разьдзяляльнік (напрыклад, рэгіён AWS, праект Google).
Напрыклад, terraform-aws-atlantis модуль выкарыстоўвае модулі рэсурсаў, такія як terraform-aws-vpc і terraform-aws-security-group для кіравання інфраструктурай, неабходнай для запуску Atlantis на AWS Fargate.
Іншы прыклад — модуль terraform-aws-cloudquery , дзе некалькі модуляў ад terraform-aws-modules выкарыстоўваюцца разам для кіравання інфраструктурай, а таксама для выкарыстання рэсурсаў Docker для стварэння, адпраўкі і разгортвання вобразаў Docker. Усё ў адным наборы.
Кампазіцыя
Кампазіцыя ёсць зборам інфраструктурных модуляў, якія могуць ахопліваць некалькі лагічна асобных абласцей (напрыклад, рэгіёны AWS, некалькі ўліковых запісаў AWS). Кампазіцыя выкарыстоўваецца для апісання поўнай інфраструктуры, неабходнай для ўсёй арганізацыі або праекта.
Кампазіцыя складаецца з інфраструктурных модуляў, якія, у сваю чаргу, складаюцца з модуляў рэсурсаў, што рэалізуюць асобныя рэсурсы.

Крыніца дадзеных
Крыніца дадзеных выконвае read-only аперацыю і залежыць ад канфігурацыі правайдэра, яна выкарыстоўваецца ў модулі рэсурсаў і модулі інфраструктуры.
Крыніца дадзеных terraform_remote_state выступае ў якасці клею для модуляў вышэйшага ўзроўню і кампазіцый.
Вонкавая крыніца дадзеных дазваляе вонкавай праграме выступаць у якасці крыніцы дадзеных, прадастаўляючы адвольныя дадзеныя для выкарыстання ў іншых частках канфігурацыі Terraform. Вось прыклад з модуля terraform-aws-lambda дзе імя файла разлічваецца шляхам выкліку знешняга скрыпта на Python.
Крыніца дадзеных http накіроўвае HTTP-запыт GET на дадзены URL і экспартуе інфармацыю аб адказе, што часта карысна для атрымання інфармацыі з кропак доступу, для якіх не існуе ўласнага Terraform правайдэра.
Дыстанцыйны стан
Захоўвайце Terraform state для кожнага інфраструктурнага модуля і кампазіцыі ў дыстанцыйным бэкэндзе, наладжаным з дапамогай ACL, версіявання і часопісавання. Гэты адзіная аўтарытэтная крыніца праўды падтрымлівае асяроддзі ўзгодненымі і звычайна ўключае функцыі аднаўлення пасля аварый, такія як аўтаматызаваныя рэзервовыя копіі. Кіраванне станам лакальна можа прывесці да праблем з узаемадзеяннем і станам гонкі, калі некалькі распрацоўшчыкаў запускаюць Terraform адначасова, што прыводзіць да непрадказальных вынікаў.
Правайдэр, правіжанер і г.д.
Правайдэры, правіжанеры і некалькі іншых тэрмінаў вельмі добра апісаны ў афіцыйнай дакументацыі, і няма сэнсу паўтараць гэта тут. На маю думку, яны маюць мала агульнага з напісаннем добрых модуляў Terraform.
Чаму так складана?
У той час як асобныя рэсурсы — гэта атамы ў інфраструктуры, модулі рэсурсаў — гэта малекулы (якія складаюцца з атамаў). Модуль — гэта найменшая версіяваная адзінка якой магчыма падзяліцца. Ён мае дакладны спіс аргументаў, рэалізуе асноўную логіку, неабходную для таго, каб такая адзінка выконвала патрэбную функцыю. Напрыклад, модуль terraform-aws-security-group стварае рэсурсы aws_security_group і aws_security_group_rule на аснове ўваходных дадзеных. Гэты рэсурсны модуль сам па сабе можа выкарыстоўвацца разам з іншымі модулямі для стварэння інфраструктурнага модуля.
Доступ да дадзеных паміж малекуламі (рэсурснымі модулямі і інфраструктурнымі модулямі) ажыццяўляецца з дапамогай вывада модуляў і крыніц даных.
Доступ паміж кампазіцыямі часта ажыццяўляецца з дапамогай дыстанцыйных крыніц стану. Існуе спосабаў абмену данымі паміж канфігурацыямі.
Калі змясціць апісаныя вышэй канцэпцыі ў псеўда-адносіны, гэта можа выглядаць так:
Last updated