Me tohu etahi o nga mahanga, tae atu ki era e pa ana ki nga koropiko, mena he korero me nga tikanga tuku, tae atu ki nga take whanui e pa ana ki a Terraform i te nuinga:
he herenga te tatau me ia tawhā;
whakawhāiti i ngā tukunga wā-kore;
ahakoa he mahere pai ka taka;
Ka taea e te refactoring ona raru;
he rite tonu te hononga whakaroa... ki te whakaroa.
He herenga te tatau me ia tawhā
Ko nga tauira o tenei upoko e tino whakamahi ana i te tawhā tatau me te mo_ia kii i roto i nga koropiko me te arorau here. He pai o raatau mahi, engari e rua nga herenga nui me maarama koe.
Ko te tatau me te mo_ia-ia kaore e taea te tohutoro i nga taurangi rauemi whakaputa.
e kore e taea te tatau me te mo_ia ki te whirihoranga kōwae.
e kore e taea e tatau me mo ia_ia tohutoro nga taurangi putanga rauemi
Whakaarohia me tuku e koe etahi tūmau EC2 mo etahi take kaore koe e hiahia ki te whakamahi i te ASG. Ka penei pea to waehere:
I te mea kua tautuhia te tawhā tatau ki te uara pateko, ka mahi tenei waehere me te kore raru: ka whakahaere koe i te tono tono, ka hanga e toru nga tūmau EC2. Engari me pehea ki te hiahia koe ki te tuku i tetahi tūmau ki ia Rohe Wātea (AZ) i roto i to rohe AWS o naianei? Ka taea e koe te utaina e to waehere he rarangi rohe mai i te puna raraunga aws_availability_zones ka huri ki ia waahanga ka hanga he tūmau EC2 ki roto ma te whakamahi i te tawhā tatau me te urunga taupū huinga:
Ka pai hoki tenei waehere, na te mea ka taea e te tawhā tatau te tohu i nga puna raraunga kaore he raru. Engari ka aha mena ka whakawhirinaki te maha o nga kaitoro me hanga e koe ki te putanga o etahi rauemi? Hei whakaatu i tenei, ko te huarahi ngawari ko te whakamahi i te rauemi random_integer, e kii ana te ingoa, ka whakahoki i te tauoti matapōkere:
resource "random_integer" "num_instances" {
min = 1
max = 3
}
Ka mahia e tenei waehere he tau matapōkere i waenga i te 1 me te 3. Kia kite tatou ka aha mena ka ngana tatou ki te whakamahi i te putanga o tenei rauemi i roto i te tawhā tatau o te rauemi aws_instance:
Mena ka whakahaere koe i te mahere whenua i runga i tenei waehere, ka whiwhi koe i te hapa e whai ake nei:
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.
Me tatau a Terraform me tatau me mo_ia i roto i te wahanga whakamahere, i mua i te waihanga rauemi, te whakarereke ranei. Ko te tikanga ko te tatau me te mo_ia ka taea te korero ki nga kupu kupu, taurangi, puna raraunga, tae atu ki nga rarangi rauemi (mehemea ka taea te whakatau i te roa o te waa whakarite), engari kaua ki nga taurangi whakaputanga rauemi.
e kore e taea te tatau me te mo_ia ki te whirihoranga kōwae
I tetahi ra ka whakamatautauria koe ki te taapiri i tetahi tawhā tatau ki to whirihoranga kōwae:
Ka ngana tenei waehere ki te whakamahi tatau i roto i tetahi kōwae ki te hanga i nga kape e toru o te rauemi tukutuku-cluster. Ka hiahia pea koe ki te hono i tetahi kōwae hei whiriwhiri i runga i etahi ahuatanga Boolean ma te tautuhi i tana tawhā tatau ki te 0. He ahua tika pea tenei, engari ka puta tenei hapa ina whakahaere mahere whenua:
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.
Kia aroha mai, mai i te Terraform 0.12.6, kaore i te tautokohia te whakamahi tatau, mo_ia ranei i roto i tetahi rauemi kōwae. E ai ki nga korero tuku a Terraform 0.12 (http://bit.ly/3257bv4), kei te whakaaro a HashiCorp ki te taapiri i tenei kaha a meake nei, no reira kei te panui koe i tenei pukapuka, kei te waatea kee. Ki te tino mohio, panuihia te Terraform changelog konei.
Te herenga o nga Whakamahinga Kore Rake
Ko te whakamahi i te poraka create_before_destroy ki te whakakotahi me te ASG he otinga pai mo te hanga tukunga wa-kore, engari mo te whakatupato kotahi: kaore i te tautokohia nga ture autoscaling. Hei whakamaarama ake ranei, ka whakahoki ano tenei i te rahi o te ASG ki te min_size i runga i ia tukunga, ka raru pea mena kei te whakamahi koe i nga ture whakaheke aunoa hei whakanui ake i te maha o nga kaitoro e rere ana.
Hei tauira, kei roto i te kōwae webserver-cluster e rua nga rauemi aws_autoscaling_schedule, i te 9 i te ata ka piki ake te maha o nga tūmau i roto i te kohinga mai i te rua ki te tekau. Mena ka horahia e koe, me kii, 11 karaka, ka tiimata te ASG hou me nga kaitoro e rua noa atu i te tekau ka noho pera tae noa ki te 9 karaka i te ra o muri mai.
Ka taea te karo i tenei here i roto i nga huarahi maha.
Hurihia te tawhā hohokitanga i roto i te aws_autoscaling_schedule mai i te 0 9 * * * (“rere i te 9 i te ata”) ki tetahi mea penei i te 0-59 9-17 * * * (“rere ia meneti mai i te 9 i te ata ki te 5 i te ahiahi”). Mena kua tekau nga kaitoro a te ASG, ko te whakahaere ano i tenei ture autoscaling e kore e huri i tetahi mea, koinei ta matou e hiahia ana. Engari mena katahi ano ka tukuna te ASG, ma tenei ture e whakarite i roto i te morahi o te meneti ka eke te maha o ana kaimau ki te tekau. Ehara tenei i te huarahi tino huatau, a ko nga peke nui mai i te tekau ki te rua nga kaitoro me te hoki ka raru pea nga kaiwhakamahi.
Waihangahia he tuhinga ritenga e whakamahi ana i te AWS API ki te whakatau i te maha o nga tūmau kaha i roto i te ASG, ka karangahia ma te whakamahi i te puna raraunga o waho (tirohia te "Putake Raraunga o waho" i te wharangi 249), ka tautuhi i te tawhā hiahia_kaha o te ASG ki te uara i whakahokia e te tuhinga. Ma tenei ara, ko ia tauira ASG hou ka rere i runga i te kaha rite ki te waehere Terraform o naianei, ka uaua ake te pupuri.
Ae ra, ko te Terraform he pai te tautoko i roto i te tautoko mo nga tukunga kore-kore, engari mai i Mei 2019, kaore te roopu HashiCorp i whai whakaaro ki te taapiri i tenei mahi (taipitopito - konei).
Ko te mahere tika karekau pea i tutuki
I etahi wa ka whakaputahia e te whakahau mahere he mahere whakatakotoranga tino tika, engari ko te tono tono ka whakahoki he hapa. Ngana, hei tauira, te taapiri i te rauemi aws_iam_user me te ingoa ano i whakamahia e koe mo te kaiwhakamahi IAM i hanga e koe i mua i te Upoko 2:
resource "aws_iam_user" "existing_user" {
# Подставьте сюда имя уже существующего пользователя IAM,
# чтобы попрактиковаться в использовании команды terraform import
name = "yevgeniy.brikman"
}
Inaianei, ki te whakahaere koe i te whakahau mahere, ka whakaputahia e Terraform tetahi mahere whakaurunga ahua tika:
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.
Mena ka whakahaere koe i te tono tono ka whiwhi koe i te hapa e whai ake nei:
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" {
Ko te raruraru, ko te mea he kaiwhakamahi IAM me taua ingoa kua noho. A ka pa tenei ki nga kaiwhakamahi IAM anake, engari ki nga rauemi katoa. Ka taea e te tangata te hanga i tenei rauemi ma te ringaringa, ma te whakamahi ranei i te raina whakahau, engari ahakoa he aha, ko te rite ki nga TT ka puta he raruraru. He maha nga rereketanga o tenei hapa e mau ohorere ana te hunga hou ki a Terraform.
Ko te kaupapa matua ko te whakahau mahere whenua ka whai whakaaro anake ki nga rauemi kua tohua ki te konae whenua Terraform. Mena ka hangaia nga rauemi i etahi atu huarahi (hei tauira, ma te panui a-ringa i te papatohu AWS), kaore e mutu ki roto i te konae kawanatanga na reira kaore a Terraform e whai whakaaro ki a raatau i te wa e mahia ana te whakahau mahere. Ko te mutunga mai, ko te mahere e ahua tika ana i te titiro tuatahi ka kore e tutuki.
E rua nga akoranga hei ako mai i tenei.
Mena kua timata koe ki te mahi me te Terraform, kaua e whakamahi i tetahi atu mea. Mena kei te whakahaeretia tetahi waahanga o to hanganga ma te whakamahi i a Terraform, kaore e taea e koe te whakarereke a-ringa. Ki te kore, ka tupono noa koe ki nga hapa a Terraform, engari ka whakakorehia e koe te maha o nga painga o IaC na te mea ka kore te waehere hei tohu tika mo to hanganga.
Mena kei a koe etahi hanganga, whakamahia te tono kawemai. Mena kei te timata koe ki te whakamahi i a Terraform me nga hanganga o naianei, ka taea e koe te taapiri atu ki te konae kawanatanga ma te whakamahi i te whakahau kawemai terraform. Ma tenei ka mohio a Terraform he aha nga hanganga me whakahaere. E rua nga tohenga a te tono kawemai. Ko te tuatahi ko te wahitau rauemi kei roto i o konae whirihoranga. He rite te wetereo ki konei mo nga hononga rauemi: _. (pērā i te aws_iam_user.existing_user). Ko te tohenga tuarua ko te ID o te rauemi hei kawemai. Me kii ko te ID rauemi aws_iam_user te ingoa kaiwhakamahi (hei tauira, yevgeniy.brikman), ko te ID rauemi aws_instance ko te ID tūmau EC2 (penei i te i-190e22e5). Me pehea te kawemai i tetahi rauemi ka tohuhia i roto i nga tuhinga kei raro o tona wharangi.
Kei raro nei he tono kawemai e tukutahi ana i te rauemi aws_iam_user i tapirihia e koe ki to whirihoranga Terraform me te kaiwhakamahi IAM i te Upoko 2 (whakakapi i to ingoa mo yevgeniy.brikman, o te akoranga):
Ka waea atu a Terraform ki te AWS API ki te rapu i to kaiwhakamahi IAM me te hanga hononga konae i waenga i a ia me te rauemi aws_iam_user.existing_user i roto i to whirihoranga Terraform. Mai i tenei wa, ka whakahaere koe i te whakahau mahere, ka mohio a Terraform kei te noho tonu te kaiwhakamahi IAM, kaore e ngana ki te hanga ano.
Me mohio koe mena he maha nga rauemi e hiahia ana koe ki te kawemai ki roto i te Terraform, ka raru te tuhi-a-ringa i te waehere me te kawe mai i ia waahanga i ia wa. No reira he pai ki te titiro ki tetahi taputapu penei i a Terraforming (http://terraforming.dtan4.net/), ka taea te kawemai aunoa i te waehere me te ahua mai i to putea AWS.
Ka taea e Refactoring ona mahanga
Refactoring he mahi noa i roto i nga kaupapa ka huri koe i te hanganga o roto o te waehere ka waiho te whanonga o waho kia kore e rereke. Ko tenei kia marama ake, kia maamaa, kia ngawari ake te pupuri. Ko te refactoring he tikanga tino nui me whakamahi i nga wa katoa. Engari ka tae mai ki a Terraform, ki tetahi atu taputapu IaC ranei, me tino tupato koe ki te tikanga o te "whanonga o waho" o tetahi waahanga tohu, ki te kore ka puta ake nga raru ohorere.
Hei tauira, ko tetahi momo refactoring noa ko te whakakapi i nga ingoa o nga taurangi, o nga mahi ranei ki nga ingoa e marama ake ana. He maha nga IDE kua hanga-i roto i te tautoko mo te refactoring ka taea te whakaingoa aunoa i nga taurangi me nga mahi puta noa i te kaupapa. I roto i nga reo hötaka kaupapa whänui, he tikanga iti tenei kaore pea koe e whakaaro, engari i roto i te Terraform me tino tupato koe ki tenei, ki te kore ka raru koe.
Hei tauira, ko te kōwae tukutuku-cluster he taurangi taurangi cluster_name:
variable "cluster_name" {
description = "The name to use for all the cluster resources"
type = string
}
Whakaarohia kua timata koe ki te whakamahi i tenei waahanga ki te tuku i tetahi ratonga miihini e kiia nei ko te foo. Hei muri, ka hiahia koe ki te whakaingoa ano i to ratonga ki te pae. Ko tenei huringa he ahua iti noa iho, engari ko te mea pono ka raru pea nga ratonga.
Ko te mea e whakamahia ana e te kōwae tukutuku-cluster te taurangi cluster_name i roto i te maha o nga rauemi, tae atu ki te tawhā ingoa o nga roopu haumaru e rua me te ALB:
Mena ka huri koe i te tawhā ingoa i runga i tetahi rauemi, ka mukua e Terraform te putanga tawhito o taua rauemi, ka hangaia he mea hou hei whakakapi. Engari ki te mea he ALB taua rauemi, i waenga i te whakakore me te tango i tetahi putanga hou, kaore koe e whai tikanga ki te tuku atu i nga waka ki to tūmau tukutuku. Waihoki, ki te mukua he roopu haumarutanga, ka timata to kaimau ki te whakakore i nga hokohoko whatunga kia hanga ra ano he roopu hou.
Ko tetahi atu momo refactoring e hiahia ana koe ko te whakarereke i te ID Terraform. Me tango te rauemi aws_security_group i roto i te kōwae tukutuku-cluster hei tauira:
Ko te tautohu o tenei rauemi ka kiia he tauira. Whakaarohia i te wa o te refactoring i whakatau koe ki te huri ki tetahi ingoa maamaa ake (ki to whakaaro) cluster_instance:
Ka hono a Terraform i ia ID rauemi me te ID kaiwhakarato kapua. Hei tauira, ko iam_user e hono ana ki te AWS IAM kaiwhakamahi ID, a aws_instance e hono ana ki te AWS EC2 server ID. Mena ka huri koe i te ID rauemi (me kii mai i te tauira ki te cluster_instance, penei me te aws_security_group), ki te Terraform ka puta me te mea kua mukua e koe te rauemi tawhito me te taapiri i tetahi mea hou. Mena ka tono koe i enei huringa, ka mukua e Terraform te roopu haumarutanga tawhito me te hanga i tetahi mea hou, i te wa ka timata to kaimau ki te whakakore i nga hokohoko whatunga.
Anei nga akoranga matua e wha me tango e koe mai i tenei korerorero.
Whakamahia te tono mahere i nga wa katoa. Ka taea e ia te whakaatu i enei mahanga katoa. Te arotake i tana putanga me te aro ki nga ahuatanga e whakaaro ana a Terraform ki te whakakore i nga rauemi e kore e tika kia mukua.
Waihanga i mua i to muku. Mena kei te pirangi koe ki te whakakapi i tetahi rauemi, ata whakaaro mena ka hiahia koe ki te hanga whakakapinga i mua i te whakakore i te taketake. Mena he ae te whakautu, ka taea e te waihanga_before_destroy te awhina. Ko te hua ano ka taea ma te ringaringa ma te mahi i nga waahanga e rua: tuatahi taapirihia he rauemi hou ki te whirihoranga ka whakahaere i te tono tono, katahi ka tango i te rauemi tawhito mai i te whirihoranga ka whakamahi ano i te tono tono.
Ko te huri i nga kaitautuhi me whakarereke te ahua. Mena kei te pirangi koe ki te huri i te ID e hono ana ki tetahi rauemi (hei tauira, whakaingoatia te aws_security_group mai i te tauira ki te cluster_instance) me te kore e mukua te rauemi me te hanga i tetahi putanga hou, me whakahou e koe te konae whenua Terraform. Kaua rawa e mahi a-ringa - whakamahia te tono whenua terraform. Ina whakaingoatia nga kaitautuhi, me whakahaere e koe te whakahau terraform state mv, kei a ia te wetereo e whai ake nei:
terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>
Ko te ORIGINAL_REFERENCE he kupu e tohu ana ki te rauemi i roto i tona ahua o naianei, a ko NEW_REFERENCE te waahi e hiahia ana koe ki te neke. Hei tauira, ka whakaingoatia te roopu aws_security_group mai i te tauira ki te cluster_instance, me whakahaere e koe te whakahau e whai ake nei:
$ terraform state mv
aws_security_group.instance
aws_security_group.cluster_instance
Ko te korero tenei ki a Terraform ko te kawanatanga i hono i mua ki te aws_security_group.instance me hono inaianei ki aws_security_group.cluster_instance. Mena i muri i te whakaingoatanga me te whakahaere i tenei mahere whenua whakahau karekau he huringa, katahi ka tika nga mahi katoa.
Kaore e taea te whakarereke i etahi tautuhinga. Ko nga tawhā o te maha o nga rauemi kaore e taea te whakarereke. Mena ka ngana koe ki te whakarereke, ka mukua e Terraform te rauemi tawhito me te hanga i tetahi mea hou hei whakakapi. Ko ia wharangi rauemi ka tohu i nga mea ka puta ina huri koe i tetahi tautuhinga, na kia mohio koe ki te tirotiro i nga tuhinga. Whakamahia i nga wa katoa te whakahau mahere me te whakaaro ki te whakamahi i te rautaki waihanga_before_destroy.
He rite tonu te rite o te whakaroa... me te whakaroa
Ko etahi API o nga kaiwhakarato kapua, penei i te AWS, he tukutahi, kua roa te rite. Asynchrony te tikanga ka taea e te atanga te whakahoki urupare me te kore e tatari kia oti te mahi i tonoa. Ko te roa o te riterite ko te tikanga ka roa pea nga huringa ki te toha puta noa i te punaha; i te wa e pa ana tenei, ka rereke pea o whakautu me te whakawhirinaki ki te tauira puna raraunga e whakautu ana ki o waea API.
Whakaarohia, hei tauira, ka waea koe ki te API ki te AWS me te tono kia hanga he tūmau EC2. Ka whakahokia mai e te API he whakautu "angitu" (201 Hangaia) tata tonu, me te kore e tatari kia hangaia te tūmau ake. Mena ka ngana koe ki te hono atu ki a ia i tenei wa, ka kore e taka na te mea kei te timata tonu te AWS ki te timata i nga rauemi, kare ano ranei te kaimau i te puhipuhi. I tua atu, ki te waea atu koe ki te tiki korero mo tenei tūmau, ka hapa pea koe (404 Kaore i Kitea). Ko te mea ko nga korero mo tenei tūmau EC2 ka tukuna tonu ki te AWS i mua i te waatea ki nga waahi katoa, me tatari koe mo etahi hēkona.
I nga wa katoa ka whakamahi koe i te API tukutahi me te noho mangere, me ngana ano koe i ia wa i to tono kia oti ra ano te hohenga ka horahia ki roto i te punaha. Engari, kaore te AWS SDK e whakarato i nga taputapu pai mo tenei, a ko te kaupapa Terraform i mate i te maha o nga pepeke penei i te 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
Arā, ka waihangahia e koe he rauemi (penei i te kupengaroto) katahi ka ngana ki te tiki korero mo taua mea (penei i te ID o te kupengaroto hou i hangaia), kaore e kitea e Terraform. Ko te nuinga o enei pepeke (tae atu ki te 6813) kua whakatikahia, engari ka tipu tonu i ia wa, ina koa ka taapirihia e Terraform te tautoko mo tetahi momo rauemi hou. He hoha tenei, engari i te nuinga o te waa kaore he kino. Ka whakahaere ano koe i te terraform, me mahi nga mea katoa, na te mea i tenei wa kua horapa kee nga korero puta noa i te punaha.