Txij li thaum suav parameter yog teem rau tus nqi zoo li qub, cov cai no yuav ua haujlwm yam tsis muaj teeb meem: thaum koj khiav cov lus txib, nws yuav tsim peb EC2 servers. Tab sis ua li cas yog tias koj xav xa ib lub server hauv txhua qhov Availability Zone (AZ) hauv koj thaj av AWS tam sim no? Koj tuaj yeem muaj koj cov cai thauj cov npe ntawm thaj chaw los ntawm aws_availability_zones cov ntaub ntawv qhov chaw thiab tom qab ntawd voj los ntawm txhua tus thiab tsim EC2 server hauv nws siv cov suav parameter thiab array Performance index nkag:
Cov cai no tseem yuav ua haujlwm zoo, txij li cov suav tsis tuaj yeem siv cov ntaub ntawv tsis muaj teeb meem. Tab sis yuav ua li cas yog tias tus naj npawb ntawm cov servers koj xav tau los tsim nyob ntawm cov khoom tsim tawm ntawm qee qhov peev txheej? Txhawm rau ua kom pom qhov no, txoj hauv kev yooj yim tshaj plaws yog siv cov peev txheej random_integer, uas, raws li lub npe qhia, rov ua tus lej random:
resource "random_integer" "num_instances" {
min = 1
max = 3
}
Cov lej no tsim tus lej random ntawm 1 thiab 3. Cia peb pom yuav ua li cas yog tias peb sim siv cov khoom tso tawm ntawm cov peev txheej no hauv suav qhov ntsuas ntawm aws_instance peev txheej:
Yog tias koj khiav lub phiaj xwm terraform ntawm qhov chaws no, koj yuav tau txais qhov yuam kev hauv qab no:
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 xav kom suav thiab for_each raug xam thaum lub sijhawm npaj, ua ntej cov peev txheej tsim lossis hloov kho. Qhov no txhais tau hais tias suav thiab for_each tuaj yeem xa mus rau cov ntawv sau, qhov sib txawv, cov ntaub ntawv, thiab txawm tias cov npe cov peev txheej (tsuas yog lawv qhov ntev tuaj yeem txiav txim siab ntawm lub sijhawm teem sijhawm), tab sis tsis suav nrog cov peev txheej tsim tawm.
Cov cai no sim siv suav rau hauv ib qho module los tsim peb daim ntawv theej ntawm webserver-cluster resource. Lossis koj yuav xav ua kom txuas ib qho kev xaiv xaiv raws li qee qhov kev mob Boolean los ntawm kev teeb tsa nws suav qhov ntsuas rau 0. Qhov no yuav zoo li cov cai tsim nyog, tab sis koj yuav tau txais qhov yuam kev no thaum khiav cov phiaj xwm 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.
Hmoov tsis zoo, raws li ntawm Terraform 0.12.6, siv suav lossis for_each hauv cov peev txheej module tsis txaus siab. Raws li Terraform 0.12 cov ntawv tso tawm (http://bit.ly/3257bv4), HashiCorp npaj yuav ntxiv qhov peev xwm no yav tom ntej, yog li nyob ntawm thaum koj nyeem phau ntawv no, nws yuav twb muaj. Kom paub meej, nyeem Terraform changelog ntawm no.
Kev txwv ntawm Zero Downtime Deployments
Siv lub create_before_destroy thaiv ua ke nrog ASG yog ib qho kev daws teeb meem zoo rau kev tsim xoom-downtime deployments, tshwj tsis yog rau ib qho caveat: autoscaling cov cai tsis txaus siab. Los yog kom meej meej dua, qhov no rov pib dua ASG qhov loj me rov qab rau min_size ntawm txhua qhov kev xa tawm, uas tuaj yeem yog teeb meem yog tias koj tau siv cov cai autoscaling kom nce tus naj npawb ntawm cov servers khiav.
Piv txwv li, lub webserver-cluster module muaj ib khub ntawm aws_autoscaling_schedule cov peev txheej, uas thaum 9 teev sawv ntxov nce tus naj npawb ntawm servers hauv pawg los ntawm ob mus rau kaum. Yog tias koj xa mus rau, hais tias, 11 teev sawv ntxov, ASG tshiab yuav pib nrog tsuas yog ob lub servers dua li kaum thiab nyob li ntawd mus txog 9 teev sawv ntxov hnub tom qab.
Tam sim no, yog tias koj khiav lub phiaj xwm hais kom ua, Terraform yuav tso tawm ib txoj kev npaj xa tawm zoo li tsim nyog:
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.
Yog tias koj khiav cov lus txib thov koj yuav tau txais qhov yuam kev hauv qab no:
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" {
Qhov teeb meem, tau kawg, yog tias tus neeg siv IAM nrog lub npe ntawd twb muaj lawm. Thiab qhov no tuaj yeem tshwm sim tsis yog rau cov neeg siv IAM nkaus xwb, tab sis yuav luag txhua qhov chaw. Nws muaj peev xwm hais tias ib tug neeg tsim cov peev txheej no los ntawm kev siv cov kab hais kom ua, tab sis ob txoj kev, kev sib piv IDs ua rau muaj kev tsis sib haum xeeb. Muaj ntau qhov kev hloov pauv ntawm qhov yuam kev no uas feem ntau ntes cov neeg tuaj tshiab rau Terraform los ntawm kev xav tsis thoob.
Lub ntsiab lus tseem ceeb yog tias cov lus txib terraform tsuas yog siv rau hauv tus account cov peev txheej uas tau teev tseg hauv Terraform lub xeev cov ntaub ntawv. Yog tias cov peev txheej raug tsim los ntawm lwm txoj hauv kev (piv txwv li, manually los ntawm txhaj rau hauv AWS console), lawv yuav tsis xaus rau hauv lub xeev cov ntaub ntawv thiab yog li ntawd Terraform yuav tsis coj lawv mus rau hauv tus account thaum ua tiav cov phiaj xwm hais kom ua. Yog li ntawd, ib txoj kev npaj uas zoo li yog thaum xub thawj siab ib muag yuav ua tsis tiav.
Terraform yuav hu rau AWS API los nrhiav koj tus neeg siv IAM thiab tsim ib lub xeev cov ntaub ntawv koom nrog ntawm nws thiab cov ntaub ntawv aws_iam_user.existing_user hauv koj Terraform configuration. Txij no mus, thaum koj khiav cov phiaj xwm hais kom ua, Terraform yuav paub tias cov neeg siv IAM twb muaj lawm thiab yuav tsis sim tsim nws dua.
Nws yog ib qho tsim nyog sau cia tias yog tias koj twb muaj ntau yam kev pab uas koj xav import rau hauv Terraform, manually sau cov cai thiab importing txhua tus ntawm ib zaug tuaj yeem ua rau muaj teeb meem. Yog li nws tsim nyog saib rau hauv lub cuab yeej zoo li Terraforming (http://terraforming.dtan4.net/), uas tuaj yeem tuaj yeem xa cov lej thiab xeev los ntawm koj tus account AWS.
Refactoring tuaj yeem muaj nws qhov pitfalls
Refactoring yog ib qho kev coj ua hauv kev ua haujlwm uas koj hloov cov qauv sab hauv ntawm cov cai thaum tawm hauv tus cwj pwm sab nraud tsis hloov. Qhov no yog ua kom cov cai meej dua, zoo dua, thiab yooj yim rau kev tswj hwm. Refactoring yog cov txheej txheem tseem ceeb uas yuav tsum tau siv tsis tu ncua. Tab sis thaum nws los txog rau Terraform lossis lwm yam cuab yeej IaC, koj yuav tsum tau ceev faj heev txog qhov koj txhais tau li cas los ntawm "kev coj tus cwj pwm sab nraud" ntawm ib daim code, txwv tsis pub muaj teeb meem npaj txhij txog yuav tshwm sim.
Piv txwv li, ib hom kev refactoring feem ntau yog hloov cov npe ntawm cov hloov pauv lossis ua haujlwm nrog cov neeg nkag siab ntau dua. Ntau tus IDEs muaj kev txhawb nqa rau refactoring thiab tuaj yeem hloov npe hloov pauv thiab ua haujlwm thoob plaws hauv qhov project. Hauv cov hom phiaj dav dav ntawm cov lus programming, qhov no yog cov txheej txheem tsis tseem ceeb uas koj yuav tsis xav txog, tab sis hauv Terraform koj yuav tsum tau ceev faj heev nrog qhov no, txwv tsis pub koj yuav ntsib teeb meem.
variable "cluster_name" {
description = "The name to use for all the cluster resources"
type = string
}
Xav txog tias koj pib siv qhov module no los siv lub microservice hu ua foo. Tom qab ntawd, koj xav hloov koj qhov kev pabcuam rau bar. Qhov kev hloov pauv no yuav zoo li tsis tseem ceeb, tab sis qhov tseeb nws tuaj yeem ua rau muaj kev cuam tshuam kev pabcuam.
Qhov tseeb yog tias lub webserver-cluster module siv lub cluster_name hloov pauv hauv ntau cov peev txheej, suav nrog lub npe parameter ntawm ob pawg kev ruaj ntseg thiab ALB:
$ terraform state mv
aws_security_group.instance
aws_security_group.cluster_instance
Qhov no qhia Terraform tias lub xeev uas yav dhau los cuam tshuam nrog aws_security_group.instance yuav tsum tam sim no koom nrog aws_security_group.cluster_instance. Yog tias tom qab renaming thiab khiav qhov kev hais kom ua terraform txoj kev npaj tsis qhia qhov hloov pauv, ces koj tau ua txhua yam kom raug.
Qee tus neeg muab kev pabcuam huab 'APIs, xws li AWS, yog asynchronous thiab muaj kev ncua sijhawm. Asynchrony txhais tau hais tias lub interface tuaj yeem rov qab teb tam sim yam tsis tau tos rau qhov kev thov kom ua tiav. Kev ncua tsis tu ncua txhais tau hais tias kev hloov pauv yuav siv sijhawm los nthuav tawm thoob plaws hauv lub cev; thaum qhov no tshwm sim, koj cov lus teb yuav tsis sib haum thiab nyob ntawm qhov twg cov ntaub ntawv replica teb rau koj qhov kev hu API.
Xav txog, piv txwv li, koj ua API hu rau AWS thov kom nws tsim EC2 server. API yuav rov qab "ua tiav" cov lus teb (201 Tsim) yuav luag tam sim ntawd, tsis tas tos rau lub server nws tus kheej tsim. Yog tias koj sim txuas mus rau tam sim ntawd, nws yuav luag tsis ua haujlwm vim tias thaum lub sijhawm ntawd AWS tseem tab tom pib cov peev txheej lossis, hloov pauv, lub server tseem tsis tau pib. Ntxiv mus, yog tias koj hu rau lwm tus kom tau txais cov ntaub ntawv hais txog tus neeg rau zaub mov no, koj tuaj yeem tau txais qhov yuam kev (404 Tsis Pom). Qhov tseeb yog tias cov ntaub ntawv hais txog EC2 server no tseem tuaj yeem nthuav tawm thoob plaws AWS ua ntej nws muaj nyob txhua qhov chaw, koj yuav tsum tau tos ob peb feeb.
Thaum twg koj siv asynchronous API nrog tub nkeeg tsis xws luag, koj yuav tsum rov sim koj qhov kev thov kom txog thaum qhov kev txiav txim tiav thiab nthuav tawm los ntawm lub kaw lus. Hmoov tsis zoo, AWS SDK tsis muab cov cuab yeej zoo rau qhov no, thiab Terraform project tau siv los ntawm ntau cov kab laum zoo li 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
Hauv lwm lo lus, koj tsim cov peev txheej (xws li subnet) thiab tom qab ntawd sim kom tau txais qee cov ntaub ntawv hais txog nws (xws li ID ntawm subnet tshiab tsim), thiab Terraform nrhiav tsis tau. Feem ntau ntawm cov kab no (xws li 6813) tau kho, tab sis lawv tseem qoob loo los ntawm ib ntus, tshwj xeeb tshaj yog thaum Terraform ntxiv kev txhawb nqa rau hom kev pab tshiab. Qhov no yog kev ntxhov siab, tab sis feem ntau tsis ua rau muaj kev phom sij. Thaum koj siv terraform dua, txhua yam yuav tsum ua haujlwm, txij li lub sijhawm no cov ntaub ntawv yuav tau nthuav dav thoob plaws hauv lub system.