Terraform за 15 дней (AWS/Yandex cloud). День 2: Поднимаем сервера

от автора

Оглавление

  1. День 1: Введение

  2. День 2: Поднимаем сервера

Ссылки

Некоторые ссылки требует VPN

Справочник команд CLI aws

Справочник команд CLI yc

Terraform provider aws

Terraform provider Yandex

Ресурсы

Вчера мы остановились на инициализации terraform. Сегодня мы поднимем одну машину в дефолтной сети с дефолтными настройками. И Яндекс и aws изначально создают вам одну VPC и подсети в ней.

Напомню, что в terraform мы описываем сущности почти как в JSON:

resource "<НАЗВАНИЕ_РЕСУРСА>" "<ИМЯ>" {   <ПАРАМЕТР> = <ЗНАЧЕНИЕ>  <ДРУГОЙ_ПАРАМЕТР> = { <ПАРАМЕТР> = <ЗНАЧЕНИЕ> } ... }

Сегодня нам потребуется:

  • Получить id подсети в которой мы хотим поднять сервер

  • Выбрать операционную систему (у каждого облачного сервиса свой список доступных ОС, но ubuntu, как правило, есть везде). Крупные сервисы предоставляют возможность создать свои собственные образы, на основе существующих; например, с предустановленными программами и настройками. Мы возьмем ubuntu 22.04 из списка доступных. Как правило, версии ОС обновляются регулярно: от еженедельных обновлений до ежедневных (речь о внутренних версия сервиса, у aws и Яндекса они свои собственные)

  • Создать ресурс (сервер) соответсвующий нашим требования.

Параметры у aws и yandex примерно одинаковые.

Яндекс

С прошлого раза у нас есть id облака и папки в облаке. Сейчас нам понадобится:

  • id одной из подсетей (уже существующих). Выбираем любую.

  • Так же нам понадобится id загрузочного образа (image_id) ubuntu 22.04 из списка доступных.

  • Добавить новый ресурс — “yandex_compute_instance с некоторым обязательным и не очень параметрами:

yc vpc subnet list  +----------------------+-----------------------+----------------------+----------------+---------------+-----------------+ |          ID          |         NAME          |      NETWORK ID      | ROUTE TABLE ID |     ZONE      |      RANGE      | +----------------------+-----------------------+----------------------+----------------+---------------+-----------------+ | b0cqcohb42om4kvtpb9m | default-ru-central1-c | enpk6fkud1ei8pbp0rp0 |                | ru-central1-c | [10.130.0.0/24] | | e2lrmvnkpav8j1qtd1lb | default-ru-central1-b | enpk6fkud1ei8pbp0rp0 |                | ru-central1-b | [10.129.0.0/24] | | e9bdgo95ucmut6r7pioq | default-ru-central1-a | enpk6fkud1ei8pbp0rp0 |                | ru-central1-a | [10.128.0.0/24] | +----------------------+-----------------------+----------------------+----------------+---------------+-----------------+

Возможно у вас, в будущем, уже вышла другая версия ubuntu. Это не принципиально.--folder-id standard-images означает, что мы ищем образы в папке со стандартными образами; точно так же можно искать пользовательские образы у себя в папке.

yc compute image get-latest-from-family ubuntu-2204-lts \ --folder-id standard-images  id: fd8v0s6adqu3ui3rsuap folder_id: standard-images created_at: "2022-08-22T10:46:23Z" name: ubuntu-22-04-lts-v20220822 description: ubuntu 22.04 lts family: ubuntu-2204-lts storage_size: "5326766080" min_disk_size: "5368709120" product_ids:   - f2e7rond1c6brcfkq1po status: READY os:   type: LINUX pooled: true

yandex/main.tf

terraform {   required_providers {     yandex = {       source = "yandex-cloud/yandex"     }   } }  provider "yandex" {   token     = "AQA...C0A" # *OAuth-токен яндекса* # не обязательный параметр (берется облако по умолчанию), # хотя в документации написано иначе   cloud_id  = "b1gos1rh49bip4rnmrmg"   folder_id = "b1gjju43i1pr11i5c4ic"   zone      = "ru-central1-a" }  # ресурс "yandex_compute_instance" т.е. сервер # Terraform будет знаеть его по имени "yandex_compute_instance.default" resource "yandex_compute_instance" "default" {    name = "test-instance" platform_id = "standard-v1" # тип процессора (Intel Broadwell)    resources {     core_fraction = 5 # Гарантированная доля vCPU     cores  = 2 # vCPU     memory = 1 # RAM   }    boot_disk {     initialize_params {       image_id = "fd8v0s6adqu3ui3rsuap" # ОС (Ubuntu, 22.04 LTS)     }   }    network_interface {     subnet_id = "e9bdgo95ucmut6r7pioq" # одна из дефолтных подсетей     nat = true # автоматически установить динамический ip   } }

aws

C aws дело обстоит похожим образом. Но, надо понимать, что в aws могут быть другие параметры по умолчанию. На данном этапе мы многое оставляем на усмотрение провайдеру, но нам все равно понадобится:

aws ec2 describe-subnets \\     --query "Subnets[*].SubnetId" \\     --region eu-north-1      [ "subnet-3155417b", "subnet-4dd73d36", "subnet-82b67deb" ]

Важно: в aws в каждом регионе свои образы (они одинаковые, но id разный), поэтому --region необходимо указывать.

aws ec2 describe-images \\     --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64*" \\     --region eu-north-1 \\     --query 'Images[*].[ImageId,CreationDate,OwnerId,ImageOwnerAlias]' \\            --output text | sort -k2 -r

Нас интересует последняя версия НЕ из aws-marketplace — ami-0a2b8744b4fe77f92. 099720109477 — это id владельца образа (если вы создадите свой образ, там будет ваш id)

ami-0ba17020efe0c6d632022-08-10T20:12:59.000Z679593333241aws-marketplace ami-0a2b8744b4fe77f922022-08-10T13:30:28.000Z099720109477None ami-0936df414c3c7102d2022-07-12T21:19:05.000Z679593333241aws-marketplace ami-0852b274a4f8122592022-07-12T20:33:43.000Z099720109477None ami-0cf0e44936aed3a6f2022-07-08T07:46:22.000Z679593333241aws-marketplace ami-0407a4995711db7772022-07-08T07:00:05.000Z099720109477None ...

aws/main.tf

provider "aws" {   access_key = "AK..."   secret_key = "2X..."   region = "eu-north-1" }  # ресурс "aws_instance" т.е. сервер # terraform будет знаеть его по имени "aws_instance.default" resource "aws_instance" "default" {   ami           = "ami-0a2b8744b4fe77f92" # ОС (Ubuntu, 22.04 LTS)   instance_type = "t3.micro" # тип процессора и ресурс машины (CPU и RAM) subnet_id = "subnet-3155417b" # одна из дефолтных подсетей associate_public_ip_address = true # автоматически установить динамический ip tags = {     Name = "test-instance" } }

Запуск

В директории aws или yandex по очереди запускаем команды

terraform init terraform plan terraform apply

В терминале после команды plan и apply мы видим примерно одно и тоже — описание того, что terraform собирается делать. Не поленитесь и ознакомьтесь с содержимым. И сравните вывод с атрибутами из документации к провайдеру terraform.

Я считаю, это должно войти в привычку: перепроверять себя с командой plan. Terraform указывает, какие ресурсы он сможет изменить без пересоздания, а какие нет; какой именно параметр требует пересоздания ресурса. Также указаны те параметры, что неизвестны вовремя создания, и будут доступны после. Пока ограничимся просто запущенной машиной.

Если все в порядке, после apply вводим yes и наблюдаем… Должно получится что-то похожее:

yc compute instance list  +----------------------+---------------+---------------+---------+---------------+-------------+ |          ID          |     NAME      |    ZONE ID    | STATUS  |  EXTERNAL IP  | INTERNAL IP | +----------------------+---------------+---------------+---------+---------------+-------------+ | fhm5706an0ae4hl6jk9l | test-instance | ru-central1-a | RUNNING | 51.250.83.254 | 10.128.0.27 | +----------------------+---------------+---------------+---------+---------------+-------------+
Yandex cloud console
Yandex cloud console
aws ec2 describe-instances \\ --region eu-north-1 \\ --query "Reservations[*].Instances[*].{Instance:InstanceId,Name:Tags[?Key=='Name']|[0].Value}" \\ --output table    --------------------------------------------------------- |                   DescribeInstances                   | +-------------+-----------------------+-----------------+ |     AZ      |       Instance        |      Name       | +-------------+-----------------------+-----------------+ |  eu-north-1c|  i-083f3610e0930b98a  |  test-instance  | +-------------+-----------------------+-----------------+
AWS console
AWS console

Что бы удалить все, что мы создали:

terraform destroy

Заключение

Пока что не ясно, в чем польза от использования terraform, но будем двигаться постепенно, и со временем увидим всю мощь IaC.

Любые вопросы пишите на почту v.valentinvolkov@gmail.com. Буду рад помочь!


ссылка на оригинал статьи https://habr.com/ru/post/685062/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *