Files
netology-devops/src/homework/15-cloud-providers/15.2

Выполнение домашнего задания по теме "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.

  1. Создать bucket Object Storage и разместить там файл с картинкой:
  • Создать bucket в Object Storage с произвольным именем;

Для создания бакета необходимо сделать несколько предварительных действий, а именно:

  • Создать сервисный аккаунт

    resource "yandex_iam_service_account" "os-service-account" {
        name = "os-service-account"
    }
    
  • Назначить сервисному аккаунту роль editor

    resource "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.

  1. Создать группу ВМ в 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
  }
}
  1. Подключить группу к сетевому балансировщику:
  • Создать сетевой балансировщик;

// todo

  • Проверить работоспособность, удалив одну или несколько ВМ.

// todo