Рубрики
Uncategorized

Terraform EP2 — Ручная!

สรุป มา จาก Введение в Terraform และ ด้วย ข้อมูล จาก จาก Официальный документ จาก ep ที่ เรา น่า จะ พ … с меткой Terrform, DevOps, IAC, AWS.

สรุป มา จาก Введение в Terraform และ เสริม ข้อมูล จาก Официальный док

จาก ep ที่ เรา น่า จะ พอ เข้าใจ เข้าใจ Terraform แล้ว ว่า มัน อะไร คราว นี้ เรา มา ลง มือ เล่น กัน เถอะ โดย มาลอง ทำ ทำ кластер ของ Веб -сервер พร้อม ด้วย Балансир нагрузки บน aws ด้วย Terraform กัน กัน กัน

ถ้า ใคร ไม่ ใช้ ทั้ง Terraform และ aws ทำใจ ร่ม ๆ ไว้ เลย เพราะ ผม ไม่ เคย เรา มา เรียน รู้ มัน พร้อม ๆ กัน

Темы

  • Установите Terraform
  • Синтаксис конфигурации терраформ
  • Настройка учетной записи AWS
  • Развернуть один сервер
  • Развернуть один веб -сервер
  • Играть с переменными
  • Развернуть кластер веб -серверов
  • Развернуть балансировщик нагрузки

การ Установить Terraform นั้น ทำ ง่าย มาก โดย แค่ ไป Скачать двоичный файл จาก Официальный сайт ตาม Система และ Архитектура процессора ของ เรา แล้ว แล้ว ได้ เลย ซึ่ง สามารถ ดู Учебник นี้ ได้ เลย

เนื่อง จาก ผม บน บน ubuntu ดัง ผม ผม แสดง แค่ แค่ Ubuntu นะ ครับ

$ sudo -i
$ wget https://releases.hashicorp.com/terraform/0.12.23/terraform_0.12.23_linux_amd64.zip
$ unzip terraform_0.12.23_linux_amd64.zip
$ mv terraform /usr/local/sbin/
$ terraform 
Usage: terraform [-version] [-help]  [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you''re just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    console            Interactive console for Terraform interpolations
    destroy            Destroy Terraform-managed infrastructure
    env                Workspace management
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initialize a Terraform working directory
    login              Obtain and save credentials for a remote host
    logout             Remove locally-stored credentials for a remote host
    output             Read an output from a state file
    plan               Generate and show an execution plan
    providers          Prints a tree of the providers used in the configuration
    refresh            Update local state file against real resources
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version
    workspace          Workspace management

All other commands:
    0.12upgrade        Rewrites pre-0.12 module source code for v0.12
    debug              Debug output management (experimental)
    force-unlock       Manually unlock the terraform state
    push               Obsolete command for Terraform Enterprise legacy (v1)
    state              Advanced state management

Terraform ใช้ Hcl Syntax ใน การ настройка ซึ่ง สามารถ อ่าน แบบ เต็ม ได้ จาก จาก GitHub ของ HCl ใน ที่ นี้ จะ เกริ่น คร่าว ๆ ถึง Синтаксис клавиши หลัก ๆ ความ เข้าใจ ซัก เล็กน้อย ดัง นี้ นี้ นี้

  • Аргументы : เป็น การ назначить ค่า กับ ตัว แปร ใน ใน hcl документ มัก จะ เรียก ว่า ว่า ว่า ว่า ว่า ว่า ว่า ว่า ว่า ว่า ว่า «Атрибут» แต่ ใน Terraform ใช้ ว่า ว่า Атрибут กับ Ресурс อื่น แล้ว เลย เลี่ยง ใช้ คำ ว่า «Аргумент» แทน

  • Блоки : เป็น เป็น ที่ เก็บ Содержание อื่น เพื่อ ใช้ ใน การ กำหนด กำหนด กำหนด กำหนด Спецификация ของ Ресурс ที่ เรา ต้องการ Создать โดย โครง สร้าง จะ เป็น <Тип> <Метка#1> <Метка#2> ... <метка#n>> {...} และ Блок สามารถ ซ้อน เป็น вложенный блок ได้

  • Идентификаторы : คือ ชื่อ ของ สิ่ง ต่าง ๆ ใน Конфигурация เช่น Имена аргументов, имена типов блока, ресурсы และ Входные переменные เป็น สามารถ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ ใช้ แต่ ไม่ ควร цифры ขึ้น ต้น เพราะ ให้ สับสน แต่ ไม่ ควร ใช้ ขึ้น เพราะ ให้ ให้ สับสน สับสน สับสน สับสน สับสน สับสน สับสน สับสน สับสน ให้ ให้ ให้ ให้ ให้ ให้ ให้ ให้ กับ เลข จริง ๆ

  • Комментарии : สามารถ

    • ใช้ # (по умолчанию) ใน การ Комментарий แต่ละ บรรทัด
    • ใช้ // ใน การ Комментарий แต่ละ บรรทัด
    • ใช้ /* ... */ ใน การ Комментарий หลาย บรรทัด
  • Кодирование символов и линейные окончания : Конфигурация ของ Terraform เป็น UTF-8 แต่ DeLimiter ยัง ต้อง เป็น ascii อยู่ แบ่ง บรรทัด สามารถ เป็น ได้ ทั้ง ทั้ง ทั้ง ทั้ง unix-стиль (только LF) และ стиль Windows (CR, тогда LF) แต่ ถูกต้อง ต้อง เป็น unix-стиль

  • Переменные : ชนิด ตัว แปร หลัก ๆ มี ดัง นี้

    • строка : ตัวหนังสือ
    • номер : ตัว เลข
    • Bool : true หรือ Неверно
    • список (тип) : เป็น Список โดย ใน Список ต้อง เป็น Тип เดียว กัน และ มี ลำดับ ลำดับ ลำดับ

    • set (type) : เหมือน Список แต่ Элемент ต้อง ซ้ำ กัน และ ไม่ มี Порядок เพราะ มัน จะ Sort จาก ไป มาก โดย อัตโนมัติ อัตโนมัติ อัตโนมัติ อัตโนมัติ

    • кортеж ([, …]) เหมือน Список แต่ Элемент ต่าง Тип กัน ได้

    • Карта (тип) : ใช้ เก็บ Пара ключевых значений

    • Object ({ = , …}) : ใช้ เก็บ Пара клавиш значений แต่ ต่าง Тип กัน ได้

เรา มาลอง กัน ตัว แปรกัน ดี กว่า โดย เรา ใช้ ใช้ Команда Консоль Terraform เพื่อ взаимодействовать กับ Файл конфигурации ของ เราดู

$ mkdir -p terraform-variables && cd terraform-variables
$ cat > main.tf << EOF
variable "myvar" {
  type = string
  default = "hello terraform"
}

variable "mymap" {
  type = map(string)
  default = {
    mykey = "my value"
  }
}

variable "mylist" {
  type = list
  default = [1,2,3]
}
EOF
$ terraform console
> var.myvar                 # Access variable แบบที่ 1
hello terraform
> "${var.myvar}"            # Access variable แบบที่ 2
hello terraform
> var.mymap
{
  "mykey" = "my value"
}
> var.mymap["mykey"]        # Access variable ที่เป็น Map โดยระบุ key ที่ต้องการเข้าถึง
my value
> var.mylist
[
  1,
  2,
  3,
]
> var.mylist[0]             # Access variable แบบ list index ที่ 0
1
> var.mylist[1]             # Access variable แบบ list index ที่ 1
2
> var.mylist[2]             # Access variable แบบ list index ที่ 2
3
> element(var.mylist, 0)    # Access variable แบบ list index ที่ 0 โดยใช้ function "element"
1
> element(var.mylist, 1)    # Access variable แบบ list index ที่ 1 โดยใช้ function "element"
2
> element(var.mylist, 2)    # Access variable แบบ list index ที่ 2 โดยใช้ function "element"
3
> slice(var.mylist, 0, 2)   # Slice list เพื่อดึงเฉพาะค่าที่ต้องการ
[
  1,
  2,
]
> exit
  1. ถ้า ใคร ไม่ มี มี เรา สามารถ สมัคร ใช้ บริการ Бесплатный уровень ได้ 1 ปี แต่ ต้อง บัตร บัตร ด้วย อย่า ไป กลัว 1 ปี นี้ ไม่ เสีย ตังค์แน่นอน 😎 😎
  2. ทำ การ Вход ด้วย Электронная почта ของ โดย เลือก เลือก เป็น root пользователь
  3. ทำ การ สร้าง สร้าง สร้าง ชื่อ ชื่อ ชื่อ «terraform» และ สิทธิ์ สิทธิ์ «Amazonec2fullaccess» เพื่อ ให้ Terraform เข้า ไป สั่ง งาน สร้าง ec2 (เป็น เรียก เรียก vm ของ aws) ผ่าน api ของ aws
    • กด ที่ «Сервисы» ตรง มุม ซ้าย บน
    • พิมพ์ «Iam» ใน ช่อง Поиск แล้ว กด ที่ «Я»
    • ใน หน้า «Я»

      • กด «Пользователи» ตรง Меню ทาง ซ้าย
      • กด ปุ่ม «Добавить пользователя» สี น้ำ เงิน
    • ใน หน้า «Добавить пользователя»

      • ช่อง «Имя пользователя» ใส่ «Terraform»
      • ช่อง «Тип доступа» เลือก «Программный доступ»
      • กด ปุ่ม «Далее: разрешения»
      • เลือก «Добавить пользователя в группу»
      • กด ปุ่ม «Создать группу» จะ มี всплывающее окно «Создать группу» ปรากฏ มา มา มา มา มา

        • ช่อง «Имя группы» ใส่ «Terraform-addministrator»
        • เลือก Политика «Amazonec2fullaccess»
        • กด ปุ่ม «Создать группу» สี น้ำ เงิน
      • เมื่อ กลับ มา หน้า «Добавить пользователя» กด ปุ่ม «Далее: теги» สี น้ำ เงิน
      • กด ปุ่ม «Далее: обзор» สี น้ำ เงิน
      • กด ปุ่ม «Создать пользователя» สี น้ำ เงิน
      • ถ้า ✔ «Успех» กด ปุ่ม «Скачать .CSV» เพื่อ เก็บ Идентификатор ключа доступа และ Ключ секретного доступа เอา ใช้ กับ กับ Terraform ต่อ ไป ไป ไป
      • กด ปุ่ม «Закрывать»
    • จะ ได้ Пользователь ดัง นี้

ถ้า คุณ ใช้ Редактор ต่าง เช่น เช่น vim, emacs, превосходный текст, атом, визуальный студийный код หรือ intellij ลอง Поиск หา «hcl» ดู จะ ช่วย выделение синтаксиса ให้ ดู ง่าย ขึ้น

  1. ทำ การ Установите учетные данные ของ aws ให้ กับ оболочка ของ คุณ ก่อน เอา ข้อมูล มา จาก CSV -файл ที่ เรา Скачать มา ก่อน หน้า นี้ นี้ นี้ นี้ นี้ นี้ นี้ นี้

  2. สร้าง Файл конфигурации Terraform เพื่อ สร้าง ec2 1 Сервер

    ใน การ สร้าง ec2 เรา ทำ การ ระบุ ระบุ Изображение ที่ ใช้ สร้าง สร้าง серверы ด้วย ami-id ซึ่ง เรา หา ami-id ที่ เรา ต้องการ ได้ จาก

    1. เข้า EC2 Консоль
    2. เลือก область ที่ เรา สร้าง ec2
    3. กด ที่ Амис แล้ว เลือก Публичное изображение แล้วหา Ami-id ที่ ต้องการ

    อธิบาย

    • поставщик : เป็น การ ระบุ Облачный провайдер ที่ ต้องการ นั่น นั่น คือ AWS
    • регион : เป็น เป็น ของ aws ที่ ต้องการ ต้องการ สร้าง สร้าง ec2
    • ресурс : ใช้ ระบุ Ресурс ที่ สร้าง ใน ที่ นี้ จะ สร้าง สร้าง สร้าง สร้าง aws_instance (EC2) โดย ให้ ชื่อ ว่า ว่า пример
    • ami : ระบุ ami-id ของ Изображение ที่ จะ ใช้ สร้าง สร้าง Сервер สามารถ หา ได้ จาก AWS Marketplace
    • exance_type : กำหนด Размер ของ Сервер ที่ ต้องการ สร้าง สามารถ ดู Тип ทั้งหมด ได้ จาก Типы экземпляров Amazon EC2
  3. ทำ การ สร้าง EC2 ด้วย Terraform

  4. เข้า ไป ผล งาน ของ เรา กัน กัน กัน กัน

  5. ทำ การ เพิ่ม ярлык ให้ กับ EC2 ที่ เพิ่ม สร้าง ไป ไป

  6. เข้า ไป ผล งาน จะ เห็น ว่า ec2 เรา ชื่อ ชื่อ แล้ว แล้ว

ใน หัวข้อ นี้ จะ มา ทำ ให้ ให้ ec2 ของ เป็น เป็น Веб -сервер ง่าย บน บน порт 8080 ซึ่ง ตอบ แค่ แค่ แค่ แค่ «Привет, мир» ด้วย Сценарий ดัง นี้

#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p 8080 &

วิธี ที่ ควร ทำ ทำ ทำ Custome Image ด้วย упаковщик แล้ว สร้าง ec2 ใหม่ จาก Изображение นั้น ใน ใน นี้ เรา จะ ทำ ง่าย ๆ ด้วย การ ให้ ให้ Изображение. Пользовательские данные ซึ่ง จะ ถูก запустить ตอน загрузку เครื่อง ขึ้น มา มา มา มา มา

และ เพื่อ เรา เข้า ถึง หน้า หน้า จาก นอก ได้ ต้อง ต้อง เพิ่ม Группа безопасности เพื่อ Разрешить трафик จาก นอก ผ่าน ทาง ทาง Порт 8080 ด้วย

ใน การ Применить группу безопасности ให้ EC2 เรา ต้อง ใส่ ID ของ Группа безопасности ไป ใน Атрибут ของ EC2 ด้วย เนื่อง จาก จาก เรา ไม่ รู้ ID ของ Группа безопасности เรา Ссылка ค่า โดย ใช้ Формат ดัง นี้ นี้

Format: [_..]
Result: [aws_security_group.instance.id]

การ ทำ Ссылка นี้ เป็น การ สร้าง «неявная зависимость» เป็น ผล เวลา ที่ Terraform ทำ มัน จะ ไป ไป สร้าง Группа безопасности ก่อน เพื่อ ให้ ได้ ID แล้ว จึง นำ มา Применить ให้ ec2 ใช้ งาน งาน งาน งาน งาน

เวลา ที่ Терраформ

ลง มือ กัน เลย 🖐

  1. เรา จะ แก้ไข main.tf อีก ด้วย การ เพิ่ม บรรทัด ที่ มี เครื่อง หมาย + ดัง นี้

  2. ทำ การ Применить конфигурацию ใหม่ เรา เพิ่ง ทำ ไป ไป

  3. ไป ดู งาน ของ เรา กัน จะ เห็น ว่า ec2 อัน เก่า ถูก ถูก ไป แล้ว และ มี ec2 ใหม่ ขึ้น มา แทน เป็น เพราะ เพราะ เพราะ ทำ แบบ แบบ ดัง นั้น นั้น การ ภาย ใน ec2 การ การ การ นั้น สร้าง ใหม่ เท่า เปลี่ยนแปลง ภาย ภาย นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น นั้น

  4. ใน ส่วน ของ Группа безопасности ก็ มี การ Создать และ Разрешить порт 8080 เรียบร้อย

  5. ลอง เข้า Интернет ใช้ ใช้ public ip ของ ec2 ของ เรา ก็ จะ ได้ ได้ ได้ «Привет, мир» กลับ มา

ก่อน ไป สร้าง кластер ยัง จำ Не повторяйся (сухая) Принцип กัน ได้ รึเปล่า จำ ได้ จะ เห็น ว่า เรา เรา มี การ Определите порт 8080 ซ้ำ 2 รอบ คือ ที่ Группа безопасности และ Пользовательские данные

เรา มา ให้ มัน ไม่ ซ้ำ กัน ก่อน ดี กว่า ด้วย Входная переменная

Входные переменные

Синтаксис ของ Входная переменная เป็น ดัง นี้

Синтаксис

variable "NAME" {
    [CONFIG ...]
}

Пример

variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}

ใน ส่วน ของ [config …] จะ ประกอบ ด้วย 3 параметры คือ

  • Описание : เป็น อธิบาย ตัว แปร นี้ ว่า ใช้ ทำ อะไร ค่า นี้ จะ แสดง ตอน план และ применить ด้วย
  • по умолчанию : เป็น การ ค่า ค่า Значение по умолчанию ให้ ตัว แปร ดัง กล่าว โดย เรา สามารถ สามารถ ของ ตัว แปร ตอน ตอน ตอน ตอน применить ได้ ด้วย

    • การ ใช้ -Вар Вариант แล้ว пройти ค่า ตัว แปร เข้า มา มา มา มา มา

    • การ ใช้ -var-file Вариант แล้ว Переход файл ที่ ค่า ของ ตัว แปร เข้า ไป ไป ไป ไป ไป

    • การ ใช้ Переменная среда ใน Формат tf_var_

    • ถ้า เรา ไม่ กำหนด กำหนด Значение по умолчанию และ ได้ ได้ проход ค่า เข้า ไป ไป จะ ถาม เรา ทาง หน้า Клемма

  • Тип : เป็น การ กำหนด Тип ของ ตัว แปร สามารถ เป็น ทั้ง ทั้ง строка, номер, bool, list, map, set, object, tuple หรือ any (ถ้า ไม่ ใส่ по умолчанию เป็น any)

ใน การ งาน เรา สามารถ เข้า ถึง ด้วย var. ซึ่ง ทำ เรา นำ ไป แทน ค่า ใน main.tf ได้ ดัง นี้

  • ใน ส่วน Группа безопасности

  • ใน ส่วน ของ Пользовательские данные นั้น เป็น ดัง นั้น เวลา ที่ จะ ไป แทน คน ต้อง ใช้ выражение "$ {...}" ซึ่ง เรียก ว่า интерполяция

ดัง นั้น main.tf ใหม่ เป็น แบบ แบบ นี้

provider "aws" {
    region = "us-east-2"
}

variable "server_port" {
  description = "The port the server will use for HTTP requests"
  type        = number
  default     = 8080
}

resource "aws_instance" "example" {
    ami           = "ami-0c55b159cbfafe1f0"
    instance_type = "t2.micro"
    vpc_security_group_ids = [aws_security_group.instance.id]
    user_data = <<-EOF
                #!/bin/bash
                echo "Hello, World" > index.html
                nohup busybox httpd -f -p "${var.server_port}" &
                EOF
    tags = {
        Name = "terraform-example"
    }
}

resource "aws_security_group" "instance" {
    name = "terraform-example-instance"
    ingress {
        from_port   = var.server_port
        to_port     = var.server_port
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

Выходная переменная

เป็น การ ค่า ต่าง ๆ ที่ ได้ จาก การ ทำ งาน มา ใส่ ตัว แปร เพื่อ ให้ เรา นำ ไป ใช้ งาน ไป โดย เรา สามารถ ให้ แสดง หลัง จาก ที่ ทำ การ терраформ применить เรียบร้อย หรือ ไว้ ใช้ แต่ ตอน เรียก ใช้ ด้วย Команда Terraform вывод ก็ ได้

Синтаксис

output "" {
    value = 
    [CONFIG ...]
}

Пример

output "public_ip" {
    value       = aws_instance.example.public_ip
    description = "The public IP of the web server"
}

output "private_ip" {
    value       = aws_instance.example.private_ip
    description = "The private IP of the web server"
    sensitive   = true
}

ใน ส่วน ของ [config …] มี ได้ 2 параметры คือ

  • Описание : เป็น อธิบาย ตัว แปร นี้ ว่า ใช้ เก็บ ค่า อะไร อะไร อะไร
  • чувствительный : ถ้า เป็น True คือ чувствительный จะ ไม่ ค่า ของ ของ переменная หลัง จาก терраформ применить เสร็จ

ถ้า หาก เรา запустить терраформ применить ซ้ำ เป็น ครั้ง ที่ 2 Terraform จะ ทำ อะไร อะไร จาก แสดง ค่า ค่า ออก ออก มา

$ terraform apply
aws_security_group.instance: Refreshing state... [id=sg-0d7d9b50531db13c5]
aws_instance.example: Refreshing state... [id=i-0db21cb267f702ce7]

Apply complete! Resources: 0 added, 0 changed, 0 destroyed.

Outputs:

private_ip = 
public_ip = 18.191.93.62

เพื่อ ป้องกัน การ Применить โดย และ เพื่อ ให้ สะดวก ต่อ การ นำ ไป เขียน Сценарий เพื่อ งาน ต่อ ไป สามารถ ใช้ ใช้ Терраформ выход เพื่อ ดึง เฉพาะ Выход ออก แสดง โดย ไม่ подать заявление

$ terraform output
private_ip = 
public_ip = 18.191.93.62

$ terraform output private_ip
172.31.45.142

$ terraform output public_ip
18.191.93.62

ทำลาย สิ่ง เรา เพิ่ง สร้าง ไป เตรียม ตัว ทำ кластер กัน

$ terraform destroy

(...)

Terraform will perform the following actions:

  # aws_instance.example will be destroyed
  - resource "aws_instance" "example" {
      (...)

  # aws_security_group.instance will be destroyed
  - resource "aws_security_group" "instance" {
      (...)

Plan: 0 to add, 0 to change, 2 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

aws_instance.example: Destroying... [id=i-0db21cb267f702ce7]
aws_instance.example: Still destroying... [id=i-0db21cb267f702ce7, 10s elapsed]
aws_instance.example: Still destroying... [id=i-0db21cb267f702ce7, 20s elapsed]
aws_instance.example: Still destroying... [id=i-0db21cb267f702ce7, 30s elapsed]
aws_instance.example: Destruction complete after 40s
aws_security_group.instance: Destroying... [id=sg-0d7d9b50531db13c5]
aws_security_group.instance: Destruction complete after 2s

Destroy complete! Resources: 2 destroyed.

ถ้า เรา ทำ ทำ Web ทั้ง แล้ว มี แค่ แค่ แค่ เดียว คง จะ เป็น เรื่อง ที่ เสี่ยง น้อย เพราะ ถ้า หาก มัน ล่ม ขึ้น มา เป็น ว่า จบ กัน ดัง นั้น หาก ให้ เรา สร้าง สร้าง เป็น อัน ว่า กัน นั้น เพื่อ ให้ สมจริง เรา มา สร้าง สร้าง สร้าง ของ ของ กัน เป็น เพื่อ ก็ สมจริง สมจริง เรา

ใน การ ทำ кластер ใน aws นั้น จะ ใช้ ใช้ ใช้ ใช้ Автоматическое масштабирование группа (ASG) ใน การ Запуск серверов EC2 เพราะ นอก จาก จะ Запуск ได้ หลาย Серверы ใน เดียว แล้ว มัน ยัง ช่วย Мониторинг здоровья ของ Серверы และ ช่วย ช่วย ช่วย ช่วย ช่วย ช่วย Сервер перезапуска ที่ отказ หรือ нездоровый ให้ ด้วย และ ที่ ขาด ไม่ ได้ มัน ยัง ช่วย ปรับ ของ ของ кластер

แต่ ก่อน สร้าง สร้าง asg เรา ต้อง สร้าง Запуск конфигурации ก่อน โดย Конфигурация запуска ทำ หน้าที่ เป็น Шаблон ที่ ระบุ Спецификация ใน การ Запуск EC2 ของ ASG

จาก ห้ว ข้อ ก่อน หน้า สามารถ นำ ข้อมูล มา เขียน Спецификация ของ Конфигурация запуска ได้ ดัง นี้

resource "aws_launch_configuration" "example" {
  image_id        = "ami-0c55b159cbfafe1f0"
  instance_type   = "t2.micro"
  security_groups = [aws_security_group.instance.id]
  user_data = <<-EOF
              #!/bin/bash
              echo "Hello, World" > index.html
              nohup busybox httpd -f -p "${var.server_port}" &
              EOF
  lifecycle {
    create_before_destroy = true
  }
}

จาก Настройка ข้าง บน ของ ใหม่ แค่ 1 อัน คือ Настройки жизненного цикла ซึ่ง เป็น ตัว กำหนด วิธี ใน การ การ Создать และ Уничтожить ресурс โดย по умолчанию คือ ของ เก่า ก่อน แล้ว ค่อย สร้าง ใหม่ แต่ การ Установка ให้ create_before_destroy คือ สร้าง ให้ ก่อน แล้ว ค่อย ทำลาย ของ เก่า เก่า เก่า เก่า

จาก นั้น เรา มา ดู Спецификация ของ asg ที่ จะ ให้ ให้ Terraform Create ให้ ดัง นี้ นี้

data "aws_availability_zones" "all" {}

resource "aws_autoscaling_group" "example" {
  launch_configuration = aws_launch_configuration.example.id
  availability_zones   = data.aws_availability_zones.all.names
  min_size = 2
  max_size = 10
  tag {
    key                 = "Name"
    value               = "terraform-asg-example"
    propagate_at_launch = true
  }
}

จาก Спецификация ข้าง บน ใน кластер นี้ มี มี ec2 อยู่ 2 — 10 серверов ขึ้น กับ กับ трафик โดย ให้ Сервер запустить แยก ใน ทุก ๆ Доступные зоны (AZS) มาก ที่ เท่า ที่ จะ ทำ ได้ เพื่อ ที่ ว่า ถ้า มี az ไหน Fail ไป ได้ ไม่ กระทบ Сервис ของ เรา

โดย AZS คือ Центр обработки данных ของ aws ที่ ขาด ออก จาก จาก กัน ทั้ง น้ำ ไฟ และ ทำ ทำ เย็น แต่ อยู่ ใน ใน เดียว เดียว กัน กัน กัน กัน

แล้ว ทำไม data.aws_availability_zones.all.names หมาย ถึง ทุก az ล่ะ?

Данные คือ Источник данных เป็น ดึง ข้อมูล มา จาก จาก จาก จาก จาก จาก จาก จาก จาก จาก จาก จาก จาก ถูก ที่ นี้ คือ คือ aws) ใน ครั้ง ที่ ที่ Terraform ถูก Запуск ตัวอย่าง Данные ที่ สามารถ ดึง จาก จาก Провайдеры ก็ เช่น Данные VPC , Данные подсети , AMI IDS , Диапазоны IP -адреса В Идентификация текущего пользователя และ อื่น อีก มากมาย มากมาย

ใน การ งาน เรา ต้อง Определите มัน ก่อน ดัง นี้ นี้ นี้ นี้

Формат

data "_" "" {
    [CONFIG ...]
}

Пример

data "aws_availability_zones" "all" {}

โดย [config …] ของ aws_availability_zones สามารถ ดู ได้ จาก док

ส่วน การ เข้า จะ เป็น Формат ดัง นี้

Format: data._..
Result: data.aws_availability_zones.all.names

ดัง นั้น สามารถ สร้าง Cluster ของ EC2 ด้วย ASG ดัง นี้ นี้

  1. สร้าง Файл конфигурации ใหม่ เพื่อ สร้าง кластер

  2. ทำ การ สร้าง кластер

  3. ตรวจสอบ EC2 ที่ เรา Создать ไป กด ที่ ที่ экземпляр

  4. ตรวจสอบ Конфигурация запуска ที่ เรา Создать ไป โดย กด ที่ «Запуск конфигурации»

  5. ตรวจสอบ Конфигурация запуска ที่ เรา Создать ไป โดย กด ที่ «Группы автоматического масштабирования»

เรียบร้อย! ต่อ ไป เรา มา ทำ ที่ ช่วย ช่วย Поделитесь нагрузкой ไป ทุก ทุก Сервер ใน asg เรา ที่ Поддержка การ Автоматическое масштабирование ของ asg ด้วย กัน ต่อดี กว่า กว่า กว่า กว่า กว่า

ตอน นี้ เรา หลาย หลาย Сервер เพื่อ หน้าที่ เป็น เป็น Веб -сервер ละ ต่อ มา ที่ เรา ต้อง ทำ เพิ่ม คือ คือ คือ เพื่อ ช่วย แจก แจก ไป ยัง ทุก ทุก ใน ใน ของ เรา โดย ผู้ ใช้ จะ ได้ ได้ ip ของ ของ ผ่าน การ เรา โดย ผู้ งาน จะ ได้ ip ของ ของ ผ่าน การ เรา โดย ผู้ งาน จะ ได้ ip ของ ของ ผ่าน การ เรา โดย ใช้) จาก DNS

เช่น เดิม จะ ใช้ Услуга Amazon Elastic Load Balancer (ELB) ของ aws ซึ่ง มี Автоматическое масштабирование และ ทำ การ การ отказоустойчивость ได้ โดย по умолчанию โดย elb มี 3 แบบ คือ คือ คือ

  • Приложение нагрузка балансировщика (ALB): เหมาะ สำหรับ Http และ https трафик
  • Балансировщик нагрузки сети (NLB): เหมาะ สำหรับ TCP и UDP -трафик
  • Классический балансировщик нагрузки (CLB): เป็น แบบ Legacy ใช้ ได้ ทั้ง http, https และ tcp แต่ มี น้อย น้อย กว่า alb และ nlb

ใน ตัวอย่าง นี้ ใช้ ใช้ Clb เพราะ Настройка ง่าย โดย สามารถ ดู ราย ละเอียด เพิ่มเติม ของ elb ได้ จาก док

โดย Конфигурация ของ elb และ Группа безопасности เป็น ดัง นี้

variable "elb_port" {
    description = "The port the server will use for HTTP load balancer"
    type        = number
    default     = 80
}

resource "aws_elb" "example" {
    name               = "terraform-asg-example"
    security_groups    = [aws_security_group.elb.id]
    availability_zones = data.aws_availability_zones.all.names
    # This add a health checking for ASG
    health_check {
        target              = "HTTP:${var.server_port}/"
        interval            = 30
        timeout             = 3
        healthy_threshold   = 2
        unhealthy_threshold = 2
    }
    # This adds a listener for incoming HTTP requests.
    listener {
        lb_port           = var.elb_port
        lb_protocol       = "http"
        instance_port     = var.server_port
        instance_protocol = "http"
    }
}

resource "aws_security_group" "elb" {
    name = "terraform-example-elb"
    # Allow all outbound
    egress {
        from_port   = 0
        to_port     = 0
        protocol    = "-1"
        cidr_blocks = ["0.0.0.0/0"]
    }
    # Inbound HTTP from anywhere
    ingress {
        from_port   = 80
        to_port     = 80
        protocol    = "tcp"
        cidr_blocks = ["0.0.0.0/0"]
    }
}

จาก Настройка

  • Определите ตัว แปร
  • Определите CLB โดย ให้ Слушайте порт 80 (по умолчанию) แล้ว Поделиться загрузкой ไป ยัง Порт 8080 ของ экземпляр ใน ASG
  • CLB ของ เรา มี การ Бэкэнд проверки здоровья ด้วย ตัว ไหน Неудача จะ ได้ ส่ง ส่ง трафик ไป
  • เช่น เดียว กับ ec2 เรา ต้อง Настройка «Группа безопасности» ให้ Разрешить трафик ขา จาก จาก порт 80 ของ Балансировщик нагрузки และ Разрешить ขา ออก ทั้งหมด ทั้งหมด ทั้งหมด ทั้งหมด ทั้งหมด ทั้งหมด ทั้งหมด ทั้งหมด ทั้งหมด

เมื่อ เรา ได้ Clb แล้ว ต้อง เพิ่ม เพิ่ม Конфигурация ของ asg ให้ регистр ตัว ไป ยัง Clb เพื่อ รับ трафик ด้วย ดัง นี้ นี้ นี้ นี้ นี้

resource "aws_autoscaling_group" "example" {
    launch_configuration = aws_launch_configuration.example.id
    availability_zones   = data.aws_availability_zones.all.names

    min_size = 2
    max_size = 10

    # Register ASG ไปยัง CLB 
    load_balancers    = [aws_elb.example.name]
    health_check_type = "ELB"

    tag {
        key                 = "Name"
        value               = "terraform-asg-example"
        propagate_at_launch = true
    }
}

และ เพื่อ ให้ ได้ доменное имя ของ Clb เรา เพิ่ม Выход ดัง นี้ นี้

output "clb_dns_name" {
    value       = aws_elb.example.dns_name
    description = "The domain name of the load balancer"
}

ดัง นั้น มา สร้าง Clb ให้ asg ของ กัน ดัง นี้ นี้ นี้

  1. สร้าง Конфигурация ใหม่ ของ cluster.tf โดย เพิ่ม CLB, группа безопасности, вывод ASG และ DNS

  2. ทำ การ Применить конфигурацию

  3. ตรวจสอบ Балансировщики нагрузки ที่ เพิ่ม เพิ่ม Создать ไป โดย กด ที่ «Балансировщики нагрузки»

  4. ตรวจสอบ Группа безопасности ที่ เรา เพิ่ม Создать ไป กด กด ที่ «Группы безопасности»

  5. ลอง เข้า Интернет ตาม домен ที่ ได้ มา มา มา มา มา

  6. ทำลาย ทุก ให้ หมด หมด

$ terraform destroy

(...)

Terraform will perform the following actions:

  # aws_autoscaling_group.example will be destroyed
  - resource "aws_autoscaling_group" "example" {
      (...)

  # aws_elb.example will be destroyed
  - resource "aws_elb" "example" {
      (...)

  # aws_launch_configuration.example will be destroyed
  - resource "aws_launch_configuration" "example" {
      (...)

  # aws_security_group.elb will be destroyed
  - resource "aws_security_group" "elb" {
      (...)

  # aws_security_group.instance will be destroyed
  - resource "aws_security_group" "instance" {
      (...)

Plan: 0 to add, 0 to change, 5 to destroy.

Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

aws_autoscaling_group.example: Destroying... [id=tf-asg-20200319075725933800000002]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 10s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 20s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 30s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 40s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 50s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 1m0s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 1m10s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 1m20s elapsed]
aws_autoscaling_group.example: Still destroying... [id=tf-asg-20200319075725933800000002, 1m30s elapsed]
#aws_autoscaling_group.example: Destruction complete after 1m39s
aws_elb.example: Destroying... [id=terraform-asg-example]
aws_launch_configuration.example: Destroying... [id=terraform-20200319075721931300000001]
aws_launch_configuration.example: Destruction complete after 1s
aws_security_group.instance: Destroying... [id=sg-022d3b1e15e652188]
aws_security_group.instance: Destruction complete after 3s
aws_elb.example: Destruction complete after 5s
aws_security_group.elb: Destroying... [id=sg-0aa521374a7f5a184]
aws_security_group.elb: Still destroying... [id=sg-0aa521374a7f5a184, 10s elapsed]
aws_security_group.elb: Destruction complete after 16s

Destroy complete! Resources: 5 destroyed.

จบ แย้ว ววววว …. ยาวหน่อย นะ ถ้า ลอง ทำ ตาม สนุกแน่นอน 🤯🤯🤯 🤯🤯🤯 🤯🤯🤯 🤯🤯🤯

Оригинал: «https://dev.to/peepeepopapapeepeepo/terraform-ep2-hand-on-2cbl»