Se'i o tatou fa'ailo ni nai fa'alavelave, e aofia ai mea e feso'ota'i ma fa'agasolo, pe afai o fa'amatalaga ma fa'aogaina auala, fa'apea fo'i ma isi fa'afitauli lautele e a'afia ai Terraform i le lautele:
o le faitau ma mo_ta'iala ta'itasi e iai tapula'a;
fa'atapula'a le fa'atinoina o taimi fa'aletonu;
e oo lava i se fuafuaga lelei e mafai ona toilalo;
toefactoring e mafai ona i ai ona mailei;
o le felagolagomai tolopo e ogatasi... ma le tolopoina.
E iai tapula'a le faitau ma mo_ta'i uma
O fa'ata'ita'iga i lenei mataupu e fa'aoga tele ai le fa'asologa o le numera ma le fa'aaliga mo_ta'itasi i fa'amaufa'ailoga ma fa'atonuga. E lelei a latou gaioiga, ae e lua a latou tapulaa taua e tatau ona e nofouta i ai.
Faitau ma mo_each e le mafai ona fa'asino i so'o se fesuiaiga o meafaitino.
faitau ma mo_each e le mafai ona fa'aoga ile fa'atulagaina o module.
faitau ma for_each e le mafai ona fa'asino i so'o se suiga o alagaoa
Vaai faalemafaufau e te manaʻomia le faʻapipiʻiina o le tele o sapalai EC2 ma mo nisi mafuaʻaga e te le manaʻo e faʻaaoga le ASG. O lau code atonu e pei o lenei:
Talu ai ona o le numera o le numera ua setiina i se tulaga taua, o lenei code o le a galue e aunoa ma ni faʻafitauli: pe a e faʻatinoina le faʻatonuga o le faʻatonuga, o le a fatuina ai le tolu EC2 servers. Ae fa'afefea pe a e mana'o e fa'apipi'i se 'au'aunaga i sone Avanoa ta'itasi (AZ) i totonu o lau AWS o lo'o iai nei? E mafai ona e ave lau fa'ailoga e utaina ai se lisi o sone mai le aws_availability_zones fa'amatalaga fa'amatalaga ona fa'asolo lea i ia mea ta'itasi ma fai se EC2 server i totonu e fa'aaoga ai le numera numera ma le fa'asologa o fa'asinomaga avanoa:
O lenei code o le a lelei foi, talu ai o le numera numera e mafai ona faʻasino i punaʻoa faʻamaumauga e aunoa ma se faʻafitauli. Ae o le a le mea e tupu pe afai o le numera o 'auʻaunaga e te manaʻomia e fatuina e faʻalagolago i le gaosiga o nisi punaoa? Ina ia faʻaalia lenei mea, o le auala pito sili ona faigofie o le faʻaaogaina lea o le random_integer punaoa, lea, e pei ona taʻu mai e le igoa, toe faʻafoʻi mai se numera faʻafuaseʻi:
resource "random_integer" "num_instances" {
min = 1
max = 3
}
O lenei code e fa'atupuina ai se numera fa'afuase'i i le va o le 1 ma le 3. Se'i va'ai po'o le a le mea e tupu pe a tatou taumafai e fa'aoga le mea e maua mai i lenei punaoa i le fa'asologa o le numera o le aws_instance resource:
Afai e te faʻatautaia le terraform plan i luga o lenei code, o le ae mauaina le mea sese:
Error: Invalid count argument
on main.tf line 30, in resource "aws_instance" "example_3":
30: count = random_integer.num_instances.result
The "count" value depends on resource attributes that cannot be determined until apply, so Terraform cannot predict how many instances will be created. To work around this, use the -target argument to first apply only the resources that the count depends on.
E mana'omia e Terraform le faitau ma mo_ta'itasi e fa'atatau i le taimi o fuafuaga, a'o le'i faia so'o se alagā'oa pe suia. O lona uiga o le faitau ma mo_each e mafai ona faasino i mea moni, fesuiaiga, puna'oa o fa'amaumauga, ma e o'o lava i lisi o punaoa (pe a mafai ona fa'amauina lo latou umi i le taimi fa'atulagaina), ae le o le fa'avasegaina o fesuiaiga o alagaoa.
faitau ma mo_each e le mafai ona fa'aoga ile fa'atulagaina o module
E iai se aso e ono fa'aosoosoina ai oe e fa'aopoopo se fa'ailoga numera i lau fa'atulagaina o module:
O lenei tulafono e taumafai e fa'aoga le numera i totonu o se module e fai ai ni kopi se tolu o le upegatafa'ilagi-cluster punaoa. Pe e te mana'o e fai le fa'afeso'ota'i o se module e filifili e fa'atatau i nisi tulaga Boolean e ala i le fa'atulagaina o lona fa'amaufa'ailoga i le 0. Atonu e foliga mai o se fa'ailoga talafeagai, ae o le a e maua le mea sese pe a fa'atino fuafuaga fa'afanua:
Error: Reserved argument name in module block
on main.tf line 13, in module "count_example":
13: count = 3
The name "count" is reserved for use in a future version of Terraform.
Ae paga lea, e pei o Terraform 0.12.6, e le lagolagoina le fa'aogaina o le numera po'o mo_each i totonu o se punaoa module. E tusa ai ma le Terraform 0.12 faʻasalalauga faʻamatalaga (http://bit.ly/3257bv4), ua fuafua HashiCorp e faʻaopoopo lenei gafatia i le lumanaʻi, o lea e fuafua i le taimi e te faitau ai i lenei tusi, atonu ua avanoa. Ina ia iloa mautinoa, faitau le Terraform changelog iinei.
Tapula'a o Fa'atonuga ole Taimi Fa'ato'ilalo
O le fa'aogaina o le poloka create_before_destroy fa'atasi ma le ASG o se fofo sili lea mo le fa'atupuina o le fa'atinoina o le leai o se taimi, se'i vagana ai le fa'atagaga e tasi: e le lagolagoina tulafono fa'a-auto. Pe sili atu le saʻo, e toe faʻafoʻi le tele o le ASG i le min_size i luga o faʻatonuga uma, e mafai ona avea ma faʻafitauli pe afai o loʻo e faʻaogaina tulafono faʻapitoa e faʻateleina ai le numera o sapalai o loʻo tamoe.
Mo se faʻataʻitaʻiga, o le webserver-cluster module o loʻo i ai se pea aws_autoscaling_schedule resources, lea i le 9 i le taeao e faʻateleina ai le numera o sapalai i le fuifui mai le lua i le sefulu. Afai e te fa'atulagaina i, fai mai, 11 i le taeao, o le ASG fou o le a fa'aulu i luga na'o le lua sapalai nai lo le sefulu ma tumau ai i lena auala seia oo i le 9 i le taeao i le aso e sosoo ai.
O lenei tapula'a e mafai ona fa'asao i le tele o auala.
Suia le parakalafa toe fai i le aws_autoscaling_schedule mai le 0 9 * * * (“taufetuli i le 9 i le taeao”) i se mea e pei o le 0-59 9-17 * * * (“taufetuli i minute uma mai le 9 i le taeao i le 5 i le afiafi”). Afai o le ASG ua uma ona i ai ni 'auʻaunaga e sefulu, o le toe faʻaogaina o lenei tulafono autoscaling o le a le suia ai se mea, o le mea lea matou te mananaʻo ai. Ae afai e le'i leva ona tu'uina atu le ASG, o le a mautinoa e le tulafono lea e o'o atu i le sefulu le aofa'i o ana 'au'aunaga i totonu o le minute. E le'o se faiga fa'alelei atoa, ma oso tetele mai le sefulu i le lua 'au'aunaga ma tua e mafai fo'i ona fa'atupu fa'afitauli mo tagata fa'aoga.
Fausia se tusitusiga faʻapitoa e faʻaaoga ai le AWS API e fuafua ai le aofaʻi o sapalai o loʻo galue i le ASG, valaʻau e faʻaaoga ai se puna faʻamatalaga mai fafo (silasila i le "Faʻamatalaga Faʻamatalaga Faʻamatalaga" i le itulau 249), ma seti le manaʻo_capacity parameter a le ASG i le tau toe faafoi mai e. le tusitusiga. O le auala lea, o fa'ata'ita'iga fou ASG ta'itasi o le a tamo'e i le tulaga tutusa ma le code Terraform o lo'o iai ma fa'afaigata ai ona tausia.
O le mea moni, o Terraform o le a lelei ona fausia-i totonu o le lagolago mo le leai o se taimi e faʻaaogaina, ae o Me 2019, e leai se fuafuaga a le 'au HashiCorp e faʻaopoopoina lenei galuega (fa'amatalaga - iinei).
O le fuafuaga sa'o e ono le manuia le faatinoga
O nisi taimi o le fa'atonuga o le fuafuaga e maua ai se fuafuaga fa'apipi'i sa'o lelei, ae o le fa'atonuga fa'atonu e toe fa'afo'i mai ai se mea sese. Taumafai, mo se faʻataʻitaʻiga, faʻaopoopo le aws_iam_user punaoa ma le igoa tutusa na e faʻaaogaina mo le tagata IAM na e faia muamua i le Mataupu 2:
resource "aws_iam_user" "existing_user" {
# Подставьте сюда имя уже существующего пользователя IAM,
# чтобы попрактиковаться в использовании команды terraform import
name = "yevgeniy.brikman"
}
Ia, afai e te faʻatautaia le faʻatonuga o le fuafuaga, o le a faʻaalia e Terraform se fuafuaga faʻapipiʻi talafeagai:
Terraform will perform the following actions:
# aws_iam_user.existing_user will be created
+ resource "aws_iam_user" "existing_user" {
+ arn = (known after apply)
+ force_destroy = false
+ id = (known after apply)
+ name = "yevgeniy.brikman"
+ path = "/"
+ unique_id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Afai e te faʻatinoina le faʻatonuga o le a e mauaina le mea sese:
Error: Error creating IAM User yevgeniy.brikman: EntityAlreadyExists:
User with name yevgeniy.brikman already exists.
on main.tf line 10, in resource "aws_iam_user" "existing_user":
10: resource "aws_iam_user" "existing_user" {
O le faʻafitauli, ioe, o se tagata faʻaoga IAM ma lena igoa ua uma ona i ai. Ma e mafai ona tupu lenei mea e le gata i tagata faʻaoga IAM, ae toetoe lava o soʻo se punaoa. E mafai ona faia e se tasi lenei punaoa ma le lima poʻo le faʻaaogaina o le laina faʻatonu, ae poʻo le a lava le auala, faʻafetaui ID e taʻitaʻia ai feeseeseaiga. E tele fesuiaiga o lenei mea sese e masani ona faʻateʻia tagata fou i Terraform.
O le mea autu o le faʻatonuga o le fuafuaga o le terraform e naʻo le amanaʻiaina o na punaoa o loʻo faʻamaonia i le Terraform state file. Afai o punaoa e fausia i se isi auala (mo se faʻataʻitaʻiga, ma le lima e ala i le kiliki i le AWS console), latou te le faʻamutaina i le faila a le setete ma o le mea lea e le amanaia ai e Terraform pe a faʻatinoina le faʻatonuga o le fuafuaga. O se taunuuga, o se fuafuaga e foliga sa'o i le tepa muamua o le a iu ina le manuia.
E lua lesona e aʻoaʻoina mai ai.
Afai ua uma ona e amata galue ma Terraform, aua le faʻaaogaina se isi mea. Afai o se vaega o au atina'e o lo'o pulea e fa'aaoga ai le Terraform, e le toe mafai ona e toe suia ma le lima. A leai, e le gata ina e lamatia mea sese Terraform, ae e te faʻafitia foi le tele o faʻamanuiaga o le IaC talu ai o le code o le a le toe avea ma faʻamatalaga saʻo o au atinaʻe.
Afai ua iai ni au atina'e, fa'aoga le fa'atonuga mai fafo. Afai o loʻo e amata faʻaaoga Terraform ma atinaʻe o loʻo i ai nei, e mafai ona e faʻaopopo i le faila a le setete e faʻaaoga ai le terraform import command. O le auala lea e iloa ai e Terraform mea tetele e mana'omia ona pulea. O le fa'atonuga fa'aulufale mai e lua finauga. Muamua o le tuatusi punaoa i au faila faila. O le syntax iinei e tutusa ma mo so'oga punaoa: _. (pei aws_iam_user.existing_user). O le finauga lona lua o le ID o le punaoa e faaulufale mai. Fa'apea o le ID punaoa aws_iam_user o le igoa fa'aoga (mo se fa'ata'ita'iga, yevgeniy.brikman), ma le ID punaoa aws_instance o le ID server EC2 (pei o i-190e22e5). O le fa'afefea ona fa'aulufaleina mai o se puna'oa e masani lava ona fa'ailoa mai i fa'amaumauga i le pito i lalo o lona itulau.
O loʻo i lalo se faʻatonuga faʻaulufaleina e faʻamaopoopoina le aws_iam_user punaoa na e faʻaopoopoina i lau faʻatulagaga Terraform faʻatasi ma le tagata IAM i le Mataupu 2 (sui lou igoa mo yevgeniy.brikman, ioe):
O le a vala'au Terraform i le AWS API e su'e lau IAM fa'aoga ma fa'atupu se fa'asoa faila a le setete i le va ma le aws_iam_user.existing_user punaoa i lau fa'atulagaga Terraform. Mai le taimi nei, pe a e faʻatautaia le faʻatonuga o le fuafuaga, o le a iloa e Terraform o loʻo i ai le tagata IAM ma o le a le toe taumafai e toe faia.
E taua le matauina afai ua tele au punaoa e te manaʻo e faʻaulufale mai i totonu o Terraform, o le tusiina ma le lima o le code ma le faʻaulufaleina mai o mea taʻitasi i le taimi e mafai ona avea ma faʻalavelave. O lea e aoga le va'ai i se meafaigaluega e pei o Terraforming (http://terraforming.dtan4.net/), lea e mafai ona otometi le fa'aulufale mai o le code ma le setete mai lau tala AWS.
Refactoring e mafai ona i ai ona mailei
Toe faia ose faiga masani i polokalame e te suia ai le fausaga i totonu o le code ae tu'u le amio i fafo e le suia. O le mea lea e fa'amanino atili ai le fa'ailoga, mama, ma faigofie ona tausia. Refactoring o se metotia taua e tatau ona faʻaaogaina i taimi uma. Ae a oʻo mai i Terraform poʻo soʻo se isi meafaigaluega IaC, e tatau ona e matua faʻaeteete i le uiga o lau "amio i fafo" o se fasi tulafono, a leai o le a tulaʻi mai faʻafitauli e leʻi mafaufauina.
Mo se faʻataʻitaʻiga, o se ituaiga masani o le toe faʻaleleia o le suia o igoa o fesuiaiga poʻo galuega i mea e sili atu ona malamalama. O le tele o IDE o loʻo iai le lagolago mo le toe faʻaleleia ma e mafai ona toe faʻaigoaina suiga ma galuega i totonu o le poloketi. I gagana fa'apolokalame fa'amoemoe lautele, ose faiga fa'atauva'a lea atonu e te le mafaufau i ai, ae i Terraform e tatau ona e matua fa'aeteete i lenei mea, a le o lea e te ono fa'aletonu.
Mo se faʻataʻitaʻiga, o le webserver-cluster module o loʻo i ai se faʻaogaina ole cluster_name:
variable "cluster_name" {
description = "The name to use for all the cluster resources"
type = string
}
Va'ai faalemafaufau na e amata fa'aogaina lenei module e fa'atino ai se microservice e ta'ua foo. Mulimuli ane, e te mana'o e toe fa'aigoa lau tautua ile pa. O lenei suiga atonu e foliga faatauvaa, ae o le mea moni e mafai ona mafua ai le faʻalavelaveina o auaunaga.
O le mea moni o le webserver-cluster module e faʻaaogaina le cluster_name variable i le tele o punaoa, e aofia ai le faʻailoga igoa o vaega saogalemu e lua ma le ALB:
Afai e te suia le igoa parakalafa i luga o se punaoa, o le a tape e Terraform le lomiga tuai o lena punaoa ma fatuina se mea fou i lona tulaga. Ae afai o lena punaoa o se ALB, i le va o le tapeina ma le siiina mai o se lomiga fou, o le a leai sau masini e toe faʻafeiloaʻi ai fefaʻatauaiga i lau 'upega tafaʻilagi. E fa'apea fo'i, afai e tapeina se vaega o le puipuiga, o le a amata ona teena e au 'au'aunaga so'o se fefa'ataua'iga o feso'ota'iga se'ia o'o ina faia se vaega fou.
O le isi ituaiga o toe fa'afoliga atonu e te fiafia i ai o le suia lea o le Terraform ID. Sei o tatou ave le aws_security_group punaoa i le webserver-cluster module e fai ma faʻataʻitaʻiga:
O le fa'ailoaina o lenei punaoa ua ta'ua o le fa'ata'ita'iga. Vaʻai faalemafaufau i le taimi o le toe faʻaleleia na e filifili e sui i se igoa e sili atu ona malamalama (i lou manatu) cluster_instance:
O le ā o le a tupu i le iʻuga? E sa'o: o se fa'alavelave.
E fa'afeso'ota'i e Terraform ID puna'oa ta'itasi ma ID e tu'uina atu ao. Mo se fa'ata'ita'iga, iam_user e feso'ota'i ma le AWS IAM ID fa'aoga, ma aws_instance e feso'ota'i ma le ID server AWS EC2. Afai e te suia le ID punaoa (fai mai le faʻataʻitaʻiga i le cluster_instance, e pei o le tulaga i le aws_security_group), i Terraform o le a foliga mai ua e tapeina le punaoa tuai ma faʻaopoopo se mea fou. Afai e te faʻaogaina nei suiga, o le a tape e Terraform le vaega tuai o le puipuiga ma fatuina se mea fou, aʻo amata ona teena e au 'auʻaunaga soʻo se fefaʻatauaiga o fesoʻotaiga.
O lesona autu nei e fa e tatau ona e mauaina mai lenei talanoaga.
Fa'aaoga i taimi uma le fa'atonuga o le fuafuaga. E mafai ona faʻaalia uma nei faʻalavelave. Toe iloilo ma le faaeteete ana galuega faatino ma gauai atu i tulaga e fuafua ai Terraform e tape punaoa e foliga mai e le tatau ona tapeina.
Fausia ae e te le'i tapeina. Afai e te manaʻo e sui se punaoa, mafaufau lelei pe e te manaʻomia le faia o se mea e sui ai aʻo leʻi tapeina le mea muamua. Afai o le tali o le ioe, create_before_destroy e mafai ona fesoasoani. O le taunuuga lava e tasi e mafai ona ausia ma le lima e ala i le faia o ni laasaga se lua: muamua faʻaopoopo se punaoa fou i le faʻatulagaina ma faʻatautaia le faʻatonuga faʻaoga, ona aveese lea o le punaoa tuai mai le faʻatulagaina ma toe faʻaaoga le poloaiga faʻaoga.
O le suia o fa'ailoga e mana'omia ai le suiga o le tulaga. Afai e te manaʻo e sui le ID e fesoʻotaʻi ma se punaoa (mo se faʻataʻitaʻiga, toe faʻaigoaina aws_security_group mai le faʻataʻitaʻiga i cluster_instance) e aunoa ma le tapeina o le punaoa ma fatuina se faʻamatalaga fou, e tatau ona e faʻafouina le Terraform state file e tusa ai. Aua ne'i faia ma le lima lenei mea - fa'aaoga le fa'atonuga o le setete. Pe a toe faʻaigoaina faʻamatalaga, e tatau ona e faʻatautaia le terraform state mv command, lea e iai le syntax lea:
terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>
ORIGINAL_REFERENCE o se fa'aaliga e fa'asino i le puna'oa i lona tulaga o iai nei, ma NEW_REFERENCE o le mea e te mana'o e fa'anofo ai. Mo se faʻataʻitaʻiga, pe a toe faʻaigoaina le aws_security_group group mai le faʻataʻitaʻiga i le cluster_instance, e te manaʻomia le faʻatinoina o le poloaiga lenei:
$ terraform state mv
aws_security_group.instance
aws_security_group.cluster_instance
E ta'u atu ai ia Terraform o le setete sa feso'ota'i muamua ma aws_security_group.instance ua tatau nei ona feso'ota'i ma aws_security_group.cluster_instance. Afai a maeʻa ona toe faʻaigoaina ma faʻatautaia lenei faʻatonuga o le terraform plan e le faʻaalia ai ni suiga, ona e faia saʻo mea uma.
O nisi tulaga e le mafai ona suia. O fa'asologa o le tele o punaoa e le mafai ona suia. Afai e te taumafai e sui, o le a tape e Terraform le punaoa tuai ma fatuina se mea fou i lona tulaga. O itulau punaoa ta'itasi e masani ona fa'aalia ai le mea e tupu pe a e suia se fa'atulagaga fa'apitoa, ia mautinoa e siaki le fa'amaumauga. Faʻaaoga i taimi uma le faʻatonuga o le fuafuaga ma mafaufau e faʻaaoga le create_before_destroy fuafuaga.
O le fa'atuai le tumau e ogatasi... ma le tolopoina
O nisi API o lo'o tu'uina atu ao, e pei ole AWS, e le'o fa'atasi ma ua tuai ona fa'atasi. Asynchrony o lona uiga e mafai e le atinaʻe vave ona toe faʻafoʻi mai se tali e aunoa ma le faʻatali mo le gaioiga o loʻo talosagaina e maeʻa. Fa'atuai tumau o lona uiga o suiga e ono umi se taimi e fa'asalalauina ai i le faiga atoa; a'o tupu lenei mea, o au tali atonu e le o gatasi ma fa'alagolago i le fa'asologa o fa'amaumauga o lo'o tali atu i au API telefoni.
Vaʻai faalemafaufau, mo se faʻataʻitaʻiga, e te faia se API telefoni i le AWS e fai atu i ai e fai se EC2 server. O le API o le a toe faʻafoʻi mai se tali "manuia" (201 Created) toetoe lava a vave, e aunoa ma le faʻatali mo le server lava ia e faia. Afai e te taumafai e faʻafesoʻotaʻi i le taimi lava lena, e toetoe lava a le manuia ona o le taimi lena o loʻo faʻauluina pea e le AWS punaoa pe, i se isi itu, e leʻi faʻauluina le server. E le gata i lea, afai e te toe faia se isi telefoni e maua mai ai faʻamatalaga e uiga i lenei 'auʻaunaga, atonu e te maua se mea sese (404 E Leʻi Maua). O le mea o le faʻamatalaga e uiga i lenei EC2 server e mafai lava ona faʻasalalau i le AWS atoa ae leʻi maua i soʻo se mea, e tatau ona e faʻatali mo ni nai sekone.
So'o se taimi lava e te fa'aogaina ai se API fa'atasi ma le paie, e tatau ona e toe fa'ata'ita'i i lea taimi ma lea taimi lau talosaga se'ia mae'a le gaioiga ma fa'asalalau i le faiga. Ae paga lea, e le maua e le AWS SDK ni meafaigaluega lelei mo lenei mea, ma o le Terraform project sa masani ona mafatia i le tele o bugs pei o 6813 (https://github.com/hashicorp/terraform/issues/6813):
$ terraform apply
aws_subnet.private-persistence.2: InvalidSubnetID.NotFound:
The subnet ID 'subnet-xxxxxxx' does not exist
I se isi faaupuga, e te fatuina se punaoa (pei o se subnet) ona taumafai lea e maua ni faʻamatalaga e uiga i ai (pei o le ID o le subnet fou fou), ma e le mafai e Terraform ona maua. O le tele o nei bugs (e aofia ai le 6813) ua uma ona faʻaleleia, ae o loʻo tupu pea mai lea taimi i lea taimi, aemaise lava pe a faʻaopoopo e Terraform le lagolago mo se ituaiga punaoa fou. E ita tele lenei mea, ae i le tele o tulaga e le afaina ai. A e toe faʻaogaina le terraform, e tatau ona aoga mea uma, talu ai o le taimi lea o le a faʻasalalau faʻamatalaga i totonu o le polokalama.