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

16278ed4904cbf2200c0db749a5131d2.jpg

Оглавление

  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-0ba17020efe0c6d63	2022-08-10T20:12:59.000Z	679593333241	aws-marketplace
ami-0a2b8744b4fe77f92	2022-08-10T13:30:28.000Z	099720109477	None
ami-0936df414c3c7102d	2022-07-12T21:19:05.000Z	679593333241	aws-marketplace
ami-0852b274a4f812259	2022-07-12T20:33:43.000Z	099720109477	None
ami-0cf0e44936aed3a6f	2022-07-08T07:46:22.000Z	679593333241	aws-marketplace
ami-0407a4995711db777	2022-07-08T07:00:05.000Z	099720109477	None
...

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 consoleYandex 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 consoleAWS console

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

terraform destroy

Заключение

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

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

© Habrahabr.ru