Ka anyị gosipụta ọnyà ole na ole, gụnyere ndị metụtara loops, ma ọ bụrụ na nkwupụta na usoro mbugharị, yana okwu ndị ọzọ na-emetụta Terraform n'ozuzu:
ọnụ ọgụgụ na maka_ọ bụla paramita nwere oke;
belata oge nkwụsịtụ efu;
ọbụna ezigbo atụmatụ nwere ike ịda;
refactoring nwere ike inwe ọnyà ya;
nkwekọ akwụsịla akwụsị na-agbanwe agbanwe... na nbugharị.
Ọnụọgụ na maka paramita ọ bụla nwere oke
Ọmụmaatụ ndị dị n'isiakwụkwọ a na-eji oke ọnụọgụgụ na okwu maka_ọ bụla na loops na mgbagha ọnọdụ. Ha na-arụ ọrụ nke ọma, mana ha nwere oke abụọ dị mkpa ị kwesịrị ịma.
Gụọ na maka_onye ọ bụla enweghị ike ịkọwapụta mgbanwe mgbanwe akụrụngwa ọ bụla.
gụọ na maka_ọ bụla enweghị ike iji na nhazi modul.
gụọ na maka_onye ọ bụla enweghị ike ịkọwapụta mgbanwe mgbanwe akụrụngwa ọ bụla
Were ya na ị ga-ebuga ọtụtụ sava EC2 na n'ihi ihe ụfọdụ ị chọghị iji ASG. Koodu gị nwere ike ịdị ka nke a:
Ebe ọ bụ na atọrọ ngụkọ ọnụ na uru kwụ ọtọ, koodu a ga-arụ ọrụ n'enweghị nsogbu: mgbe ị na-agba ọsọ itinye iwu, ọ ga-emepụta sava EC2 atọ. Mana gịnị ma ọ bụrụ na ịchọrọ ibuga otu ihe nkesa na mpaghara nnweta ọ bụla (AZ) n'ime mpaghara AWS gị ugbu a? Ị nwere ike ibunye koodu gị ndepụta mpaghara site na isi iyi data aws_availability_zones wee pịa nke ọ bụla wee mepụta sava EC2 n'ime ya site na iji paramita ọnụọgụ na ohere ntinye aha:
Koodu a ga-arụkwa ọrụ nke ọma, ebe ọ bụ na ọnụọgụgụ nwere ike idetu isi mmalite data n'enweghị nsogbu ọ bụla. Ma gịnị na-eme ma ọ bụrụ na ọnụọgụ nke sava ịchọrọ ịmepụta dabere na mmepụta nke ụfọdụ akụ? Iji gosi nke a, ụzọ kacha mfe bụ iji random_integer akụ, nke, dị ka aha na-egosi, weghachiri a random integer:
resource "random_integer" "num_instances" {
min = 1
max = 3
}
Koodu a na-ewepụta nọmba random n'etiti 1 na 3. Ka anyị hụ ihe ga-eme ma ọ bụrụ na anyị nwaa iji mmepụta nke akụ a na ọnụọgụgụ nke aws_instance akụ:
Ọ bụrụ na ị na-eme atụmatụ terraform na koodu a, ị ga-enweta njehie a:
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.
Terraform chọrọ ka agụọ ọnụ na maka_onye ọ bụla ga-agbakọ n'oge a na-eme atụmatụ, tupu emee ma ọ bụ gbanwee akụrụngwa ọ bụla. Nke a pụtara na ọnụ na maka_ọ bụla nwere ike na-ezo aka na nkịtị, mgbanwe, isi mmalite data, na ọbụna ndepụta ihe onwunwe (ọ bụrụhaala na ogologo ha nwere ike ikpebi na oge nhazi oge), ma ọ bụghị gbakọọ akụ mmepụta variables.
gụọ na maka_ọ bụla enweghị ike iji na nhazi modul
Otu ụbọchị enwere ike ịnwa gị ịgbakwunye paramita ọnụọgụ na nhazi modul gị:
Koodu a na-anwa iji ịgụta n'ime modul mepụta nnomi atọ nke akụrụngwa webụsaịtị-ụyọkọ. Ma ọ bụ ị nwere ike ime ka ijikọ modul nhọrọ dabere na ụfọdụ ọnọdụ Boolean site na ịtọ ntọala ọnụ ya na 0. Nke a nwere ike ịdị ka koodu ezi uche dị na ya, mana ị ga-enweta njehie a mgbe ị na-eme atụmatụ terraform:
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.
Ọ dị nwute, dịka nke Terraform 0.12.6, anaghị akwado iji ọnụ ọgụgụ ma ọ bụ maka_ọ bụla na akụrụngwa modul. Dabere na ndetu ntọhapụ Terraform 0.12 (http://bit.ly/3257bv4), HashiCorp na-ezube ịgbakwunye ikike a n'ọdịniihu, yabụ dabere na mgbe ị gụrụ akwụkwọ a, ọ nwere ike ịdị adị. Iji chọpụta nke ọma, gụọ Terraform changelog ebe a.
Mmachi nke ntinye oge nkwụsị efu efu
Iji create_before_destroy ngọngọ jikọtara ya na ASG bụ nnukwu ngwọta maka ịmepụta oge nkwụsịtụ efu, ma e wezụga otu caveat: akwadoghị iwu autoscaling. Ma ọ bụ ka ọ bụrụ nke ziri ezi, nke a na-emegharị nha ASG azụ na min_size na ntinye ọ bụla, nke nwere ike ịbụ nsogbu ma ọ bụrụ na ị na-eji iwu autoscaling na-amụba ọnụ ọgụgụ nke sava na-agba ọsọ.
Dịka ọmụmaatụ, modul webserver-cluster nwere ụzọ akụrụngwa aws_autoscaling_schedule, nke na elekere itoolu nke ụtụtụ na-abawanye ọnụọgụ nke sava na ụyọkọ ahụ site na abụọ ruo iri. Ọ bụrụ na ibuga na, sịnụ, 9 am, ASG ọhụrụ ga-eji naanị sava abụọ bulite karịa iri ma nọrọ n'ụzọ ahụ ruo elekere 11 nke ụtụtụ n'echi ya.
Enwere ike wezuga mmachi a n'ọtụtụ ụzọ.
Gbanwee usoro nlọghachi azụ na aws_autoscaling_schedule site na 0 9 * * * ("na-agba na elekere 9 nke ụtụtụ") ka ọ bụrụ ihe dịka 0-59 9-17 * * * ("na-agba ọsọ kwa nkeji site na 9 ụtụtụ ruo 5 pm"). Ọ bụrụ na ASG enweelarị sava iri, na-agba ọsọ iwu autoscaling ọzọ agaghị agbanwe ihe ọ bụla, nke bụ ihe anyị chọrọ. Mana ọ bụrụ na etinyere ASG n'oge na-adịbeghị anya, iwu a ga-ahụ na n'ime nkeji kacha karịa ọnụọgụ nke sava ya ga-eru iri. Nke a abụghị ụzọ mara mma kpamkpam, na nnukwu jumps site na iri gaa na sava abụọ na azụ nwekwara ike ịkpata nsogbu maka ndị ọrụ.
Mepụta edemede omenala nke na-eji AWS API iji chọpụta ọnụọgụ nke sava na-arụ ọrụ na ASG, kpọọ ya site na iji isi iyi data mpụga (lee "Isi Data Mpụga" na ibe 249), wee tọọ paramita_ike ASG chọrọ na uru nke eweghachiri. edemede ahụ. N'ụzọ dị otú a, ihe atụ ASG ọhụrụ ọ bụla ga-agba ọsọ mgbe niile n'otu ikike dị ka koodu Terraform dị ugbu a ma mee ka ọ sie ike ịnọgide na-enwe.
N'ezie, Terraform gaara enwe nkwado nkwado maka mbugharị oge efu, mana dịka nke Mee 2019, ndị otu HashiCorp enweghị atụmatụ ịgbakwunye ọrụ a.nkọwa - ebe a).
Enwere ike mejuputa atụmatụ ziri ezi nke ọma
Mgbe ụfọdụ, iwu atụmatụ na-ewepụta atụmatụ mbugharị zuru oke, mana iwu etinyere na-eweghachi mperi. Gbalịa, dịka ọmụmaatụ, tinye akụrụngwa aws_iam_user n'otu aha ahụ ị jiri maka onye ọrụ IAM nke ị mepụtara na mbụ n'Isi nke 2:
resource "aws_iam_user" "existing_user" {
# Подставьте сюда имя уже существующего пользователя IAM,
# чтобы попрактиковаться в использовании команды terraform import
name = "yevgeniy.brikman"
}
Ugbu a, ọ bụrụ na ị na-agba ọsọ iwu atụmatụ, Terraform ga-ewepụta atụmatụ mbugharị nke yiri ezi uche:
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.
Ọ bụrụ n’ịgbara iwu itinye, ị ga-enweta njehie a:
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" {
Nsogbu, n'ezie, bụ na onye ọrụ IAM nwere aha ahụ adịlarị. Nke a nwere ike ime ọ bụghị naanị ndị ọrụ IAM, mana ọ fọrọ nke nta ka ọ bụrụ akụrụngwa ọ bụla. Ọ ga-ekwe omume na mmadụ jiri aka ya mepụta akụrụngwa a ma ọ bụ jiri ahịrị iwu, mana n'ụzọ ọ bụla, ID dakọtara na-eduga na esemokwu. Enwere ọtụtụ ọdịiche nke njehie a na-ejidekarị ndị ọhụrụ na Terraform na mberede.
Isi ihe bụ na iwu atụmatụ terraform na-eburu n'uche akụrụngwa ndị akọwapụtara na faịlụ steeti Terraform. Ọ bụrụ na emepụtara akụrụngwa n'ụzọ ọzọ (dịka ọmụmaatụ, iji aka site na ịpị na njikwa AWS), ha agaghị ejedebe na faịlụ steeti ya mere Terraform agaghị eburu ha n'uche mgbe ị na-eme atụmatụ atụmatụ. N'ihi ya, atụmatụ nke yiri ihe ziri ezi na nlele mbụ ga-apụta na ọ gaghị aga nke ọma.
Enwere ihe abụọ a ga-amụta na nke a.
Ọ bụrụ na ịmalitelarị ịrụ ọrụ na Terraform, ejila ihe ọ bụla ọzọ. Ọ bụrụ na ejiri Terraform jikwaa akụkụ nke akụrụngwa gị, ị nweghịzi ike iji aka gbanwee ya. Ma ọ bụghị ya, ọ bụghị naanị na ị ga-etinye ihe ize ndụ dị egwu Terraform njehie, mana ị na-ewepụkwa ọtụtụ uru nke IaC ebe ọ bụ na koodu agaghị abụzi ihe nnọchianya ziri ezi nke akụrụngwa gị.
Ọ bụrụ na ịnweelarị akụrụngwa ụfọdụ, jiri iwu mbubata. Ọ bụrụ na ị na-amalite iji Terraform nwere akụrụngwa dị adị, ị nwere ike tinye ya na faịlụ steeti site na iji iwu mbubata terraform. N'ụzọ dị otú a, Terraform ga-amata akụrụngwa kwesịrị ijikwa ya. Iwu mbubata na-ewe arụmụka abụọ. Nke mbụ bụ adreesị akụrụngwa na faịlụ nhazi gị. Okwu syntax ebe a bụ otu maka njikọ akụrụngwa: _. (dị ka aws_iam_user.existing_user). Arụmụka nke abụọ bụ ID nke akụrụngwa a ga-ebubata. Ka anyị kwuo na ID akụrụngwa aws_iam_user bụ aha njirimara (dịka ọmụmaatụ, yevgeniy.brikman), yana ID aws_instance bụ NJ sava EC2 (dị ka i-190e22e5). A na-egosipụtakarị otu esi ebubata akụrụngwa na akwụkwọ dị n'okpuru ibe ya.
N'okpuru bụ iwu mbubata nke na-emekọrịta akụrụngwa aws_iam_user nke ị gbakwunyere na nhazi Terraform gị yana onye ọrụ IAM n'Isi nke 2 (na-anọchi aha gị maka yevgeniy.brikman, n'ezie):
Terraform ga-akpọ API AWS ka ịchọta onye ọrụ IAM gị wee mepụta njikọ faịlụ steeti n'etiti ya na aws_iam_user.existing_user resource na nhazi Terraform gị. Site ugbu a gaa n'ihu, mgbe ị na-eme atụmatụ atụmatụ, Terraform ga-ama na onye ọrụ IAM adịlarị ma ọ gaghị anwa ịmepụta ya ọzọ.
Ọ dị mma ịmara na ọ bụrụ na ịnweelarị ọtụtụ akụrụngwa ịchọrọ ibubata na Terraform, iji aka dee koodu na ibubata nke ọ bụla n'otu oge nwere ike bụrụ nsogbu. Yabụ na ọ bara uru ileba anya na ngwa dị ka Terraforming (http://terraforming.dtan4.net/), nke nwere ike ibubata koodu na steeti ozugbo site na akaụntụ AWS gị.
Refactoring nwere ike inwe ọnyà ya
Na-emegharị ahụ bụ ihe a na-emekarị na mmemme ebe ị na-agbanwe usoro ime nke koodu ahụ mgbe ị na-ahapụ àgwà mpụga na-agbanweghị agbanwe. Nke a bụ iji mee ka koodu ahụ dokwuo anya, dị mma, yana mfe idowe ya. Ntugharị bụ usoro dị mkpa nke kwesịrị iji ya eme ihe mgbe niile. Mana a bịa na Terraform ma ọ bụ ngwaọrụ IaC ọ bụla, ị ga-akpachara anya maka ihe ị na-ekwu site na “omume mpụga” nke mpempe koodu, ma ọ bụghị ya, nsogbu ndị a na-atụghị anya ya ga-ebilite.
Dịka ọmụmaatụ, ụdị ngbanwe a na-ahụkarị bụ iji ndị nwere nghọta dochie aha mgbanwe ma ọ bụ ọrụ. Ọtụtụ IDE arụnyere n'ime nkwado maka nrụpụta ma nwee ike nyegharịa mgbanwe na ọrụ na-akpaghị aka n'oge ọrụ ahụ dum. N'asụsụ mmemme izugbe, nke a bụ usoro dị ntakịrị nke ị nwere ike ị gaghị eche maka ya, mana na Terraform ị ga-akpachara anya na nke a, ma ọ bụghị na ị nwere ike ịpụpụ.
Ọmụmaatụ, modul sava-ụyọkọ nwere ihe ntinye agbanwe cluster_name:
variable "cluster_name" {
description = "The name to use for all the cluster resources"
type = string
}
Ka e were ya na ị malitere iji modul a ka ibunye microservice akpọrọ foo. Ka emechara, ịchọrọ ịnyegharị ọrụ gị aha ka ọ bụrụ mmanya. Mgbanwe a nwere ike iyi ihe na-adịghị mkpa, mana n'eziokwu ọ nwere ike ịkpata ọgba aghara ọrụ.
Nke bụ eziokwu bụ na modul sava-ụyọkọ na-eji cluster_name variable n'ọtụtụ akụrụngwa, gụnyere aha njirimara nke otu nchekwa abụọ yana ALB:
Ọ bụrụ na ị gbanwee oke aha na akụrụngwa, Terraform ga-ehichapụ ụdị ochie nke akụrụngwa ahụ wee mepụta nke ọhụrụ n'ọnọdụ ya. Mana ọ bụrụ na akụrụngwa ahụ bụ ALB, n'etiti ihichapụ ya na nbudata ụdị ọhụrụ, ị gaghị enwe usoro iji bugharịa okporo ụzọ gaa na sava weebụ gị. N'otu aka ahụ, ọ bụrụ na ehichapụrụ otu nchekwa, sava gị ga-amalite ịjụ okporo ụzọ netwọk ọ bụla ruo mgbe emepụtara otu ọhụrụ.
Ụdị mmeghari ọzọ ị nwere ike ịmasị gị bụ ịgbanwe ID Terraform. Ka anyị were akụrụngwa aws_security_group dị na modul nkesa-ụyọkọ webụ dịka ọmụmaatụ:
A na-akpọ njirimara akụrụngwa a ọmụmaatụ. Were ya na mgbe ị na-emegharị ihe, ị kpebiri ịgbanwe ya ka ọ bụrụ nke a ghọtara karịa (n'echiche gị) aha cluster_instance:
Terraform na-ejikọta NJ akụrụngwa ọ bụla na NJ onye na-eweta igwe ojii. Dịka ọmụmaatụ, ejikọrọ iam_user na ID onye ọrụ AWS IAM, yana aws_intance jikọtara ya na NJ sava AWS EC2. Ọ bụrụ na ị gbanwee ID akụrụngwa (kwuo site na ọmụmaatụ gaa na cluster_instance, dị ka ọ dị na aws_security_group), na Terraform ọ ga-adị ka a ga-asị na ị ehichapụrụ ihe ochie ma tinye nke ọhụrụ. Ọ bụrụ na itinye mgbanwe ndị a, Terraform ga-ehichapụ otu nchekwa ochie wee mepụta nke ọhụrụ, ebe sava gị na-amalite ịjụ okporo ụzọ netwọk ọ bụla.
Nke a bụ isi ihe anọ dị mkpa ị ga-ewepụ na mkparịta ụka a.
Jiri iwu atụmatụ mgbe niile. Ọ nwere ike ikpughe snags ndị a niile. Jiri nlezianya nyochaa mmepụta ya ma ṅaa ntị n'ọnọdụ ebe Terraform na-ezube ihichapụ akụrụngwa ndị o yikarịrị ka agaghị ehichapụ.
Mepụta tupu ihichapụ. Ọ bụrụ na ịchọrọ iji dochie akụrụngwa, chee echiche nke ọma ma ọ dị mkpa ka ị mepụta nnọchi tupu ihichapụ nke mbụ. Ọ bụrụ na azịza ya bụ ee, create_before_destroy nwere ike inye aka. Enwere ike nweta otu nsonaazụ ahụ na aka site n'ime usoro abụọ: buru ụzọ tinye ihe ọhụrụ na nhazi ma mee iwu ntinye, wee wepụ ihe ochie ochie na nhazi ma jiri iwu tinye ọzọ.
Ịgbanwe njirimara chọrọ mgbanwe steeti. Ọ bụrụ na ịchọrọ ịgbanwe NJ ejikọtara na akụrụngwa (dịka ọmụmaatụ, nyegharịa aws_security_group site na ọmụmaatụ gaa na cluster_intance) na-ehichapụghị akụrụngwa yana imepụta ụdị ọhụrụ ya, ị ga-emelite faịlụ steeti Terraform otu a. Emela nke a na aka gị - jiri iwu steeti terraform kama. Mgbe ị na-atụgharị aha njirimara, ị ga-agba ọsọ iwu mv steeti terraform, nke nwere syntax ndị a:
terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>
ORIGINAL_REFERENCE bụ okwu na-ezo aka na akụrụngwa n'ụdị ọ dị ugbu a, na NEW_REFERENCE bụ ebe ịchọrọ ịkwaga ya. Dịka ọmụmaatụ, mgbe ị na-atụgharị aha ndị otu aw_security_group site na ọmụmaatụ gaa na cluster_instance, ị ga-emerịrị iwu a:
$ terraform state mv
aws_security_group.instance
aws_security_group.cluster_instance
Nke a na-agwa Terraform na steeti e jikọtara ya na aws_security_group.intance ga-ejikọta ya na aws_security_group.cluster_instance. Ọ bụrụ na mgbe renaming na-agba ọsọ a iwu terraform atụmatụ egosighi mgbanwe ọ bụla, mgbe ahụ i mere ihe niile n'ụzọ ziri ezi.
Enweghị ike ịgbanwe ntọala ụfọdụ. Paragraf nke ọtụtụ akụrụngwa anaghị agbanwe agbanwe. Ọ bụrụ n’ịgbalị ịgbanwe ha, Terraform ga-ehichapụ akụrụngwa ochie wee mepụta nke ọhụrụ n’ọnọdụ ya. Ibe akụrụngwa ọ bụla ga-egosipụtakarị ihe na-eme mgbe ị gbanwere otu ntọala, yabụ hụ na ịlele akwụkwọ ahụ. Jiri iwu atụmatụ mgbe niile wee tụlee iji atụmatụ create_before_destroy.
Nkwekọrịta echere na-agbanwe agbanwe... yana nbigharị
API ụfọdụ ndị na-eweta ígwé ojii, dị ka AWS, na-ejikọtaghị ọnụ ma egbuola oge nkwụsi ike. Asynchony pụtara na interface ahụ nwere ike weghachi nzaghachi ozugbo na-echeghị ka emechara ihe a rịọrọ. Nkwekọrịta na-egbu oge pụtara na mgbanwe nwere ike iwepụta oge ịgbasa n'ime usoro; ka nke a na-eme, nzaghachi gị nwere ike ịbụ nke na-ekwekọghị ekwekọ yana dabere na ụdị ụdị data na-aza oku API gị.
Were ya, dịka ọmụmaatụ, na ị na-akpọ API na AWS na-arịọ ya ka o mepụta sava EC2. API ga-eweghachi nzaghachi “na-aga nke ọma” (201 Created) ihe fọrọ nke nta ka ọ bụrụ ozugbo, na-echeghị ka emee ihe nkesa n'onwe ya. Ọ bụrụ na ị na-agbalị ijikọ ya ozugbo, ọ ga-fọrọ nke nta ka ọ daa n'ihi na n'oge ahụ AWS ka na-amalite ihe onwunwe ma ọ bụ, ọzọ, ihe nkesa abanyebeghị. Ọzọkwa, ọ bụrụ na ịmee oku ọzọ iji nweta ozi gbasara ihe nkesa a, ị nwere ike ịnweta njehie (404 Not Found). Ihe bụ na ozi gbasara ihe nkesa EC2 a ka nwere ike ịgbasa na AWS niile tupu ọ dị ebe niile, ị ga-echere sekọnd ole na ole.
Mgbe ọ bụla ị na-eji API asynchronous yana nkwụsi ike umengwụ, ị ga-anwalerịrị arịrịọ gị kwa oge ruo mgbe ihe ahụ gwụchara wee gbasaa na sistemụ. N'ụzọ dị mwute, AWS SDK adịghị enye ngwá ọrụ ọ bụla dị mma maka nke a, na ọrụ Terraform na-enweta ọtụtụ ahụhụ dị ka 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
N'ikwu ya n'ụzọ ọzọ, ị mepụtara akụrụngwa (dị ka subnet) wee gbalịa nweta ụfọdụ ozi gbasara ya (dị ka ID nke subnet emepụtara ọhụrụ), Terraform enweghị ike ịchọta ya. Ọtụtụ n'ime ahụhụ ndị a (gụnyere 6813) ka edobere, mana ha ka na-etolite site n'oge ruo n'oge, ọkachasị mgbe Terraform na-agbakwunye nkwado maka ụdị akụrụngwa ọhụrụ. Nke a na-ewe iwe, mana n'ọtụtụ ọnọdụ adịghị emerụ ahụ. Mgbe ị na-agba ọsọ terraform tinye ọzọ, ihe niile kwesịrị ịrụ ọrụ, ebe ọ bụ na n'oge a, ozi ahụ agbasaworị na sistemụ.