diff --git a/readme.md b/readme.md index 52e9a08..e36e87d 100644 --- a/readme.md +++ b/readme.md @@ -73,3 +73,4 @@ * [14.4. Сервис-аккаунты](/src/homework/14-kubernetes-security/14.4) * [14.5. SecurityContext, NetworkPolicies](/src/homework/14-kubernetes-security/14.5) * [15.1. Организация сети](/src/homework/15-cloud-providers/15.1) +* [15.2. Вычислительные мощности. Балансировщики нагрузки](/src/homework/15-cloud-providers/15.2) diff --git a/src/homework/15-cloud-providers/15.2/readme.md b/src/homework/15-cloud-providers/15.2/readme.md new file mode 100644 index 0000000..a2d58e7 --- /dev/null +++ b/src/homework/15-cloud-providers/15.2/readme.md @@ -0,0 +1,111 @@ +Выполнение [домашнего задания](https://github.com/netology-code/clokub-homeworks/blob/clokub-5/15-2.md) +по теме "15.2. Вычислительные мощности. Балансировщики нагрузки" + +## Q/A + +> Домашнее задание будет состоять из обязательной части, которую необходимо выполнить на провайдере Яндекс.Облако, +> и дополнительной части в AWS (можно выполнить по желанию). Все домашние задания в 15 блоке связаны друг с другом +> и в конце представляют пример законченной инфраструктуры. Все задания требуется выполнить с помощью Terraform, +> результатом выполненного домашнего задания будет код в репозитории. Перед началом работ следует настроить доступ до облачных ресурсов из Terraform, +> используя материалы прошлых лекций и ДЗ. + +### Задание 1 + +Вся конфигурация terraform прописана в директории [terraform](./terraform). Для запуска необходимо скопировать файл +[variables.tf.example](./terraform/variables.tf.example) в [variables.tf](./terraform/variables.tf) и проставить актуальные +значения для всех переменных: `yandex_cloud_id`, `yandex_folder_id`, `yandex_cloud_token`. +Последнее значение можно получить выполнив команду `yc iam create-token`. + +> 1. Создать bucket Object Storage и разместить там файл с картинкой: +> - Создать bucket в Object Storage с произвольным именем; + +Для создания бакета необходимо сделать несколько предварительных действий, а именно: +* Создать сервисный аккаунт + + ```terraform + resource "yandex_iam_service_account" "os-service-account" { + name = "s3-service-account" + } + ``` + +* Назначить сервисному аккаунту роль `editor` + + ```terraform + 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}" + } + ``` + +* Создать токен доступа для данного сервисного аккаунта: + + ```terraform + 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" + } + ``` + +После этого можно создать сам бакет: + +```terraform +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 файл с картинкой; + +Для загрузки картинки необходимо создать новый объект: + +```terraform +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`. + +> 2. Создать группу ВМ в public подсети фиксированного размера с шаблоном LAMP и web-страничкой, содержащей ссылку на картинку из bucket: +> - Создать Instance Group с 3 ВМ и шаблоном LAMP. Для LAMP рекомендуется использовать `image_id = fd827b91d99psvq5fjit`; + +// todo + +> - Для создания стартовой веб-страницы рекомендуется использовать раздел `user_data` в [meta_data](https://cloud.yandex.ru/docs/compute/concepts/vm-metadata); + +// todo + +> - Разместить в стартовой веб-странице шаблонной ВМ ссылку на картинку из bucket; + +// todo + +> - Настроить проверку состояния ВМ. + +// todo + +> 3. Подключить группу к сетевому балансировщику: +> - Создать сетевой балансировщик; + +// todo + +> - Проверить работоспособность, удалив одну или несколько ВМ. + +// todo diff --git a/src/homework/15-cloud-providers/15.2/terraform/.gitignore b/src/homework/15-cloud-providers/15.2/terraform/.gitignore new file mode 100644 index 0000000..3309aee --- /dev/null +++ b/src/homework/15-cloud-providers/15.2/terraform/.gitignore @@ -0,0 +1,38 @@ +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sentitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +# +*.tfvars + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc +.terraform.lock.hcl + +variables.tf diff --git a/src/homework/15-cloud-providers/15.2/terraform/main.tf b/src/homework/15-cloud-providers/15.2/terraform/main.tf new file mode 100644 index 0000000..b77a792 --- /dev/null +++ b/src/homework/15-cloud-providers/15.2/terraform/main.tf @@ -0,0 +1,70 @@ +terraform { + required_providers { + yandex = { + source = "yandex-cloud/yandex" + } + } + required_version = ">= 0.13" +} + +provider "yandex" { + token = var.yandex_cloud_token + cloud_id = var.yandex_cloud_id + folder_id = var.yandex_folder_id + zone = "ru-central1-a" +} + +resource "yandex_iam_service_account" "os-service-account" { + name = "s3-service-account" +} + +// Назначение роли сервисному аккаунту +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 + } +} + +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" +} + +output "os" { + value = { + "staticUrl": "https://${yandex_storage_bucket.os-netology-bucket.bucket}.storage.yandexcloud.net/${yandex_storage_object.cute-cat-picture.key}" + } +} + +#resource "yandex_vpc_network" "network-vpc" { +# name = "network-vpc" +#} + +#output "ips" { +# value = { +# +# } +#} diff --git a/src/homework/15-cloud-providers/15.2/terraform/static/cute_cat.jpg b/src/homework/15-cloud-providers/15.2/terraform/static/cute_cat.jpg new file mode 100644 index 0000000..40b1e3d Binary files /dev/null and b/src/homework/15-cloud-providers/15.2/terraform/static/cute_cat.jpg differ diff --git a/src/homework/15-cloud-providers/15.2/terraform/variables.tf.example b/src/homework/15-cloud-providers/15.2/terraform/variables.tf.example new file mode 100644 index 0000000..244f0f4 --- /dev/null +++ b/src/homework/15-cloud-providers/15.2/terraform/variables.tf.example @@ -0,0 +1,16 @@ +# Заменить на ID своего облака +# https://console.cloud.yandex.ru/cloud?section=overview +variable "yandex_cloud_id" { + default = "b1gu1gt5nqi6lqgu3t7s" +} + +# Заменить на Folder своего облака +# https://console.cloud.yandex.ru/cloud?section=overview +variable "yandex_folder_id" { + default = "b1gaec42k169jqpo02f7" +} + +# OAuth токен, используемый утилитой yc. Применялся на этапе с packer. +variable "yandex_cloud_token" { + default = "" +}