Nga mahanga whenua

Nga mahanga whenua
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:

resource "aws_instance" "example_1" {
   count             = 3
   ami                = "ami-0c55b159cbfafe1f0"
   instance_type = "t2.micro"
}

Kia titiro takitahi ki a raatau.

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:

resource "aws_instance" "example_2" {
   count                   = length(data.aws_availability_zones.all.names)
   availability_zone   = data.aws_availability_zones.all.names[count.index]
   ami                     = "ami-0c55b159cbfafe1f0"
   instance_type       = "t2.micro"
}

data "aws_availability_zones" "all" {}

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:

resource "aws_instance" "example_3" {
   count             = random_integer.num_instances.result
   ami                = "ami-0c55b159cbfafe1f0"
   instance_type = "t2.micro"
}

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:

module "count_example" {
     source = "../../../../modules/services/webserver-cluster"

     count = 3

     cluster_name = "terraform-up-and-running-example"
     server_port = 8080
     instance_type = "t2.micro"
}

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):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    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:

    resource "aws_lb" "example" {
       name                    = var.cluster_name
       load_balancer_type = "application"
       subnets = data.aws_subnet_ids.default.ids
       security_groups      = [aws_security_group.alb.id]
    }

    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:

    resource "aws_security_group" "instance" {
      # (...)
    }

    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:

    resource "aws_security_group" "cluster_instance" {
       # (...)
    }

    Ka aha i te mutunga? E tika ana: he raruraru.

    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.

    Ko tenei waahanga i tukuna mai i te pukapuka na Evgeniy Brikman "Terraform: hanganga i te taumata waehere".

Source: will.com

Tāpiri i te kōrero