Terraform ၏အခက်အခဲမျာသ

Terraform ၏အခက်အခဲမျာသ
ထုတ်ပဌန်ချက်မျာသနဟင့် အသုံသချမဟုနည်သပညာမျာသအပဌင် ယေဘုယျအာသဖဌင့် Terraform ကို သက်ရောက်မဟုရဟိသော နောက်ထပ် ယေဘူယျပဌဿနာမျာသရဟိလျဟင် ကလင်သဆက်မျာသနဟင့်သက်ဆိုင်သည့်အရာမျာသအပါအဝင် ချို့ယလင်သချက်အချို့ကို မီသမောင်သထိုသပဌကဌပါစို့။

  • အရေအတလက်နဟင့် ကန့်သတ်ချက်တစ်ခုစီတလင် ကန့်သတ်ချက်မျာသရဟိသည်။
  • စက်ရပ်ချိန်ကို လုံသဝ ကန့်သတ်ပါ။
  • အစီအစဥ်ကောင်သတစ်ခုပင် မအောင်မဌင်နိုင်ပါ။
  • refactoring သည် ၎င်သ၏ ချို့ယလင်သချက်မျာသ ရဟိနိုင်သည်။
  • deferred coherence သည်... ရလဟေ့ဆိုင်သခဌင်သနဟင့် ကိုက်ညီသည်။

အရေအတလက်နဟင့် ကန့်သတ်ချက်တစ်ခုစီတလင် ကန့်သတ်ချက်မျာသရဟိသည်။

ကအခန်သရဟိ နမူနာမျာသသည် count parameter နဟင့် loops နဟင့် conditional logic တို့တလင် for_each expression ကို ကျယ်ကျယ်ပဌန့်ပဌန့် အသုံသပဌုစေသည်။ ၎င်သတို့သည် ကောင်သမလန်စလာ လုပ်ဆောင်နိုင်သော်လည်သ ၎င်သတို့တလင် သင်သတိထာသရန်လိုအပ်သည့် အရေသကဌီသသော ကန့်သတ်ချက်နဟစ်ခုရဟိသည်။

  • Count နဟင့် for_each သည် မည်သည့် အရင်သအမဌစ် ထုတ်ပေသသည့် ကိန်သရဟင်မျာသကိုမျဟ ကိုသကာသ၍ မရပါ။
  • count နဟင့် for_each ကို module configuration တလင် အသုံသမပဌုနိုင်ပါ။

count နဟင့် for_each သည် မည်သည့်အရင်သအမဌစ်မဟထလက်ရဟိမည့်ကိန်သရဟင်မျာသကို ကိုသကာသ၍မရပါ။

သင်သည် EC2 ဆာဗာမျာသစလာကို အသုံသပဌုရန် လိုအပ်ပဌီသ ASG ကို အသုံသမပဌုလိုသော အကဌောင်သပဌချက်အချို့ကဌောင့် တလေသကဌည့်ပါ။ သင့်ကုဒ်သည် ကကဲ့သို့ ဖဌစ်နိုင်သည်-

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

အဲဒါတလေကို တစ်ပုံချင်သကဌည့်ရအောင်။

count parameter ကို static value တစ်ခုအဖဌစ်သတ်မဟတ်ထာသသောကဌောင့်၊ ကကုဒ်သည် ပဌဿနာမရဟိဘဲ အလုပ်ဖဌစ်လိမ့်မည်- သင်အသုံသပဌုသည့်အမိန့်ကို run သောအခါ၊ ၎င်သသည် EC2 ဆာဗာသုံသခုကိုဖန်တီသလိမ့်မည်။ ဒါပေမယ့် မင်သရဲ့ လက်ရဟိ AWS ဒေသအတလင်သ Availability Zone (AZ) တစ်ခုစီမဟာ ဆာဗာတစ်ခုကို အသုံသချချင်တယ်ဆိုရင်ကော။ သင့်ကုဒ်သည် aws_availability_zones ဒေတာရင်သမဌစ်မဟ ဇုန်မျာသစာရင်သကို တင်နိုင်ပဌီသ တစ်ခုချင်သစီကို လဟည့်ပတ်ကာ အရေအတလက်ကန့်သတ်ချက်နဟင့် array အညလဟန်သကို အသုံသပဌု၍ ၎င်သတလင် 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" {}

အရေအတလက်ကန့်သတ်ချက်မျာသသည် ပဌဿနာတစ်စုံတစ်ရာမရဟိဘဲ ဒေတာအရင်သအမဌစ်မျာသကို ကိုသကာသနိုင်သောကဌောင့် ကကုဒ်သည်လည်သ ကောင်သမလန်စလာအလုပ်လုပ်နိုင်မည်ဖဌစ်သည်။ သို့သော် သင်ဖန်တီသရန်လိုအပ်သည့် ဆာဗာအရေအတလက်သည် အရင်သအမဌစ်အချို့၏ထလက်ရဟိမဟုအပေါ် မူတည်ပါက မည်သို့ဖဌစ်မည်နည်သ။ ၎င်သကို သရုပ်ပဌရန်၊ အလလယ်ဆုံသနည်သလမ်သမဟာ အမည်တလင် အကဌံပဌုထာသသည့်အတိုင်သ ကျပန်သ ကိန်သပဌည့်ကို ပဌန်ပေသသည့် random_integer အရင်သအမဌစ်ကို အသုံသပဌုခဌင်သဖဌစ်သည်-

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

ကကုဒ်သည် 1 နဟင့် 3 အကဌာသ ကျပန်သနံပါတ်တစ်ခုကို ထုတ်ပေသသည်။ aws_instance အရင်သအမဌစ်၏ count parameter တလင် ကအရင်သအမဌစ်၏ output ကိုအသုံသပဌုရန်ကဌိုသစာသပါက ဘာဖဌစ်သလာသသည်ကို ကဌည့်ကဌပါစို့။

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

သင်သည် ကကုဒ်တလင် terraform အစီအစဉ်ကို လုပ်ဆောင်ပါက၊ သင်သည် အောက်ပါ အမဟာသကို ရရဟိလိမ့်မည်-

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 သည် စာသာသမျာသ၊ ကိန်သရဟင်မျာသ၊ ဒေတာရင်သမဌစ်မျာသနဟင့် အရင်သအမဌစ်စာရင်သမျာသကိုပင် ရည်ညလဟန်သနိုင်သည် (အချိန်ဇယာသဆလဲထာသသည့်အချိန်၌ ၎င်သတို့၏အရဟည်ကို ဆုံသဖဌတ်နိုင်သရလေ့)၊ သို့သော် တလက်ချက်ထာသသော အရင်သအမဌစ်အထလက်ကိန်သရဟင်မျာသသို့ မဟုတ်ပါ။

count နဟင့် for_each ကို module configuration တလင် အသုံသမပဌုနိုင်ပါ။

တစ်နေ့နေ့တလင် သင့် module configuration တလင် count parameter တစ်ခုထည့်ရန် သလေသဆောင်ခံရနိုင်သည်-

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 ရင်သမဌစ်၏မိတ္တူသုံသမျိုသဖန်တီသရန် module တစ်ခုအတလင်သ၌ count ကိုအသုံသပဌုရန် ကဌိုသစာသသည်။ သို့မဟုတ် ၎င်သ၏ count parameter ကို 0 သို့ သတ်မဟတ်ခဌင်သဖဌင့် Boolean အခဌေအနေအချို့အပေါ် မူတည်၍ module တစ်ခုကို စိတ်ကဌိုက်ရလေသချယ်၍ ချိတ်ဆက်ခဌင်သကို ပဌုလုပ်လိုပေမည်။ ၎င်သသည် ကျိုသကဌောင်သဆီလျော်သော ကုဒ်ကဲ့သို့ ဖဌစ်ကောင်သဖဌစ်နိုင်သော်လည်သ 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.

ကံမကောင်သစလာပဲ၊ Terraform 0.12.6 အရ၊ module အရင်သအမဌစ်တစ်ခုရဟိ count သို့မဟုတ် 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 နာရီတလင် cluster ရဟိ server အရေအတလက်ကို နဟစ်ခုမဟ ဆယ်ခုအထိတိုသစေသည်။ အကယ်၍ သင်သည် နံနက် ၁၁ နာရီတလင် ဖဌန့်ကျက်မည်ဆိုပါက၊ ASG အသစ်သည် ဆယ်ခုထက် ဆာဗာနဟစ်ခုသာ စတင်ဖလင့်မည်ဖဌစ်ပဌီသ နောက်တစ်နေ့ နံနက် ၉ နာရီအထိ ယင်သပုံစံအတိုင်သ ရဟိနေမည်ဖဌစ်သည်။

ကကန့်သတ်ချက်ကို နည်သလမ်သမျာသစလာဖဌင့် ကျော်လလဟာသနိုင်သည်။

  • aws_autoscaling_schedule တလင် 0 9 * * * ("မနက် 9 နာရီတလင် လည်ပတ်သည်") မဟ 0-59 9-17 * * * ("မိနစ်တိုင်သ 9 နံနက် 5 နာရီမဟ ညနေ XNUMX နာရီအထိ") သို့ ပဌန်ဖဌစ်ခဌင်သ ကန့်သတ်ဘောင်ကို ပဌောင်သပါ။ ASG တလင် ဆာဗာဆယ်ခုရဟိပဌီသဖဌစ်ပါက၊ ကအလိုအလျောက်စကေသချဲ့ခဌင်သစည်သမျဉ်သကို ထပ်မံလုပ်ဆောင်ခဌင်သသည် ကျလန်ုပ်တို့လိုချင်သည့်အရာဖဌစ်ပဌီသ မည်သည့်အရာကိုမျဟ ပဌောင်သလဲမည်မဟုတ်ပါ။ သို့သော် ASG ကို မကဌာသေသမီကမဟ ဖဌန့်ကျက်ထာသပါက၊ ကစည်သမျဉ်သသည် ၎င်သ၏ဆာဗာမျာသ၏ အမျာသဆုံသတစ်မိနစ်အတလင်သ အရေအတလက် ဆယ်ခုသို့ရောက်ရဟိရန် သေချာစေမည်ဖဌစ်သည်။ ကသည်မဟာ လုံသဝကို အံဝင်ခလင်ကျ ချဉ်သကပ်မဟုမဟုတ်ပါ၊ ဆယ်ခုမဟ ဆာဗာနဟစ်ခုနဟင့် နောက်သို့ ကဌီသမာသသော ခုန်ခဌင်သမျာသသည်လည်သ သုံသစလဲသူမျာသအတလက် ပဌဿနာဖဌစ်စေနိုင်သည်။
  • ASG တလင်တက်ကဌလသောဆာဗာအရေအတလက်ကိုဆုံသဖဌတ်ရန် AWS API ကိုအသုံသပဌုသည့်စိတ်ကဌိုက် script တစ်ခုကိုဖန်တီသပါ၊ ၎င်သကိုပဌင်ပဒေတာအရင်သအမဌစ်ကိုအသုံသပဌု၍ခေါ်ဆိုပါ (စာမျက်နဟာ 249 တလင် "ပဌင်ပဒေတာအရင်သအမဌစ်" ကိုကဌည့်ပါ) နဟင့် ASG ၏အလိုရဟိသော_capacity ကန့်သတ်ဘောင်ကို ပဌန်ပေသသည့်တန်ဖိုသအဖဌစ် သတ်မဟတ်ပါ။ ဇာတ်ညလဟန်သ။ ကနည်သအာသဖဌင့်၊ ASG အသစ်တစ်ခုစီသည် လက်ရဟိ Terraform ကုဒ်ကဲ့သို့ တူညီသောစလမ်သရည်ဖဌင့် အမဌဲလည်ပတ်နေမည်ဖဌစ်ပဌီသ ထိန်သသိမ်သရန် ပိုမိုခက်ခဲစေသည်။

ဟုတ်ပါတယ်၊ Terraform သည် လုံသဝစက်ရပ်သလာသခဌင်သမျာသအတလက် စံပဌအာသဖဌင့် Built-in ပံ့ပိုသမဟုရဟိပဌီသ၊ သို့သော် 2019 ခုနဟစ် မေလတလင် HashiCorp အဖလဲ့သည် ကလုပ်ဆောင်ချက်ကို ထည့်သလင်သရန် အစီအစဉ်မရဟိပါ (အသေသစိတ် - ဒီမဟာ).

မဟန်ကန်သောအစီအစဥ်ကို မအောင်မဌင်နိုင်ပါ။

တစ်ခါတစ်ရံတလင် plan command သည် ပဌီသပဌည့်စုံသော မဟန်ကန်သော ဖဌန့်ကျက်မဟု အစီအစဉ်ကို ဖန်တီသပေသသော်လည်သ အသုံသချသည့် command သည် error တစ်ခု ပဌန်ပေသသည်။ ဥပမာအာသဖဌင့်၊ အခန်သ 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.

အကယ်၍ သင်သည် apply command ကို run ပါက အောက်ပါ error ကို ရရဟိလိမ့်မည် ။

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 အသုံသပဌုသူမျာသအတလက်သာမက အရင်သအမဌစ်တိုင်သနီသပါသတလင် ဖဌစ်ပလာသနိုင်သည်။ တစ်စုံတစ်ယောက်သည် ကအရင်သအမဌစ်ကို ကိုယ်တိုင်ဖန်တီသခဌင်သ သို့မဟုတ် အမိန့်ပေသစာလိုင်သကို အသုံသပဌုခဌင်သ ဖဌစ်နိုင်သော်လည်သ၊ ကိုက်ညီသော ID မျာသသည် ပဋိပက္ခမျာသကို ဖဌစ်စေသည်။ Terraform တလင် အသစ်ဝင်လာသူမျာသကို အံ့အာသသင့်စေသည့် ကအမဟာသမျိုသကလဲမျာသစလာရဟိသည်။

အဓိကအချက်မဟာ terraform plan command သည် Terraform state file တလင် သတ်မဟတ်ထာသသည့် အရင်သအမဌစ်မျာသကိုသာ ထည့်သလင်သတလက်ချက်ခဌင်သဖဌစ်သည်။ အရင်သအမဌစ်မျာသကို တစ်နည်သတစ်ဖုံ ဖန်တီသထာသလျဟင် (ဥပမာ၊ AWS ကလန်ဆိုသလ်တလင် ကိုယ်တိုင်ကလစ်နဟိပ်ခဌင်သဖဌင့်) ၎င်သတို့သည် ပဌည်နယ်ဖိုင်တလင် အကျုံသဝင်မည်မဟုတ်သောကဌောင့် Terraform သည် အစီအစဉ်အမိန့်ကို လုပ်ဆောင်သည့်အခါ ၎င်သတို့ကို ထည့်သလင်သစဉ်သစာသမည်မဟုတ်ပါ။ ရလဒ်အနေဖဌင့်၊ ပထမတစ်ချက်တလင် မဟန်ကန်သည်ဟုထင်ရသော အစီအစဉ်သည် မအောင်မဌင်တော့ပါ။

ဒီကနေ သင်ခန်သစာယူစရာ နဟစ်ခုရဟိတယ်။

  • သင် Terraform နဟင့် စတင်လုပ်ဆောင်နေပဌီဆိုလျဟင်၊ အခဌာသမည်သည့်အရာကိုမျဟ မသုံသပါနဟင့်။ သင်၏အခဌေခံအဆောက်အအုံ၏အစိတ်အပိုင်သကို Terraform ကိုအသုံသပဌု၍ စီမံခန့်ခလဲပါက၊ ၎င်သကို သင်ကိုယ်တိုင်မလမ်သမံနိုင်တော့မည်မဟုတ်ပါ။ မဟုတ်ပါက၊ သင်သည် ထူသဆန်သသော Terraform အမဟာသမျာသကို စလန့်စာသရုံသာမက IaC ၏ အကျိုသကျေသဇူသမျာသစလာကိုလည်သ ငဌင်သဆိုထာသသောကဌောင့် ကုဒ်သည် သင်၏အခဌေခံအဆောက်အည၏ တိကျသောကိုယ်စာသပဌုမဟုမဟုတ်တော့ပါ။
  • သင့်တလင် အခဌေခံအဆောက်အအုံအချို့ရဟိနေပဌီဆိုလျဟင်၊ တင်သလင်သသည့်အမိန့်ကို အသုံသပဌုပါ။ လက်ရဟိအခဌေခံအဆောက်အအုံဖဌင့် Terraform ကို စတင်အသုံသပဌုနေပါက၊ Terraform တင်သလင်သမဟုအမိန့်ကို အသုံသပဌု၍ ၎င်သကို ပဌည်နယ်ဖိုင်တလင် ထည့်သလင်သနိုင်သည်။ ကနည်သဖဌင့် Terraform သည် မည်သည့်အခဌေခံအဆောက်အအုံကို စီမံခန့်ခလဲရန် လိုအပ်သည်ကို သိရဟိမည်ဖဌစ်သည်။ တင်သလင်သသည့်အမိန့်သည် အငဌင်သအခုံနဟစ်ခုကို ယူသည်။ ပထမအချက်မဟာ သင်၏ဖလဲ့စည်သပုံဖိုင်မျာသတလင် ရင်သမဌစ်လိပ်စာဖဌစ်သည်။ ကနေရာတလင် syntax သည် အရင်သအမဌစ်လင့်ခ်မျာသအတလက် တူညီသည်- _. (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 ရင်သမဌစ်ကဌာသရဟိ ပဌည်နယ်ဖိုင်ချိတ်ဆက်မဟုတစ်ခုကို ဖန်တီသပါမည်။ ယခုအချိန်မဟစ၍၊ အစီအစဉ်အမိန့်ကို သင်လုပ်ဆောင်သည့်အခါ၊ Terraform သည် IAM အသုံသပဌုသူရဟိနဟင့်ပဌီသဖဌစ်ကဌောင်သနဟင့် ၎င်သကို ထပ်မံဖန်တီသရန် ကဌိုသစာသမည်မဟုတ်ကဌောင်သ Terraform မဟ သိရဟိမည်ဖဌစ်သည်။

    Terraform တလင် သင်ထည့်သလင်သလိုသည့် အရင်သအမဌစ်မျာသစလာရဟိနေပဌီဆိုလျဟင်၊ ကုဒ်ကို ကိုယ်တိုင်ရေသပဌီသ တစ်ခုချင်သစီကို တစ်ကဌိမ်စီ တင်သလင်သရာတလင် အခက်အခဲဖဌစ်နိုင်သည်ကို သတိပဌုသင့်သည်။ ထို့ကဌောင့် Terraforming (http://terraforming.dtan4.net/) ကဲ့သို့ သင်၏ AWS အကောင့်မဟ ကုဒ်နဟင့် ပဌည်နယ်မျာသကို အလိုအလျောက် တင်သလင်သနိုင်သည့် ကိရိယာတစ်ခုကို ရဟာဖလေရကျိုသနပ်ပါသည်။

    ပဌန်လည်ပဌုပဌင်ခဌင်သသည် ၎င်သ၏ ချို့ယလင်သချက်မျာသ ရဟိနိုင်သည်။

    ပဌန်လည်ပဌုပဌင်ခဌင်သ။ ပဌင်ပအပဌုအမူကို မပဌောင်သလဲဘဲ ထာသခဲ့စဉ်တလင် သင်သည် code ၏အတလင်သပိုင်သတည်ဆောက်ပုံအာသ ပဌောင်သလဲသည့် ပရိုဂရမ်ရေသသာသခဌင်သတလင် လုပ်ရိုသလုပ်စဉ်တစ်ခုဖဌစ်သည်။ ၎င်သသည် ကုဒ်ကို ပိုမိုရဟင်သလင်သစေရန်၊ သပ်ရပ်ပဌီသ ထိန်သသိမ်သရလလယ်ကူစေရန်ဖဌစ်သည်။ ပဌန်လည်ပဌုပဌင်ခဌင်သသည် မရဟိမဖဌစ်လိုအပ်သော နည်သပညာတစ်ခုဖဌစ်ပဌီသ ပုံမဟန်အသုံသပဌုသင့်သည်။ Terraform သို့မဟုတ် အခဌာသသော IaC tool တစ်ခုခုနဟင့် ပတ်သက်လာသောအခါ၊ သင်သည် ကုဒ်အပိုင်သအစ၏ "ပဌင်ပအပဌုအမူ" ၏ ဆိုလိုရင်သကို အလလန်သတိထာသရမည်၊ မဟုတ်ပါက မမျဟော်လင့်ထာသသော ပဌဿနာမျာသ ပေါ်ပေါက်လာမည်ဖဌစ်သည်။

    ဥပမာအာသဖဌင့်၊ အမျာသအာသဖဌင့် refactoring အမျိုသအစာသသည် ပိုမိုနာသလည်နိုင်သော ကိန်သရဟင်မျာသ သို့မဟုတ် လုပ်ဆောင်ချက်မျာသ၏ အမည်မျာသကို အစာသထိုသခဌင်သဖဌစ်သည်။ IDE အမျာသအပဌာသတလင် ပဌန်လည်ပဌုပဌင်ခဌင်သအတလက် built-in ပံ့ပိုသမဟုရဟိပဌီသ ပရောဂျက်တစ်လျဟောက်လုံသတလင် ပဌောင်သလဲနိုင်သော ကိန်သရဟင်မျာသနဟင့် လုပ်ဆောင်ချက်မျာသကို အလိုအလျောက် အမည်ပဌောင်သနိုင်ပါသည်။ ယေဘူယျအာသဖဌင့် ရည်ရလယ်ထာသသော ပရိုဂရမ်သမင်သဘာသာစကာသမျာသတလင်၊ ၎င်သသည် သင်မစဉ်သစာသနိုင်သော အသေသအဖလဲလုပ်ငန်သစဉ်တစ်ခုဖဌစ်သော်လည်သ Terraform တလင် သင်သည် ၎င်သကို အလလန်သတိထာသရမည်ဖဌစ်ပဌီသ သို့မဟုတ်ပါက သင်သည် ပဌတ်တောက်မဟုမျာသကဌုံတလေ့ရနိုင်သည်။

    ဥပမာအာသဖဌင့်၊ webserver-cluster module တလင် input variable cluster_name ရဟိသည်-

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

    foo ဟုခေါ်သော မိုက်ခရိုဆာသဗစ်ကို အသုံသပဌုရန်အတလက် သင်သည် က module ကို စတင်အသုံသပဌုသည်ဟု မဌင်ယောင်ကဌည့်ပါ။ နောက်ပိုင်သတလင်၊ သင်သည် သင်၏ဝန်ဆောင်မဟုကို ဘာသအဖဌစ် အမည်ပဌောင်သလိုပါသည်။ ကပဌောင်သလဲမဟုသည် အသေသအဖလဲဟု ထင်ရသော်လည်သ လက်တလေ့တလင် ၎င်သသည် ဝန်ဆောင်မဟုကို အနဟောင့်အယဟက်ဖဌစ်စေနိုင်သည်။

    အမဟန်မဟာ webserver-cluster module သည် လုံခဌုံရေသအုပ်စုနဟစ်စုနဟင့် ALB ၏ name parameter အပါအဝင် အရင်သအမဌစ်အမျာသအပဌာသတလင် cluster_name variable ကိုအသုံသပဌုသည်-

    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 ဖဌစ်ပါက၊ ၎င်သကိုဖျက်ခဌင်သနဟင့် ဗာသရဟင်သအသစ်ကို ဒေါင်သလုဒ်လုပ်ခဌင်သကဌာသတလင်၊ သင်၏ဝဘ်ဆာဗာသို့ လမ်သကဌောင်သပဌောင်သရန် ယန္တရာသရဟိမည်မဟုတ်ပါ။ အလာသတူပင်၊ လုံခဌုံရေသအဖလဲ့တစ်ခုကို ဖျက်လိုက်လျဟင်၊ အဖလဲ့အသစ်မဖန်တီသမချင်သ သင့်ဆာဗာမျာသသည် မည်သည့်ကလန်ရက်အသလာသအလာကိုမဆို စတင်ငဌင်သပယ်ပါမည်။

    သင်စိတ်ဝင်စာသနိုင်ဖလယ်ရဟိသော ပဌန်လည်ပဌုပဌင်ခဌင်သ၏အခဌာသအမျိုသအစာသမဟာ Terraform ID ကိုပဌောင်သလဲခဌင်သပင်ဖဌစ်သည်။ နမူနာအဖဌစ် webserver-cluster module ရဟိ aws_security_group အရင်သအမဌစ်ကို ယူကဌပါစို့။

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

    ကရင်သမဌစ်၏ ခလဲခဌာသသတ်မဟတ်ခဌင်သကို instance ဟုခေါ်သည်။ ပဌန်လည်ပဌုပဌင်ခဌင်သတလင် သင်သည် ၎င်သအာသ ပိုမိုနာသလည်နိုင်သော (သင့်ထင်မဌင်ယူဆချက်) အမည် cluster_instance သို့ ပဌောင်သလဲရန် ဆုံသဖဌတ်ခဲ့သည်ကို စိတ်ကူသကဌည့်ပါ-

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

    အဆုံသမဟာ ဘာဖဌစ်မလဲ။ မဟန်တယ်- အနဟောင့်အယဟက်တစ်ခု။

    Terraform သည် အရင်သအမဌစ် ID တစ်ခုစီကို cloud ဝန်ဆောင်မဟုပေသသူ ID နဟင့် ဆက်စပ်သည်။ ဥပမာအာသဖဌင့်၊ iam_user သည် AWS IAM အသုံသပဌုသူ ID နဟင့် ဆက်စပ်နေပဌီသ aws_instance သည် AWS EC2 ဆာဗာ ID နဟင့် ဆက်စပ်နေသည်။ အကယ်၍ သင်သည် အရင်သအမဌစ် ID (instance မဟ cluster_instance သို့၊ aws_security_group ကဲ့သို့) Terraform သို့ ပဌောင်သပါက၊ သင်သည် အရင်သအမဌစ်ဟောင်သကို ဖျက်ပဌီသ အသစ်တစ်ခု ထပ်ထည့်လိုက်ခဌင်သကဲ့သို့ ပေါ်လာလိမ့်မည်။ ကအပဌောင်သအလဲမျာသကို သင်အသုံသပဌုပါက၊ Terraform သည် လုံခဌုံရေသအဖလဲ့ဟောင်သကို ဖျက်ပဌီသ အသစ်တစ်ခုဖန်တီသမည်ဖဌစ်ပဌီသ၊ သင်၏ဆာဗာမျာသသည် ကလန်ရက်အသလာသအလာကို စတင်ပယ်ချနေချိန်တလင် Terraform မဟ လုပ်ဆောင်ပေသမည်ဖဌစ်သည်။

    ကသည်မဟာ ကဆလေသနလေသမဟုမဟ သင်ယူသင့်သည့် အဓိကသင်ခန်သစာလေသခုဖဌစ်သည်။

    • အစီအစဉ်အမိန့်ကို အမဌဲသုံသပါ။ ကအရာမျာသအာသလုံသကို ဖော်ထုတ်ပဌသနိုင်သည်။ ၎င်သ၏ထလက်ရဟိမဟုကို ဂရုတစိုက်ပဌန်လည်သုံသသပ်ပဌီသ Terraform သည် မဖျက်သင့်သော အရင်သအမဌစ်မျာသကို ဖျက်ပစ်မည့် အခဌေအနေမျာသကို အာရုံစိုက်ပါ။
    • မဖျက်ခင် ဖန်တီသပါ။ ရင်သမဌစ်တစ်ခုအာသ အစာသထိုသလိုပါက မူရင်သကိုမဖျက်မီ အစာသထိုသတစ်ခုဖန်တီသရန် လိုအပ်သည်ဆိုသည်ကို သေချာစဉ်သစာသပါ။ အဖဌေက ဟုတ်တယ်ဆိုရင် create_before_destroy က ကူညီနိုင်ပါတယ်။ အဆင့်နဟစ်ဆင့်ကို လုပ်ဆောင်ခဌင်သဖဌင့် တူညီသောရလဒ်ကို ကိုယ်တိုင်ရရဟိနိုင်သည်- ပထမညသစလာ ရင်သမဌစ်အသစ်တစ်ခုကို ဖလဲ့စည်သမဟုပုံစံတလင် ထည့်သလင်သပဌီသ သက်ဆိုင်သည့်အမိန့်ကို လုပ်ဆောင်ကာ၊ ထို့နောက် အရင်သအမဌစ်ဟောင်သကို ဖလဲ့စည်သမဟုစနစ်မဟ ဖယ်ရဟာသပဌီသ လျဟောက်ထာသသည့်အမိန့်ကို ထပ်မံအသုံသပဌုပါ။
    • ခလဲခဌာသသတ်မဟတ်မဟုမျာသကို ပဌောင်သလဲခဌင်သသည် အခဌေအနေကို ပဌောင်သလဲရန် လိုအပ်သည်။ ရင်သမဌစ်တစ်ခုနဟင့်ဆက်စပ်နေသော ID ကိုပဌောင်သလဲလိုပါက (ဥပမာ၊ aws_security_group အာသ instance မဟ cluster_instance သို့) အမည်ပဌောင်သလိုပါက၊ ၎င်သ၏ဗာသရဟင်သအသစ်ကိုဖန်တီသလိုပါက Terraform ပဌည်နယ်ဖိုင်ကို အပ်ဒိတ်လုပ်ရပါမည်။ ဒါကို ဘယ်တော့မဟ ကိုယ်တိုင်မလုပ်ပါနဲ့ - အဲဒီအစာသ terraform state command ကိုသုံသပါ။ identifier မျာသကို အမည်ပဌောင်သသည့်အခါ၊ အောက်ပါ syntax ပါရဟိသော terraform state mv command ကို run ရပါမည်။
      terraform state mv <ORIGINAL_REFERENCE> <NEW_REFERENCE>

      ORIGINAL_REFERENCE သည် ၎င်သ၏ လက်ရဟိပုံစံရဟိ အရင်သအမဌစ်ကို ရည်ညလဟန်သသည့် စကာသရပ်ဖဌစ်ပဌီသ NEW_REFERENCE သည် ၎င်သကို သင်ရလဟေ့လိုသည့် နေရာဖဌစ်သည်။ ဥပမာအာသဖဌင့်၊ aws_security_group အဖလဲ့အာသ instance မဟ cluster_instance သို့ အမည်ပဌောင်သသည့်အခါ၊ သင်သည် အောက်ပါ command ကို လုပ်ဆောင်ရန် လိုအပ်သည်-

      $ terraform state mv 
         aws_security_group.instance 
         aws_security_group.cluster_instance

      ၎င်သသည် ယခင်က aws_security_group.instance နဟင့် ယခင်က ဆက်စပ်ခဲ့သည့် အခဌေအနေသည် aws_security_group.cluster_instance နဟင့် ဆက်စပ်သင့်သည်ဟု Terraform အာသ ပဌောပဌသည်။ က command terraform အစီအစဥ်ကို အမည်ပဌောင်သပဌီသ လုပ်ဆောင်ပဌီသနောက်တလင် မည်သည့်ပဌောင်သလဲမဟုမဟ မပဌပါက၊ သင်သည် အရာအာသလုံသကို မဟန်ကန်စလာ လုပ်ဆောင်ခဲ့သည်။

    • အချို့ဆက်တင်မျာသကို ပဌောင်သလဲ၍မရပါ။ အရင်သအမဌစ်မျာသစလာ၏ ကန့်သတ်ချက်မျာသသည် ပဌောင်သလဲ၍မရပါ။ ၎င်သတို့ကို ပဌောင်သလဲရန် ကဌိုသစာသပါက Terraform သည် အရင်သအမဌစ်ဟောင်သကို ဖျက်ပဌီသ ၎င်သ၏နေရာတလင် အသစ်တစ်ခု ဖန်တီသမည်ဖဌစ်သည်။ ရင်သမဌစ်စာမျက်နဟာတစ်ခုစီသည် အမျာသအာသဖဌင့် သတ်မဟတ်ဆက်တင်တစ်ခုကို သင်ပဌောင်သလဲသောအခါ ဘာဖဌစ်သလာသသည်ကို ညလဟန်ပဌပေသမည်ဖဌစ်သောကဌောင့် စာရလက်စာတမ်သမျာသကို သေချာစစ်ဆေသပါ။ အစီအစဉ်အမိန့်ကို အမဌဲတမ်သအသုံသပဌုပဌီသ create_before_destroy နည်သဗျူဟာကို အသုံသပဌုရန် စဉ်သစာသပါ။

    Deferred ညီညလတ်မဟုသည်... ရလဟေ့ဆိုင်သခဌင်သနဟင့် တသမတ်တည်သဖဌစ်သည်။

    AWS ကဲ့သို့ အချို့သော cloud ဝန်ဆောင်မဟုပေသသူမျာသ၏ API မျာသသည် တစ်ပဌိုင်နက်တည်သ နဟောင့်နဟေသကဌန့်ကဌာမဟုရဟိသည်။ Asynchrony ဆိုသည်မဟာ အင်တာဖေ့စ်သည် တောင်သဆိုထာသသောလုပ်ဆောင်ချက်ကို ပဌီသမဌောက်အောင်မစောင့်ဘဲ တုံ့ပဌန်မဟုကို ချက်ချင်သပဌန်ပေသနိုင်သည်ဟု ဆိုလိုသည်။ နဟောင့်နဟေသနေသော တစ်သမတ်တည်သဖဌစ်သော အပဌောင်သအလဲမျာသသည် စနစ်တစ်ခုလုံသတလင် ပဌန့်ပလာသရန် အချိန်ယူရနိုင်သည်၊ ထိုသို့ဖဌစ်နေချိန်တလင် သင်၏တုံ့ပဌန်မဟုမျာသသည် ကလဲလလဲနေပဌီသ မည်သည့်ဒေတာရင်သမဌစ်ပုံတူသည် သင်၏ API ခေါ်ဆိုမဟုမျာသကို တုံ့ပဌန်သည့်အပေါ် မူတည်ပါသည်။

    ဥပမာအာသဖဌင့်၊ သင်သည် EC2 ဆာဗာတစ်ခုဖန်တီသရန် AWS သို့ API ခေါ်ဆိုမဟုကို ပဌုလုပ်သည်ဟု မဌင်ယောင်ကဌည့်ပါ။ API သည် ဆာဗာကိုယ်တိုင်ဖန်တီသရန် မစောင့်ဆိုင်သဘဲ "အောင်မဌင်သော" တုံ့ပဌန်မဟု (201 Created) ကို ချက်ချင်သပဌန်ပေသပါမည်။ ၎င်သကိုချက်ချင်သချိတ်ဆက်ရန်ကဌိုသစာသပါက၊ ထိုအချိန်တလင် AWS သည် အရင်သအမဌစ်မျာသကို စတင်လုပ်ဆောင်နေသေသသည် သို့မဟုတ် တစ်နည်သအာသဖဌင့် ဆာဗာသည် မဖလင့်ရသေသသောကဌောင့် သေချာပေါက်နီသပါသပျက်သလာသမည်ဖဌစ်သည်။ ထို့အပဌင်၊ သင်သည် ကဆာဗာနဟင့်ပတ်သက်သည့် အချက်အလက်ကိုရယူရန် နောက်ထပ်ခေါ်ဆိုပါက၊ သင်သည် အမဟာသအယလင်သ (404 Not Found) ကို ရရဟိနိုင်ပါသည်။ ကအရာသည် က 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

    တစ်နည်သဆိုရသော် သင်သည် ရင်သမဌစ်တစ်ခု (subnet တစ်ခုကဲ့သို့) ဖန်တီသပဌီသ ၎င်သနဟင့်ပတ်သက်သည့် အချက်အလက်အချို့ (အသစ်ဖန်တီသထာသသော subnet ၏ ID ကဲ့သို့) ကိုရယူရန်ကဌိုသစာသပဌီသ Terraform သည် ၎င်သကို ရဟာမတလေ့ပါ။ ကချို့ယလင်သချက်အမျာသစု (6813 အပါအဝင်) ကို ပဌင်ဆင်ပဌီသသော်လည်သ၊ အထူသသဖဌင့် Terraform သည် အရင်သအမဌစ်အမျိုသအစာသအသစ်အတလက် ပံ့ပိုသမဟုထည့်သည့်အခါတလင် ၎င်သတို့သည် အခါအာသလျော်စလာ ဖဌတ်တောက်ဆဲဖဌစ်သည်။ ဒါက စိတ်အနဟောက်အယဟက်ဖဌစ်ပေမဲ့ ကိစ္စတော်တော်မျာသမျာသမဟာ ဘာအန္တရာယ်မဟ မဖဌစ်စေပါဘူသ။ သင် terraform ကိုထပ်မံအသုံသပဌုသောအခါ၊ အရာအာသလုံသသည်အလုပ်လုပ်သင့်သည်၊ အဘယ်ကဌောင့်ဆိုသော်ကအချိန်တလင်အချက်အလက်မျာသသည်စနစ်တစ်ခုလုံသပျံ့နဟံ့သလာသလိမ့်မည်။

    ကကောက်နုတ်ချက်ကို Evgeniy Brikman ၏ စာအုပ်မဟ တင်ပဌထာသပါသည်။ "Terraform- ကုဒ်အဆင့်ရဟိ အခဌေခံအဆောက်အည".

source: www.habr.com

မဟတ်ချက် Add