ටෙරාෆෝම් අන්තරායන්

ටෙරාෆෝම් අන්තරායන්
ප්‍රකාශන සහ යෙදවීමේ ශිල්පීය ක්‍රම මෙන්ම පොදුවේ Terraform වලට බලපාන වඩාත් පොදු ගැටළු ඇතුළුව, ලූපවලට අදාළ අන්තරායන් කිහිපයක් ඉස්මතු කරමු:

  • ගණන් කිරීම සහ for_each පරාමිති සඳහා සීමාවන් ඇත;
  • ශුන්‍ය අක්‍රීය කාල යෙදවීම් සීමා කරන්න;
  • හොඳ සැලැස්මක් පවා අසාර්ථක විය හැකිය;
  • ප්රතිනිෂ්පාදනය එහි අන්තරායන් තිබිය හැක;
  • විලම්බිත සහසම්බන්ධය අනුකූල වේ... කල් දැමීම සමග.

ගණන් කිරීම සහ for_each පරාමිති සඳහා සීමාවන් ඇත

මෙම පරිච්ඡේදයේ ඇති උදාහරණ ගණන් කිරීමේ පරාමිතිය සහ for_each ප්‍රකාශනය ලූප සහ කොන්දේසි සහිත තර්කය පුළුල් ලෙස භාවිතා කරයි. ඔවුන් හොඳින් ක්‍රියා කරයි, නමුත් ඔබට දැනගත යුතු වැදගත් සීමාවන් දෙකක් තිබේ.

  • Count සහ for_each හට කිසිදු ප්‍රතිදාන සම්පත් විචල්‍යයක් යොමු කළ නොහැක.
  • මොඩියුල වින්‍යාසය තුළ ගණන් කිරීම සහ for_each භාවිතා කළ නොහැක.

count සහ for_each හට කිසිදු සම්පත් ප්‍රතිදාන විචල්‍යයක් යොමු කළ නොහැක

ඔබට EC2 සේවාදායක කිහිපයක් යෙදවීමට අවශ්‍ය යැයි සිතන්න සහ යම් හේතුවක් නිසා ඔබට ASG භාවිතා කිරීමට අවශ්‍ය නැත. ඔබේ කේතය මේ වගේ විය හැක:

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

අපි ඒවා එකින් එක බලමු.

ගණන් කිරීමේ පරාමිතිය ස්ථිතික අගයකට සකසා ඇති බැවින්, මෙම කේතය ගැටළු නොමැතිව ක්‍රියා කරයි: ඔබ අයදුම් කිරීමේ විධානය ක්‍රියාත්මක කරන විට, එය EC2 සේවාදායකයන් තුනක් සාදනු ඇත. නමුත් ඔබගේ වර්තමාන AWS කලාපය තුළ එක් එක් ලබා ගත හැකි කලාපය (AZ) තුළ එක් සේවාදායකයක් යෙදවීමට ඔබට අවශ්‍ය නම් කුමක් කළ යුතුද? ඔබට ඔබේ කේතය aws_availability_zones දත්ත මූලාශ්‍රයෙන් කලාප ලැයිස්තුවක් පැටවීමට සලස්වා පසුව එකින් එක ලූප් කර ගණන් කිරීමේ පරාමිතිය සහ අරා දර්ශක ප්‍රවේශය භාවිතයෙන් එහි EC2 සේවාදායකයක් සාදාගත හැක:

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

ගණන් කිරීමේ පරාමිතියට කිසිදු ගැටළුවක් නොමැතිව දත්ත මූලාශ්‍ර යොමු කළ හැකි බැවින් මෙම කේතය ද හොඳින් ක්‍රියා කරයි. නමුත් ඔබට නිර්මාණය කිරීමට අවශ්‍ය සේවාදායක සංඛ්‍යාව යම් සම්පතක ප්‍රතිදානය මත රඳා පවතී නම් කුමක් සිදුවේද? මෙය ප්‍රදර්ශනය කිරීම සඳහා, පහසුම ක්‍රමය නම් සසම්භාවී_නිඛිල සම්පත භාවිතා කිරීමයි, එය නමට අනුව, සසම්භාවී පූර්ණ සංඛ්‍යාවක් ලබා දෙයි:

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

මෙම කේතය 1 සහ 3 අතර අහඹු අංකයක් ජනනය කරයි. අපි මෙම සම්පතේ ප්‍රතිදානය aws_instance සම්පතේ ගණන් කිරීමේ පරාමිතිය තුළ භාවිතා කිරීමට උත්සාහ කළහොත් කුමක් සිදුවේදැයි බලමු:

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

ඔබ මෙම කේතය මත ටෙරාෆෝම් සැලැස්ම ධාවනය කරන්නේ නම්, ඔබට පහත දෝෂය ලැබෙනු ඇත:

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 සඳහා කිසියම් සම්පත් නිර්මාණය කිරීමට හෝ වෙනස් කිරීමට පෙර, සැලසුම් කිරීමේ අදියරේදී ගණන් කිරීම සහ for_each ගණනය කිරීම අවශ්‍ය වේ. මෙයින් අදහස් කරන්නේ ගණන් කිරීම සහ for_each යන්නට වචනාර්ථ, විචල්‍යයන්, දත්ත මූලාශ්‍ර සහ සම්පත් ලැයිස්තු පවා යොමු කළ හැකි බවයි (ඒවායේ දිග කාලසටහන්ගත කිරීමේ වේලාවේදී තීරණය කළ හැකි තාක්) මිස ගණනය කළ සම්පත් ප්‍රතිදාන විචල්‍යයන් වෙත නොවේ.

මොඩියුල වින්‍යාසය තුළ ගණන් කිරීම සහ for_each භාවිතා කළ නොහැක

යම් දිනක ඔබ ඔබේ මොඩියුල වින්‍යාසයට ගණන් කිරීමේ පරාමිතියක් එක් කිරීමට පෙළඹෙනු ඇත:

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

     count = 3

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

මෙම කේතය webserver-cluster සම්පතේ පිටපත් තුනක් සෑදීමට මොඩියුලයක් තුළ ගණන් භාවිතා කිරීමට උත්සාහ කරයි. නැතහොත් ඔබට එහි ගණන් කිරීමේ පරාමිතිය 0 ට සැකසීමෙන් යම් බූලියන් කොන්දේසියක් මත පදනම්ව මොඩියුලයක් සම්බන්ධ කිරීම විකල්ප කිරීමට අවශ්‍ය විය හැකිය. මෙය සාධාරණ කේතයක් ලෙස පෙනෙනු ඇත, නමුත් ටෙරාෆෝම් සැලැස්ම ක්‍රියාත්මක කිරීමේදී ඔබට මෙම දෝෂය ලැබෙනු ඇත:

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.

අවාසනාවන්ත ලෙස, Terraform 0.12.6 ලෙස, මොඩියුල සම්පතක ගණන් කිරීම හෝ for_each භාවිතා කිරීම සඳහා සහය නොදක්වයි. Terraform 0.12 නිකුතු සටහන් වලට අනුව (http://bit.ly/3257bv4), HashiCorp අනාගතයේදී මෙම හැකියාව එක් කිරීමට සැලසුම් කරයි, එබැවින් ඔබ මෙම පොත කියවන විට, එය දැනටමත් ලබා ගත හැකිය. නිසැකවම සොයා ගැනීමට, Terraform changelog එක මෙතනින් කියවන්න.

Zero Downtime deployments හි සීමාවන්

ASG සමඟ ඒකාබද්ධව create_before_destroy බ්ලොක් එක භාවිතා කිරීම ශුන්‍ය-අඩකාල යෙදවීම් නිර්මාණය කිරීම සඳහා විශිෂ්ට විසඳුමකි, එක් අවවාදයක් හැර: ස්වයංක්‍රීය පරිමාණ නීති සහය නොදක්වයි. නැතහොත් වඩාත් නිවැරදිව කිවහොත්, මෙය සෑම යෙදවීමකදීම ASG ප්‍රමාණය min_size වෙත නැවත සකසයි, ඔබ ක්‍රියාත්මක වන සේවාදායක සංඛ්‍යාව වැඩි කිරීමට ස්වයං පරිමාණ නීති භාවිතා කරන්නේ නම් එය ගැටළුවක් විය හැකිය.

උදාහරණයක් ලෙස, webserver-cluster module හි aws_autoscaling_schedule සම්පත් යුගලයක් අඩංගු වන අතර, එය උදෑසන 9 ට පොකුරේ ඇති සේවාදායකයන් සංඛ්‍යාව දෙකේ සිට දහය දක්වා වැඩි කරයි. ඔබ උදේ 11 ට යෙදුවොත්, නව ASG සේවාදායක දහයකට වඩා 9ක් පමණක් සමඟ ආරම්භ වන අතර පසුවදා උදේ XNUMX දක්වා එලෙසම පවතිනු ඇත.

මෙම සීමාව ක්රම කිහිපයකින් මග හැරිය හැක.

  • aws_autoscaling_schedule හි පුනරාවර්තන පරාමිතිය 0 9 * * * (“උදෑසන 9 ට ධාවනය”) සිට 0-59 9-17 * * * වැනි දෙයකට වෙනස් කරන්න (“සෑම මිනිත්තුවකම උදේ 9 සිට සවස 5 දක්වා ධාවනය කරන්න”). ASG සතුව දැනටමත් සේවාදායකයන් දහයක් තිබේ නම්, මෙම ස්වයංක්‍රීය පරිමාණ රීතිය නැවත ධාවනය කිරීමෙන් කිසිවක් වෙනස් නොවනු ඇත, එය අපට අවශ්‍ය දෙයයි. නමුත් ASG මෑතකදී පමණක් යොදවා තිබේ නම්, මෙම රීතිය මඟින් උපරිම මිනිත්තුවකින් එහි සේවාදායකයන් ගණන දහය දක්වා ළඟා වනු ඇත. මෙය සම්පූර්ණයෙන්ම අලංකාර ප්රවේශයක් නොවන අතර, සේවාදායකයන් දහයේ සිට දෙක දක්වා විශාල පැනීම් සහ පසුපසට ද පරිශීලකයින්ට ගැටළු ඇති කළ හැකිය.
  • ASG හි ක්‍රියාකාරී සේවාදායකයන් ගණන තීරණය කිරීමට AWS API භාවිතා කරන අභිරුචි ස්ක්‍රිප්ට් එකක් සාදන්න, බාහිර දත්ත මූලාශ්‍රයක් භාවිතයෙන් එය අමතන්න (249 පිටුවේ "බාහිර දත්ත මූලාශ්‍රය" බලන්න), සහ ASG හි අපේක්ෂිත_ධාරිතා පරාමිතිය ආපසු ලබා දුන් අගයට සකසන්න. පිටපත. මේ ආකාරයට, සෑම නව ASG අවස්ථාවක්ම සෑම විටම පවතින Terraform කේතයට සමාන ධාරිතාවයකින් ක්‍රියාත්මක වන අතර එය නඩත්තු කිරීම වඩාත් අපහසු කරයි.

ඇත්ත වශයෙන්ම, ටෙරාෆෝම් ශුන්‍ය-අඩකාල යෙදවීම් සඳහා ඉතා මැනවින් සවි කර ඇති සහය ඇත, නමුත් 2019 මැයි වන විට, මෙම ක්‍රියාකාරිත්වය එක් කිරීමට HashiCorp කණ්ඩායමට කිසිදු සැලසුමක් නොතිබුණි (විස්තර - මෙන්න).

නිවැරදි සැලැස්ම අසාර්ථක විය හැක

සමහර විට සැලසුම් විධානය පරිපූර්ණ නිවැරදි යෙදවුම් සැලැස්මක් නිපදවයි, නමුත් අයදුම් කිරීමේ විධානය දෝෂයක් ලබා දෙයි. උදාහරණයක් ලෙස, ඔබ 2 වන පරිච්ඡේදයේ කලින් නිර්මාණය කළ IAM පරිශීලකයා සඳහා ඔබ භාවිතා කළ එකම නම සහිත aws_iam_user සම්පත එක් කිරීමට උත්සාහ කරන්න:

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

දැන්, ඔබ සැලසුම් විධානය ක්‍රියාත්මක කරන්නේ නම්, Terraform සාධාරණ ලෙස පෙනෙන පරිදි යෙදවීමේ සැලැස්මක් ප්‍රතිදානය කරයි:

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.

ඔබ අයදුම් කිරීමේ විධානය ක්‍රියාත්මක කළහොත් ඔබට පහත දෝෂය ලැබෙනු ඇත:

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

ඇත්ත වශයෙන්ම ගැටලුව වන්නේ එම නම සහිත IAM පරිශීලකයෙකු දැනටමත් සිටීමයි. මෙය IAM භාවිතා කරන්නන්ට පමණක් නොව, ඕනෑම සම්පතකට පාහේ සිදුවිය හැක. යමෙක් මෙම සම්පත අතින් හෝ විධාන රේඛාව භාවිතයෙන් නිර්මාණය කර ඇති නමුත්, එක්කෝ, හැඳුනුම්පත් ගැලපීම ගැටුම් වලට තුඩු දෙයි. බොහෝ විට ටෙරාෆෝම් වෙත පැමිණෙන නවකයන් පුදුමයට පත් කරන මෙම දෝෂයේ බොහෝ වෙනස්කම් තිබේ.

ප්‍රධාන කරුණ නම් ටෙරාෆෝම් සැලසුම් විධානය ටෙරාෆෝම් රාජ්‍ය ගොනුවේ දක්වා ඇති සම්පත් පමණක් සැලකිල්ලට ගනී. සම්පත් වෙනත් ආකාරයකින් නිර්මාණය කර ඇත්නම් (උදාහරණයක් ලෙස, AWS කොන්සෝලය මත ක්ලික් කිරීමෙන් අතින්), ඒවා රාජ්‍ය ගොනුවේ අවසන් නොවන අතර එබැවින් සැලසුම් විධානය ක්‍රියාත්මක කිරීමේදී Terraform ඒවා සැලකිල්ලට නොගනී. එහි ප්‍රතිඵලයක් ලෙස බැලූ බැල්මට නිවැරදි යැයි පෙනෙන සැලසුමක් අසාර්ථක වනු ඇත.

මෙයින් උගත යුතු පාඩම් දෙකක් ඇත.

  • ඔබ දැනටමත් Terraform සමඟ වැඩ කිරීමට පටන් ගෙන තිබේ නම්, වෙනත් කිසිවක් භාවිතා නොකරන්න. ඔබේ යටිතල ව්‍යුහයේ කොටසක් Terraform භාවිතයෙන් කළමනාකරණය කරන්නේ නම්, ඔබට එය තවදුරටත් අතින් වෙනස් කළ නොහැක. එසේ නොමැති නම්, ඔබ අමුතු ටෙරාෆෝම් දෝෂ අවදානමට ලක් කරනවා පමණක් නොව, කේතය තවදුරටත් ඔබේ යටිතල ව්‍යුහයේ නිවැරදි නිරූපණයක් නොවන බැවින් IaC හි බොහෝ ප්‍රතිලාභ ද ඔබ ප්‍රතික්ෂේප කරයි.
  • ඔබට දැනටමත් යටිතල පහසුකම් තිබේ නම්, ආනයන විධානය භාවිතා කරන්න. ඔබ දැනට පවතින යටිතල පහසුකම් සමඟ Terraform භාවිතා කිරීමට පටන් ගන්නේ නම්, ඔබට එය ටෙරාෆෝම් ආනයන විධානය භාවිතයෙන් රාජ්‍ය ගොනුවට එක් කළ හැකිය. මේ ආකාරයෙන් Terraform කළමනාකරණය කළ යුතු යටිතල පහසුකම් මොනවාදැයි දැන ගනු ඇත. ආනයන විධානය තර්ක දෙකක් ගනී. පළමුවැන්න ඔබේ වින්‍යාස ගොනුවල ඇති සම්පත් ලිපිනයයි. මෙහි වාක්‍ය ඛණ්ඩය සම්පත් සබැඳි සඳහා සමාන වේ: _. (aws_iam_user.existing_user වැනි). දෙවන තර්කය වන්නේ ආනයනය කිරීමට නියමිත සම්පතේ ID ය. අපි කියමු සම්පත් ID aws_iam_user පරිශීලක නාමය (උදාහරණයක් ලෙස, yevgeniy.brikman), සහ සම්පත් ID aws_instance යනු EC2 සේවාදායක ID (i-190e22e5 වැනි) වේ. සම්පතක් ආයාත කරන්නේ කෙසේද යන්න සාමාන්‍යයෙන් එහි පිටුවේ පතුලේ ඇති ලේඛනවල දක්වා ඇත.

    2 වන පරිච්ඡේදයේ IAM පරිශීලකයා සමඟ ඔබ ඔබේ Terraform වින්‍යාසයට එක් කළ aws_iam_user සම්පත සමමුහුර්ත කරන ආනයන විධානයක් පහත දැක්වේ (ඇත්ත වශයෙන්ම yevgeniy.brikman සඳහා ඔබේ නම ආදේශ කිරීම):

    $ terraform import aws_iam_user.existing_user yevgeniy.brikman

    Terraform ඔබගේ IAM පරිශීලකයා සොයා ගැනීමට AWS API අමතනු ඇති අතර එය සහ ඔබේ Terraform වින්‍යාසය තුළ ඇති aws_iam_user.existing_user සම්පත අතර රාජ්‍ය ගොනු සංගමයක් නිර්මාණය කරයි. මෙතැන් සිට, ඔබ සැලසුම් විධානය ක්‍රියාත්මක කරන විට, IAM පරිශීලකයා දැනටමත් සිටින බවත් එය නැවත නිර්මාණය කිරීමට උත්සාහ නොකරන බවත් Terraform දැන ගනු ඇත.

    ඔබට දැනටමත් Terraform වෙත ආයාත කිරීමට අවශ්‍ය බොහෝ සම්පත් තිබේ නම්, කේතය අතින් ලිවීම සහ එක එක වරකට ආනයනය කිරීම කරදරයක් විය හැකි බව සඳහන් කිරීම වටී. එබැවින් ඔබගේ AWS ගිණුමෙන් ස්වයංක්‍රීයව කේතය සහ ප්‍රකාශය ආයාත කළ හැකි Terraforming (http://terraforming.dtan4.net/) වැනි මෙවලමක් සොයා බැලීම වටී.

    ප්‍රතිනිර්මාණය කිරීමේදී එහි අන්තරා ඇති විය හැක

    නැවත සකස් කිරීම ක්‍රමලේඛනයේ සාමාන්‍ය පුරුද්දකි, එහිදී ඔබ බාහිර හැසිරීම නොවෙනස්ව තබන අතරතුර කේතයේ අභ්‍යන්තර ව්‍යුහය වෙනස් කරයි. මෙය කේතය වඩාත් පැහැදිලි, පිළිවෙලට සහ නඩත්තු කිරීමට පහසු කිරීමට ය. ප්‍රතිනිර්මාණය කිරීම නිතිපතා භාවිතා කළ යුතු අත්‍යවශ්‍ය තාක්‍ෂණයකි. නමුත් එය Terraform හෝ වෙනත් ඕනෑම IaC මෙවලමක් සම්බන්ධයෙන් ගත් කල, ඔබ කේත කැබැල්ලක "බාහිර හැසිරීම" යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න පිළිබඳව අතිශයින්ම පරෙස්සම් විය යුතුය, එසේ නොමැතිනම් අනපේක්ෂිත ගැටළු මතු වනු ඇත.

    උදාහරණයක් ලෙස, ප්‍රතිනිර්මාණය කිරීමේ පොදු වර්ගයක් වන්නේ විචල්‍ය හෝ ශ්‍රිතවල නම් වඩාත් තේරුම්ගත හැකි ඒවා සමඟ ප්‍රතිස්ථාපනය කිරීමයි. බොහෝ IDE වලට ප්‍රතිනිර්මාණය කිරීම සඳහා සහය ඇති අතර ව්‍යාපෘතිය පුරාවටම විචල්‍යයන් සහ ශ්‍රිතයන් ස්වයංක්‍රීයව නැවත නම් කළ හැක. සාමාන්‍ය කාර්ය ක්‍රමලේඛන භාෂා වලදී, මෙය ඔබ නොසිතන සුළු ක්‍රියා පටිපාටියකි, නමුත් Terraform හි ඔබ මේ සම්බන්ධයෙන් අතිශයින්ම ප්‍රවේශම් විය යුතුය, එසේ නොමැතිනම් ඔබට ඇනහිටීම් අත්විඳිය හැකිය.

    උදාහරණයක් ලෙස, webserver-cluster module හි ආදාන විචල්‍ය cluster_name ඇත:

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

    ඔබ foo නම් microservice යෙදවීමට මෙම මොඩියුලය භාවිතා කිරීමට පටන් ගත් බව සිතන්න. පසුව, ඔබට ඔබේ සේවාව තීරුව ලෙස නැවත නම් කිරීමට අවශ්‍ය වේ. මෙම වෙනස සුළුපටු ලෙස පෙනුනත්, ඇත්ත වශයෙන්ම එය සේවා බාධා ඇති කළ හැක.

    කාරණය නම්, webserver-cluster module එක ආරක්ෂක කණ්ඩායම් දෙකක නාම පරාමිතිය සහ ALB ඇතුළුව සම්පත් ගණනාවක cluster_name විචල්‍යය භාවිතා කරයි:

    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]
    }

    ඔබ සම්පතක නාම පරාමිතිය වෙනස් කරන්නේ නම්, Terraform එම සම්පතේ පැරණි අනුවාදය මකා දමා එහි ස්ථානයේ නව එකක් සාදනු ඇත. නමුත් එම සම්පත ALB එකක් නම්, එය මකා දැමීම සහ නව අනුවාදයක් බාගත කිරීම අතර, ඔබේ වෙබ් සේවාදායකය වෙත ගමනාගමනය හරවා යැවීමට යාන්ත්‍රණයක් ඔබට නොමැත. එසේම, ආරක්ෂක කණ්ඩායමක් මකා දැමුවහොත්, නව කණ්ඩායමක් සාදනු ලබන තෙක් ඔබගේ සේවාදායකයන් ඕනෑම ජාල තදබදයක් ප්‍රතික්ෂේප කිරීමට පටන් ගනී.

    ටෙරාෆෝම් හැඳුනුම්පත වෙනස් කිරීම සඳහා ඔබ උනන්දු විය හැකි තවත් ප්‍රතිනිර්මාණය කිරීමේ වර්ගයකි. අපි උදාහරණයක් ලෙස webserver-cluster module හි ඇති aws_security_group සම්පත ගනිමු:

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

    මෙම සම්පත හඳුනාගැනීම නිදසුන ලෙස හැඳින්වේ. ප්‍රතිනිර්මාණය කිරීමේදී ඔබ එය වඩාත් තේරුම්ගත හැකි (ඔබේ මතය අනුව) cluster_instance නමකට වෙනස් කිරීමට තීරණය කළ බව සිතන්න:

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

    අවසානයේ කුමක් සිදුවේද? ඒක හරි: බාධාවක්.

    ටෙරාෆෝම් එක් එක් සම්පත් හැඳුනුම්පත වලාකුළු සපයන්නාගේ හැඳුනුම්පත සමඟ සම්බන්ධ කරයි. උදාහරණයක් ලෙස, iam_user AWS IAM පරිශීලක හැඳුනුම්පත සමඟ සම්බන්ධ වී ඇති අතර, aws_instance AWS EC2 සේවාදායක ID සමඟ සම්බන්ධ වේ. ඔබ සම්පත් හැඳුනුම්පත (උදාහරණයෙන් cluster_instance වෙත කියන්න, aws_security_group වලදී මෙන්) Terraform වෙත වෙනස් කරන්නේ නම්, එය ඔබ පැරණි සම්පත මකා නව එකක් එකතු කළාක් මෙන් දිස් වනු ඇත. ඔබ මෙම වෙනස්කම් යොදන්නේ නම්, ඔබේ සේවාදායකයන් ඕනෑම ජාල තදබදයක් ප්‍රතික්ෂේප කිරීමට පටන් ගන්නා අතරතුර, Terraform පැරණි ආරක්ෂක කණ්ඩායම මකා නව එකක් සාදනු ඇත.

    මෙම සාකච්ඡාවෙන් ඔබ ඉවත් කළ යුතු ප්‍රධාන පාඩම් හතරක් මෙන්න.

    • සෑම විටම සැලසුම් විධානය භාවිතා කරන්න. එයින් මේ සියලු සූක්ෂ්මතා හෙළි කළ හැකිය. එහි ප්‍රතිදානය ප්‍රවේශමෙන් සමාලෝචනය කර Terraform විසින් බොහෝ විට මකා දැමිය යුතු නැති සම්පත් මකා දැමීමට සැලසුම් කර ඇති අවස්ථාවන් කෙරෙහි අවධානය යොමු කරන්න.
    • ඔබ මකා දැමීමට පෙර සාදන්න. ඔබට සම්පතක් ප්‍රතිස්ථාපනය කිරීමට අවශ්‍ය නම්, මුල් පිටපත මකා දැමීමට පෙර ඔබට ආදේශකයක් නිර්මාණය කිරීමට අවශ්‍ය දැයි හොඳින් සිතා බලන්න. පිළිතුර ඔව් නම්, create_before_destroy උදවු කළ හැක. පියවර දෙකක් සිදු කිරීමෙන් එකම ප්‍රති result ලය අතින් ලබා ගත හැකිය: පළමුව වින්‍යාසයට නව සම්පතක් එකතු කර අයදුම් කිරීමේ විධානය ක්‍රියාත්මක කරන්න, ඉන්පසු වින්‍යාසයෙන් පැරණි සම්පත ඉවත් කර නැවත අයදුම් කිරීමේ විධානය භාවිතා කරන්න.
    • හඳුනාගැනීම් වෙනස් කිරීම සඳහා තත්වය වෙනස් කිරීම අවශ්‍ය වේ. ඔබට සම්පතක් සමඟ සම්බන්ධිත හැඳුනුම්පත වෙනස් කිරීමට අවශ්‍ය නම් (උදාහරණයක් ලෙස, aws_security_group instance සිට cluster_instance ලෙස නැවත නම් කරන්න) සම්පත මකා දමා එහි නව අනුවාදයක් නිර්මාණය නොකර, ඔබ ඒ අනුව Terraform රාජ්‍ය ගොනුව යාවත්කාලීන කළ යුතුය. මෙය කිසිවිටෙක අතින් සිදු නොකරන්න - ඒ වෙනුවට ටෙරාෆෝම් රාජ්‍ය විධානය භාවිතා කරන්න. හඳුනාගැනීම් නැවත නම් කිරීමේදී, ඔබ පහත සඳහන් වාක්‍ය ඛණ්ඩය ඇති ටෙරාෆෝම් රාජ්‍ය mv විධානය ක්‍රියාත්මක කළ යුතුය:
      terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>

      ORIGINAL_REFERENCE යනු එහි වත්මන් ස්වරූපයෙන් සම්පතට යොමු වන ප්‍රකාශනයක් වන අතර NEW_REFERENCE යනු ඔබට එය ගෙන යාමට අවශ්‍ය ස්ථානයයි. උදාහරණයක් ලෙස, aws_security_group කණ්ඩායම instance සිට cluster_instance දක්වා නැවත නම් කිරීමේදී, ඔබ පහත විධානය ක්‍රියාත්මක කළ යුතුය:

      $ terraform state mv 
         aws_security_group.instance 
         aws_security_group.cluster_instance

      මෙය Terraform හට පවසන්නේ කලින් aws_security_group.instance සමඟ සම්බන්ධ වූ තත්වය දැන් aws_security_group.cluster_instance සමඟ සම්බන්ධ විය යුතු බවයි. මෙම විධානය නැවත නම් කර ක්‍රියාත්මක කිරීමෙන් පසු ටෙරාෆෝම් සැලැස්ම කිසිදු වෙනසක් නොපෙන්වන්නේ නම්, ඔබ සියල්ල නිවැරදිව කළා.

    • සමහර සැකසුම් වෙනස් කළ නොහැක. බොහෝ සම්පත් වල පරාමිතීන් වෙනස් කළ නොහැක. ඔබ ඒවා වෙනස් කිරීමට උත්සාහ කරන්නේ නම්, Terraform පැරණි සම්පත මකා දමා එහි ස්ථානයේ නව එකක් සාදනු ඇත. සෑම මූලාශ්‍ර පිටුවක්ම සාමාන්‍යයෙන් ඔබ යම් සැකසුම වෙනස් කරන විට සිදු වන්නේ කුමක්දැයි දක්වනු ඇත, එබැවින් ලේඛන පරීක්ෂා කිරීමට වග බලා ගන්න. සෑම විටම සැලසුම් විධානය භාවිතා කර create_before_destroy උපාය මාර්ගය භාවිතා කිරීම සලකා බලන්න.

    විලම්බිත අනුකූලතාව අනුකූල වේ ... කල් දැමීම සමග

    AWS වැනි සමහර ක්ලවුඩ් සපයන්නන්ගේ API අසමමිතික වන අතර ප්‍රමාද වූ අනුකූලතාවයක් ඇත. අසමමුහුර්තකරණය යන්නෙන් අදහස් කරන්නේ ඉල්ලන ලද ක්‍රියාව සම්පූර්ණ වන තෙක් බලා නොසිට අතුරු මුහුණතට වහාම ප්‍රතිචාරයක් ලබා දිය හැකි බවයි. ප්‍රමාද වූ අනුකූලතාව යනු වෙනස්කම් පද්ධතිය පුරා ප්‍රචාරණය වීමට කාලය ගත විය හැකි බවයි; මෙය සිදුවන අතරතුර, ඔබගේ ප්‍රතිචාර නොගැලපෙන අතර ඔබගේ API ඇමතුම් වලට ප්‍රතිචාර දක්වන දත්ත මූලාශ්‍ර අනුරුව මත රඳා පවතී.

    උදාහරණයක් ලෙස, ඔබ AWS වෙත EC2 සේවාදායකයක් නිර්මාණය කරන ලෙස ඉල්ලා API ඇමතුමක් ගන්නා බව සිතන්න. API විසින් සේවාදායකයම නිර්මාණය වන තෙක් බලා නොසිට, ක්ෂණිකව වාගේ "සාර්ථක" ප්‍රතිචාරයක් (201 සාදන ලදී) ලබා දෙනු ඇත. ඔබ වහාම එයට සම්බන්ධ වීමට උත්සාහ කරන්නේ නම්, එය නිසැකවම අසාර්ථක වනු ඇත, මන්ද එම අවස්ථාවේදී AWS තවමත් සම්පත් ආරම්භ කරමින් හෝ, ඒ වෙනුවට, සේවාදායකය තවමත් ආරම්භ කර නොමැත. එපමණක් නොව, ඔබ මෙම සේවාදායකය පිළිබඳ තොරතුරු ලබා ගැනීමට තවත් ඇමතුමක් ලබා ගන්නේ නම්, ඔබට දෝෂයක් ලැබිය හැකිය (404 හමු නොවීය). කාරණය නම්, මෙම EC2 සේවාදායකය පිළිබඳ තොරතුරු සෑම තැනකම ලබා ගැනීමට පෙර AWS පුරා තවමත් ප්‍රචාරණය කළ හැකිය, ඔබට තත්පර කිහිපයක් බලා සිටීමට සිදුවනු ඇත.

    ඔබ කම්මැලි අනුකූලතාවයක් සහිත අසමමුහුර්ත API භාවිතා කරන සෑම විටම, ක්‍රියාව සම්පූර්ණ කර පද්ධතිය හරහා ප්‍රචාරණය වන තෙක් ඔබ වරින් වර ඔබේ ඉල්ලීම නැවත උත්සාහ කළ යුතුය. අවාසනාවකට, AWS SDK මේ සඳහා හොඳ මෙවලම් කිසිවක් සපයන්නේ නැත, සහ Terraform ව්‍යාපෘතිය 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

    වෙනත් වචන වලින් කිවහොත්, ඔබ සම්පතක් (උපජාලයක් වැනි) සාදා, පසුව ඒ පිළිබඳ යම් තොරතුරු ලබා ගැනීමට උත්සාහ කරයි (අලුතින් සාදන ලද උපජාලයේ හැඳුනුම්පත වැනි), සහ Terraform හට එය සොයාගත නොහැක. මෙම දෝෂ බොහොමයක් (6813 ඇතුළුව) නිරාකරණය කර ඇත, නමුත් ඒවා තවමත් කලින් කලට වර්ධනය වේ, විශේෂයෙන් Terraform නව සම්පත් වර්ගයක් සඳහා සහය එක් කරන විට. මෙය කරදරකාරී ය, නමුත් බොහෝ අවස්ථාවලදී කිසිදු හානියක් සිදු නොවේ. ඔබ ටෙරාෆෝම් නැවත ධාවනය කරන විට, සියල්ල ක්‍රියාත්මක විය යුතුය, මන්ද මේ වන විට තොරතුරු පද්ධතිය පුරා පැතිරී ඇත.

    මෙම උපුටා ගැනීම Evgeniy Brikman විසින් පොතෙන් ඉදිරිපත් කර ඇත "ටෙරාෆෝම්: කේත මට්ටමින් යටිතල පහසුකම්".

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න