Nā lua o ka Terraform

Nā lua o ka Terraform
E hōʻike aku i kekahi mau pōʻino, me nā mea e pili ana i nā puka lou, inā nā ʻōlelo a me nā ʻenehana hoʻolālā, a me nā pilikia nui e pili ana iā Terraform ma ka laulā:

  • he mau palena ka helu a me no_each;
  • kau palena ʻole i ka hoʻolaha ʻana i ka wā hoʻomaha;
  • hiki i ka hoʻolālā maikaʻi ke hāʻule;
  • hiki i ka refactoring ke loaʻa kona mau pilikia;
  • kūlike ka hoʻopaneʻe ʻana... me ka hoʻopaneʻe.

He mau palena ka helu a me no_each

Hoʻohana nui nā laʻana ma kēia mokuna i ka ʻāpana helu a me ka ʻōlelo for_each i loko o nā puka lou a me nā loina kūlana. Hana maikaʻi lākou, akā ʻelua mau palena koʻikoʻi āu e pono ai e ʻike.

  • ʻAʻole hiki i ka helu a no_kekahi ke kuhikuhi i nā ʻano hoʻololi waiwai.
  • ʻAʻole hiki ke hoʻohana ʻia ka helu a no_kekahi i ka hoʻonohonoho module.

ʻAʻole hiki i ka helu a no_each ke kuhikuhi i nā ʻano hoʻololi waiwai

E noʻonoʻo pono ʻoe e kau i nā kikowaena EC2 a no kekahi kumu ʻaʻole makemake ʻoe e hoʻohana i ka ASG. Penei paha kāu code:

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

E nana pakahi aku kakou.

No ka mea ua hoʻonohonoho ʻia ka helu helu i kahi waiwai static, e hana kēia code me ka pilikia ʻole: ke holo ʻoe i ke kauoha noi, e hana ia i ʻekolu mau kikowaena EC2. Akā pehea inā makemake ʻoe e hoʻonoho i hoʻokahi kikowaena i kēlā me kēia Availability Zone (AZ) i loko o kāu ʻāina AWS o kēia manawa? Hiki iā ʻoe ke hoʻouka i kāu code i kahi papa inoa o nā ʻāpana mai ka aws_availability_zones kumu ʻikepili a laila e hoʻopaʻa i kēlā me kēia a hana i kahi kikowaena EC2 i loko me ka hoʻohana ʻana i ka helu helu a me ke komo ʻana i ka helu helu helu:

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" {}

E hana maikaʻi ana kēia code, no ka mea hiki i ka helu helu ke kuhikuhi i nā kumu ʻikepili me ka pilikia ʻole. Akā he aha ka hopena inā pili ka helu o nā kikowaena āu e hana ai i ka hoʻopuka ʻana o kekahi kumuwaiwai? No ka hōʻike ʻana i kēia, ʻo ke ala maʻalahi ka hoʻohana ʻana i ka punawai random_integer, e like me ka manaʻo o ka inoa, e hoʻihoʻi i kahi integer random:

resource "random_integer" "num_instances" {
  min = 1
  max = 3
}

Hoʻopuka kēia code i kahi helu maʻamau ma waena o 1 a me 3. E ʻike kākou i ka hopena inā hoʻāʻo mākou e hoʻohana i ka pukana o kēia kumuwaiwai ma ka helu helu o ka aws_instance resource:

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

Inā holo ʻoe i ka hoʻolālā terraform ma kēia code, e loaʻa iā ʻoe kēia hewa:

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.

Pono ʻo Terraform e helu ʻia ka helu a no_kekahi i ka wā o ka hoʻolālā, ma mua o ka hana ʻana a hoʻololi ʻia paha nā kumuwaiwai. 'O ia ho'i, hiki i ka helu a no_each ke kuhikuhi i nā hua'ōlelo, nā mea ho'ololi, nā kumu 'ikepili, a me nā papa inoa waiwai (inā lō'ihi ka lō'ihi e hiki ke ho'oholo 'ia i ka manawa ho'onohonoho), akā, 'a'ole i ka helu 'ana i nā mea ho'ololi waiwai.

ʻAʻole hiki ke hoʻohana ʻia ka helu a no_kekahi i ka hoʻonohonoho module

I kekahi lā e hoʻowalewale ʻia ʻoe e hoʻohui i kahi ʻāpana helu i kāu hoʻonohonoho module:

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

     count = 3

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

Ke hoʻāʻo nei kēia code e hoʻohana i ka helu i loko o kahi module e hana i ʻekolu kope o ka punawai pūnaewele pūnaewele-cluster. A i ʻole makemake paha ʻoe e hoʻohui i kahi module ma muli o kekahi kūlana Boolean ma ka hoʻonohonoho ʻana i kāna ʻāpana helu i 0. Me he code kūpono paha kēia, akā e loaʻa iā ʻoe kēia kuhi ke holo ʻana i ka hoʻolālā 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.

ʻO ka mea pōʻino, ʻo Terraform 0.12.6, ʻaʻole kākoʻo ʻia ka hoʻohana ʻana i ka helu a i ʻole for_each i loko o kahi kumuwaiwai module. Wahi a ka Terraform 0.12 memo hoʻokuʻu (http://bit.ly/3257bv4), hoʻolālā ʻo HashiCorp e hoʻohui i kēia hiki i ka wā e hiki mai ana, no laila e pili ana i ka wā e heluhelu ai ʻoe i kēia puke, aia paha ia. No ka ike maopopo ana, heluhelu i ka Terraform changelog maanei.

Nā palena o nā hoʻolālā Zero Downtime

ʻO ka hoʻohana ʻana i ka poloka create_before_destroy i hui pū ʻia me ASG he hopena maikaʻi loa ia no ka hoʻokumu ʻana i nā deployments zero-downtime, koe wale nō hoʻokahi caveat: ʻaʻole kākoʻo ʻia nā lula autoscaling. A i ʻole e ʻoi aku ka pololei, hoʻihoʻi kēia i ka nui ASG i min_size i kēlā me kēia hoʻolālā, hiki ke pilikia inā ʻoe e hoʻohana ana i nā lula autoscaling e hoʻonui i ka helu o nā kikowaena e holo nei.

No ka laʻana, loaʻa i ka module webserver-cluster ʻelua mau kumuwaiwai aws_autoscaling_schedule, ma ka hola 9 am e hoʻonui ai i ka helu o nā kikowaena i ka hui mai ʻelua a ʻumi. Inā ʻoe e hoʻolaha i ka hola 11 a.m., e hoʻomaka ka ASG hou me ʻelua mau kikowaena ma mua o ka ʻumi a noho ma ia ala a hiki i ka hola 9 a.m. o ka lā aʻe.

Hiki ke kaʻe ʻia kēia palena ma nā ʻano he nui.

  • E hoʻololi i ka palena hoʻihoʻi ma aws_autoscaling_schedule mai 0 9 * * * ("holo ma 9 am") i mea like me 0-59 9-17 * * * ("holo i kēlā me kēia minuke mai 9 am a 5 pm"). Inā loaʻa iā ASG he ʻumi mau kikowaena, ʻaʻole e hoʻololi hou i kēia lula autoscaling, ʻo ia kā mākou makemake. Akā inā i kau ʻia ka ASG i kēia manawa, e hōʻoia kēia lula i ka lōʻihi o ka minuke e hiki i ka helu o kāna mau kikowaena i ka ʻumi. ʻAʻole kēia he ala nani loa, a ʻo ka lele nui ʻana mai ka ʻumi a ʻelua mau kikowaena a i hope hiki ke hoʻopilikia i nā mea hoʻohana.
  • E hana i palapala maʻamau e hoʻohana ana i ka AWS API no ka hoʻoholo ʻana i ka heluna o nā kikowaena hana ma ka ASG, e kāhea iā ia me ka hoʻohana ʻana i kahi kumu ʻikepili waho (e ʻike i ka "Kumu ʻIke Kūwaho" ma ka ʻaoʻao 249), a hoʻonoho i ka ʻāpana makemake_capacity o ka ASG i ka waiwai i hoʻihoʻi ʻia e ka palapala. Ma kēia ala, e holo mau ana kēlā me kēia hihia ASG hou i ka mana like me ka code Terraform i loaʻa a paʻakikī loa ka mālama ʻana.

ʻOiaʻiʻo, ʻo Terraform ka mea i kūkulu ʻia i ke kākoʻo no ka zero-downtime deployments, akā mai Mei 2019, ʻaʻohe manaʻo o ka hui HashiCorp e hoʻohui i kēia hana (kikoʻī - maanei).

Hiki ʻole ke hoʻokō pono ʻia ka papahana kūpono

I kekahi manawa, hoʻopuka ke kauoha hoʻolālā i kahi hoʻolālā hoʻolālā kūpono, akā hoʻihoʻi ke kauoha noi i kahi hewa. E ho'āʻo, no ka laʻana, e hoʻohui i ka punawai aws_iam_user me ka inoa like āu i hoʻohana ai no ka mea hoʻohana IAM āu i hana ai ma mua ma ka Mokuna 2:

resource "aws_iam_user" "existing_user" {
   # Подставьте сюда имя уже существующего пользователя IAM,
   # чтобы попрактиковаться в использовании команды terraform import
   name = "yevgeniy.brikman"
}

I kēia manawa, inā e holo ʻoe i ke kauoha hoʻolālā, e hoʻopuka ʻo Terraform i kahi hoʻolālā hoʻolālā kūpono.

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.

Inā holo ʻoe i ke kauoha noi e loaʻa iā ʻoe kēia hewa:

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 ka pilikia, ʻoiaʻiʻo, aia kahi mea hoʻohana IAM me kēlā inoa. A hiki i kēia ke hana ʻaʻole i nā mea hoʻohana IAM wale nō, akā kokoke i nā kumuwaiwai. Hiki paha i kekahi ke hana i kēia kumuwaiwai me ka lima a i ʻole ka hoʻohana ʻana i ka laina kauoha, akā i kēlā me kēia ʻaoʻao, alakaʻi nā ID pili i nā paio. Nui nā ʻano like ʻole o kēia hewa e hopu pinepine ai i nā mea hou i Terraform me ka pīhoihoi.

ʻO ka mea nui, ʻo ke kauoha hoʻolālā terraform wale nō e noʻonoʻo i kēlā mau kumuwaiwai i kuhikuhi ʻia ma ka faila state Terraform. Inā hana ʻia nā kumuwaiwai ma kekahi ʻano ʻē aʻe (e like me ke kaomi lima ʻana i ka console AWS), ʻaʻole lākou e pau i ka faila mokuʻāina a no laila ʻaʻole e noʻonoʻo ʻo Terraform iā lākou i ka wā e hoʻokō ai i ke kauoha hoʻolālā. ʻO ka hopena, ʻo kahi hoʻolālā i manaʻo ʻia he pololei i ka nānā mua ʻana e lilo i mea kūleʻa ʻole.

ʻElua mau haʻawina e aʻo ʻia mai kēia.

  • Inā ua hoʻomaka ʻoe e hana me Terraform, mai hoʻohana i kekahi mea ʻē aʻe. Inā mālama ʻia kahi ʻāpana o kāu ʻoihana me Terraform, ʻaʻole hiki iā ʻoe ke hoʻololi hou iā ia me ka lima. A i ʻole, ʻaʻole ʻoe e pilikia wale i nā hewa Terraform ʻē aʻe, akā ke hōʻole nei ʻoe i nā pono he nui o IaC no ka mea ʻaʻole e lilo ke code i hōʻike pololei o kāu ʻoihana.
  • Inā loaʻa iā ʻoe kekahi mau ʻōnaehana, e hoʻohana i ke kauoha import. Inā hoʻomaka ʻoe e hoʻohana i ka Terraform me nā ʻenehana i loaʻa, hiki iā ʻoe ke hoʻohui iā ia i ka faila mokuʻāina me ka hoʻohana ʻana i ke kauoha terraform import. Ma kēia ala e ʻike ai ʻo Terraform i nā ʻōnaehana pono e mālama ʻia. ʻElua manaʻo hoʻopaʻapaʻa i ke kauoha import. ʻO ka mua, ʻo ia ka helu wahi i kāu mau faila hoʻonohonoho. Ua like ka syntax ma aneʻi me nā loulou kumuwaiwai: _. (e like me aws_iam_user.existing_user). ʻO ka pane ʻelua, ʻo ia ka ID o ka waiwai e lawe ʻia mai. E ʻōlelo kākou ʻo ka ID kumu aws_iam_user ka inoa mea hoʻohana (no ka laʻana, yevgeniy.brikman), a ʻo ka ID kumu waiwai aws_instance ʻo ia ka ID server EC2 (e like me i-190e22e5). Hōʻike pinepine ʻia ke ʻano o ka lawe ʻana i kahi kumuwaiwai ma ka palapala ma lalo o kāna ʻaoʻao.

    Aia ma lalo kahi kauoha hoʻokomo e hoʻohui i ka aws_iam_user kumu waiwai āu i hoʻohui ai i kāu hoʻonohonoho Terraform me ka mea hoʻohana IAM ma ka Mokuna 2 (e hoʻololi i kou inoa no yevgeniy.brikman, ʻoiaʻiʻo):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    E kāhea ʻo Terraform i ka AWS API no ka ʻimi ʻana i kāu mea hoʻohana IAM a hana i kahi hui waihona mokuʻāina ma waena o ia a me ka kumu aws_iam_user.existing_user i kāu hoʻonohonoho Terraform. Mai kēia manawa, ke holo nei ʻoe i ke kauoha hoʻolālā, e ʻike ʻo Terraform aia ka mea hoʻohana IAM a ʻaʻole ia e hoʻāʻo e hana hou.

    He mea pono e hoʻomaopopo inā loaʻa iā ʻoe nā kumuwaiwai he nui āu e makemake ai e hoʻokomo i loko o Terraform, hiki ke paʻakikī ke kākau lima i ke code a me ka lawe ʻana i kēlā me kēia i ka manawa. No laila, pono e nānā i kahi mea hana e like me Terraforming (http://terraforming.dtan4.net/), hiki iā ia ke hoʻokomo i ka code a me ka mokuʻāina mai kāu moʻokāki AWS.

    Hiki i ka refactoring ke loaʻa kona mau pilikia

    Hana hou He hana maʻamau i ka papahana kahi e hoʻololi ai ʻoe i ke ʻano o loko o ke code me ka waiho ʻole ʻana i ke ʻano o waho. ʻO kēia ka mea e maʻalahi ai ke code, maʻemaʻe a maʻalahi hoʻi ka mālama ʻana. ʻO ka refactoring kahi ʻano hana pono e hoʻohana mau ʻia. Akā i ka hiki ʻana iā Terraform a i ʻole kekahi mea hana IaC ʻē aʻe, pono ʻoe e makaʻala loa i ka mea āu e manaʻo ai e ka "hana waho" o kahi ʻāpana code, i ʻole e ala mai nā pilikia i manaʻo ʻole ʻia.

    No ka laʻana, ʻo kahi ʻano refactoring maʻamau ke hoʻololi nei i nā inoa o nā mea hoʻololi a i ʻole nā ​​​​hana me nā mea i hoʻomaopopo ʻia. Nui nā IDE i kākoʻo no ka refactoring a hiki ke hoʻololi hou i nā mea hoʻololi a me nā hana i loko o ka papahana. Ma nā ʻōlelo hoʻolālā maʻamau, he kaʻina hana liʻiliʻi kēia āu e noʻonoʻo ʻole ai, akā ma Terraform pono ʻoe e makaʻala loa i kēia, i ʻole e ʻike paha ʻoe i nā outages.

    No ka laʻana, loaʻa i ka module webserver-cluster kahi hoʻololi cluster_name:

    variable "cluster_name" {
       description = "The name to use for all the cluster resources"
       type          = string
    }

    E noʻonoʻo ʻoe ua hoʻomaka ʻoe e hoʻohana i kēia module e kau i kahi microservice i kapa ʻia ʻo foo. Ma hope, makemake ʻoe e hoʻololi i kāu lawelawe i bar. He mea liʻiliʻi paha kēia hoʻololi, akā ma ka ʻoiaʻiʻo hiki ke hoʻopilikia i ka lawelawe.

    ʻO ka ʻoiaʻiʻo ka hoʻohana ʻana o ka module webserver-cluster i ka cluster_name variable i kekahi mau kumuwaiwai, e komo pū me ka inoa inoa o nā pūʻulu palekana ʻelua a me ka 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]
    }

    Inā hoʻololi ʻoe i ka palena inoa ma kahi kumuwaiwai, e holoi ʻo Terraform i ka mana kahiko o ia kumuwaiwai a hana i kahi mea hou ma kona wahi. Akā inā he ALB kēlā punawai, ma waena o ka holoi ʻana iā ia a me ka hoʻoiho ʻana i kahi mana hou, ʻaʻole ʻoe e loaʻa kahi hana e hoʻihoʻi hou i ke kaʻa i kāu kikowaena pūnaewele. Pēlā nō, inā holoi ʻia kahi pūʻulu palekana, e hoʻomaka ana kāu mau kikowaena e hōʻole i nā kaʻa pūnaewele a hiki i ka hana ʻana o kahi hui hou.

    ʻO kekahi ʻano refactoring āu e makemake ai e hoʻololi i ka Terraform ID. E lawe kākou i ka waiwai aws_security_group i loko o ka webserver-cluster module ma ke ʻano he laʻana:

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

    Ua kapa ʻia ka mea ʻike o kēia kumuwaiwai. E noʻonoʻo ʻoe i ka wā refactoring ua hoʻoholo ʻoe e hoʻololi iā ia i kahi inoa maʻalahi (i kou manaʻo) cluster_instance:

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

    He aha ka hopena i ka hopena? Pololei: he hoʻohaunaele.

    Hoʻopili ʻo Terraform i kēlā me kēia ID kumuwaiwai me ka ID mea hāʻawi kapua. No ka laʻana, pili ʻo iam_user me ka ID mea hoʻohana AWS IAM, a pili ʻo aws_instance me ka ID server AWS EC2. Inā hoʻololi ʻoe i ka ID kumu waiwai (e ʻōlelo mai ka laʻana i cluster_instance, e like me ka hihia me aws_security_group), iā Terraform e ʻike ʻia me he mea lā ua holoi ʻoe i ka punawai kahiko a hoʻohui i kahi mea hou. Inā hoʻohana ʻoe i kēia mau hoʻololi, e hoʻopau ʻo Terraform i ka pūʻulu palekana kahiko a hana i kahi mea hou, ʻoiai e hoʻomaka ana kāu mau kikowaena e hōʻole i nā kaʻa pūnaewele.

    Eia nā haʻawina koʻikoʻi ʻehā āu e lawe ai mai kēia kūkākūkā ʻana.

    • E hoʻohana mau i ke kauoha hoʻolālā. Hiki iā ia ke hōʻike i kēia mau pilikia a pau. E noʻonoʻo pono i kāna mea hoʻopuka a nānā i nā kūlana kahi e hoʻolālā ai ʻo Terraform e holoi i nā kumuwaiwai ʻaʻole pono e holoi ʻia.
    • E hana ma mua o kou holoi ʻana. Inā makemake ʻoe e pani i kahi kumuwaiwai, e noʻonoʻo pono inā pono ʻoe e hana i kahi pani ma mua o ka holoi ʻana i ka mea kumu. Inā ʻae ka pane, hiki iā create_before_destroy ke kōkua. Hiki ke loaʻa ka hopena like me ka lima ma ka hana ʻana i ʻelua mau ʻanuʻu: hoʻohui mua i kahi kumuwaiwai hou i ka hoʻonohonoho a holo i ke kauoha noi, a laila wehe i ka punawai kahiko mai ka hoʻonohonoho ʻana a hoʻohana hou i ke kauoha noi.
    • Pono ka hoʻololi ʻana i nā mea hōʻike. Inā makemake ʻoe e hoʻololi i ka ID e pili ana i kahi kumuwaiwai (e laʻa, hoʻololi i ka inoa aws_security_group mai ka laʻana i cluster_instance) me ka ʻole e holoi i ka punawai a hana i kahi mana hou o ia mea, pono ʻoe e hoʻololi i ka faila state Terraform e like me ia. Mai hana lima i kēia - e hoʻohana i ke kauoha mokuʻāina terraform. Ke hoʻololi hou i nā mea ʻike, pono ʻoe e holo i ke kauoha terraform state mv, nona kēia syntax:
      terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>

      ʻO ORIGINAL_REFERENCE kahi ʻōlelo e pili ana i ka punawai ma kona ʻano o kēia manawa, a ʻo NEW_REFERENCE kahi āu e makemake ai e neʻe. No ka laʻana, i ka hoʻololi ʻana i ka hui aws_security_group mai kahi laʻana i cluster_instance, pono ʻoe e holo i kēia kauoha:

      $ terraform state mv 
         aws_security_group.instance 
         aws_security_group.cluster_instance

      Hōʻike kēia iā Terraform e pili ana ka mokuʻāina i pili mua me aws_security_group.instance me aws_security_group.cluster_instance. Inā ma hope o ka hoʻololi ʻana a me ka holo ʻana i kēia kauoha terraform plan ʻaʻole hōʻike i nā loli, a laila ua hana pololei ʻoe i nā mea āpau.

    • ʻAʻole hiki ke hoʻololi ʻia kekahi mau hoʻonohonoho. ʻAʻole hiki ke hoʻololi i nā palena o nā kumuwaiwai he nui. Inā ho'āʻo ʻoe e hoʻololi iā lākou, e holoi ʻo Terraform i ka punawai kahiko a hana i kahi mea hou ma kona wahi. E hōʻike pinepine ʻia kēlā me kēia ʻaoʻao punawai i ka mea e hoʻololi ai i kahi hoʻonohonoho, no laila e nānā pono i ka palapala. E hoʻohana mau i ke kauoha hoʻolālā a noʻonoʻo e hoʻohana i ka hoʻolālā create_before_destroy.

    Kūlike ka hoʻopaneʻe ʻia... me ka hoʻopaneʻe

    ʻO kekahi mau API o nā mea hoʻolako kapua, e like me AWS, ʻaʻohe like ʻole a ua hoʻopaneʻe ka paʻa. Asynchrony 'o ia ho'i, hiki i ka interface ke ho'iho'i koke i ka pane me ka kali 'ole i ka hana i noi 'ia e ho'opau. ʻO ka hoʻopaneʻe ʻana, ʻo ia hoʻi, hiki i nā loli ke hoʻonui i ka manawa a puni ka ʻōnaehana; ʻOiai e hana ʻia ana kēia, ʻaʻole kūlike paha kāu mau pane a hilinaʻi ʻia i ka hoʻopiʻi kumu ʻikepili e pane ana i kāu mau kelepona API.

    E noʻonoʻo, no ka laʻana, e hana ʻoe i kahi kelepona API iā AWS e noi ana iā ia e hana i kahi kikowaena EC2. E hoʻihoʻi ka API i kahi pane "kūpono" (201 Hana ʻia) kokoke koke, me ka kali ʻole e hana ʻia ka server ponoʻī. Inā ʻoe e hoʻāʻo e hoʻopili koke iā ia, ʻaneʻane pau ʻole ia no ka mea i kēlā manawa ke hoʻomaka nei ʻo AWS i nā kumuwaiwai a i ʻole, ʻaʻole i hoʻomaka ka server. Eia kekahi, inā ʻoe e kelepona hou e kiʻi i ka ʻike e pili ana i kēia kikowaena, loaʻa paha iā ʻoe kahi hewa (404 ʻAʻole Loaʻa). ʻO ka mea, hiki ke hoʻolaha ʻia ka ʻike e pili ana i kēia kikowaena EC2 ma AWS ma mua o ka loaʻa ʻana ma nā wahi āpau, pono ʻoe e kali i kekahi mau kekona.

    I kēlā me kēia manawa āu e hoʻohana ai i kahi API asynchronous me ka palaualelo, pono ʻoe e hoʻāʻo hou i kāu noi a hiki i ka pau ʻana o ka hana a hoʻolaha i ka ʻōnaehana. ʻO ka mea pōʻino, ʻaʻole hāʻawi ka AWS SDK i nā mea hana maikaʻi no kēia, a ua hoʻohana ʻia ka papahana Terraform i ka nui o nā pōpoki e like me 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

    Ma nā huaʻōlelo ʻē aʻe, hana ʻoe i kahi kumuwaiwai (e like me kahi subnet) a laila e hoʻāʻo e kiʻi i kekahi ʻike e pili ana iā ia (e like me ka ID o ka subnet hou i hana ʻia), ʻaʻole hiki ke loaʻa iā Terraform. Ua hoʻopaʻa ʻia ka hapa nui o kēia mau pōpoki (me 6813), akā e ulu mau ana lākou i kēlā me kēia manawa, ʻoi aku ka nui o ka hoʻohui ʻana o Terraform i ke kākoʻo no kahi ʻano kumuwaiwai hou. He mea hoʻonāukiuki kēia, akā i ka hapanui o nā hihia, ʻaʻole ia e hōʻeha. Ke hoʻohana hou ʻoe i ka terraform, pono e hana nā mea a pau, no ka mea ma kēia manawa ua laha ka ʻike ma ka ʻōnaehana.

    Hōʻike ʻia kēia ʻāpana mai ka puke e Evgeniy Brikman "Terraform: ʻoihana ma ka pae code".

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka