![](https://habrastorage.org/getpro/habr/upload_files/162/78e/d49/16278ed4904cbf2200c0db749a5131d2.jpg)
Оглавление
Ссылки
Некоторые ссылки требует VPN
Ресурсы
Вчера мы остановились на инициализации 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” с некоторым обязательным и не очень параметрами:
name - имя, отображаемое в веб консоле
resources - мощности нашего сервера
boot_disk - образ для загрузки (операционная система)
network_interface - настройки подсети, в которой будет наш сервер
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 могут быть другие параметры по умолчанию. На данном этапе мы многое оставляем на усмотрение провайдеру, но нам все равно понадобится:
id одной из подсетей
ami - id загрузочного образа с ubuntu
ami - образ ОС
subnet_id - id подсети в дефолтной VPS
tags:Name - имя для веб консоли
instance_type - тип сервера с уже указанными ресурсами CPU и RAM (у aws много типов, есть и конфигурируемые и с уже установленными значениями CPU и RAM)
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 создал папку .terraform
c провайдером.
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](https://habrastorage.org/getpro/habr/upload_files/6e4/0fd/7c1/6e40fd7c11a885e5dea0c5b0744f9726.png)
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](https://habrastorage.org/getpro/habr/upload_files/376/9ca/69a/3769ca69a51c5ac855e5e3f6c5c5b33d.png)
Что бы удалить все, что мы создали:
terraform destroy
Заключение
Пока что не ясно, в чем польза от использования terraform, но будем двигаться постепенно, и со временем увидим всю мощь IaC.
Любые вопросы пишите на почту v.valentinvolkov@gmail.com. Буду рад помочь!