Выполнение домашнего задания по теме "15.2. Вычислительные мощности. Балансировщики нагрузки"
Q/A
Домашнее задание будет состоять из обязательной части, которую необходимо выполнить на провайдере Яндекс.Облако, и дополнительной части в AWS (можно выполнить по желанию). Все домашние задания в 15 блоке связаны друг с другом и в конце представляют пример законченной инфраструктуры. Все задания требуется выполнить с помощью Terraform, результатом выполненного домашнего задания будет код в репозитории. Перед началом работ следует настроить доступ до облачных ресурсов из Terraform, используя материалы прошлых лекций и ДЗ.
Задание 1
Вся конфигурация terraform прописана в директории terraform. Для запуска необходимо скопировать файл
variables.tf.example в variables.tf и проставить актуальные
значения для всех переменных: yandex_cloud_id, yandex_folder_id, yandex_cloud_token.
Последнее значение можно получить выполнив команду yc iam create-token.
- Создать bucket Object Storage и разместить там файл с картинкой:
- Создать bucket в Object Storage с произвольным именем;
Для создания бакета необходимо сделать несколько предварительных действий, а именно:
-
Создать сервисный аккаунт
resource "yandex_iam_service_account" "os-service-account" { name = "os-service-account" } -
Назначить сервисному аккаунту роль
editorresource "yandex_resourcemanager_folder_iam_member" "os-editor" { folder_id = var.yandex_folder_id role = "storage.editor" member = "serviceAccount:${yandex_iam_service_account.os-service-account.id}" } -
Создать токен доступа для данного сервисного аккаунта:
resource "yandex_iam_service_account_static_access_key" "os-static-key" { service_account_id = yandex_iam_service_account.os-service-account.id description = "static access key for object storage" }
После этого можно создать сам бакет:
resource "yandex_storage_bucket" "os-netology-bucket" {
access_key = yandex_iam_service_account_static_access_key.os-static-key.access_key
secret_key = yandex_iam_service_account_static_access_key.os-static-key.secret_key
bucket = "os-netology-bucket"
anonymous_access_flags {
read = true
list = false
}
}
Блок anonymous_access_flags необходим для того, чтобы иметь возможность публичного доступа к загруженным в бакет файлам.
- Положить в bucket файл с картинкой;
Для загрузки картинки необходимо создать новый объект:
resource "yandex_storage_object" "cute-cat-picture" {
bucket = yandex_storage_bucket.os-netology-bucket.bucket
access_key = yandex_iam_service_account_static_access_key.os-static-key.access_key
secret_key = yandex_iam_service_account_static_access_key.os-static-key.secret_key
key = "cute-cat"
source = "./static/cute_cat.jpg"
content_type = "image/jpg"
acl = "public-read"
}
- Сделать файл доступным из Интернет.
После применения конфигурации terraform файл будет доступен по ссылке staticUrl из output.
- Создать группу ВМ в public подсети фиксированного размера с шаблоном LAMP и web-страничкой, содержащей ссылку на картинку из bucket:
- Создать Instance Group с 3 ВМ и шаблоном LAMP. Для LAMP рекомендуется использовать
image_id = fd827b91d99psvq5fjit;
Для создания виртуальных машин будет использовано описание объекта yandex_compute_instance_group. Основные моменты:
-
Объявление, что в группе будет находиться ровно 3 виртуальные машины
# inside os-lamp-group scale_policy { fixed_scale { size = 3 } } -
Для подключения группы к подсети необходимо, чтобы сервисному аккаунту была назначена роль
vpc.user:resource "yandex_resourcemanager_folder_iam_member" "os-vpc-user" { folder_id = var.yandex_folder_id role = "vpc.user" member = "serviceAccount:${yandex_iam_service_account.os-service-account.id}" } -
Для создания виртуальных маши необходимо, чтобы сервисному аккаунту была назначена роль
editor:
resource "yandex_resourcemanager_folder_iam_member" "os-global-editor" {
folder_id = var.yandex_folder_id
role = "editor"
member = "serviceAccount:${yandex_iam_service_account.os-service-account.id}"
}
- Для создания стартовой веб-страницы рекомендуется использовать раздел
user_dataв meta_data;- Разместить в стартовой веб-странице шаблонной ВМ ссылку на картинку из bucket;
В описании ключа user_data используется нотация cloud-init.
Таким образом, для начала необходимо создать файл конфигурации cloud-config.yaml с содержимым:
---
write_files:
- content: |
<!DOCTYPE html>
<html lang="en">
...
</html>
path: "/var/www/html/index.html"
owner: ubuntu:www-data
permissions: '0774'
Здесь в content расположено содержимое html-файла, которое будет показано при запросе к web-серверу.
Затем, необходимо добавить чтение данного файла:
# inside os-lamp-group.instance_template
metadata = {
user-data = file("./cloud-config.yaml")
}
// TODO [PERMISSION_DENIED] Permission denied to folder b1gktcsaacdrp521naiv, folder b1gktcsaacdrp521naiv
- Настроить проверку состояния ВМ.
Для настройки проверки состояния ВМ необходимо в конфигурацию группы добавить объект healthcheck:
# inside os-lamp-group
health_check {
interval = 5
timeout = 3
healthy_threshold = 2
unhealthy_threshold = 2
http_options {
path = "/index.html"
port = 80
}
}
- Подключить группу к сетевому балансировщику:
- Создать сетевой балансировщик;
// todo
- Проверить работоспособность, удалив одну или несколько ВМ.
// todo