Files
netology-devops/src/homework/07-terraform/7.3/readme.md

100 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Выполнение [домашнего задания](https://github.com/netology-code/virt-homeworks/blob/master/07-terraform-03-basic/README.md)
по теме "7.3. Основы и принцип работы Terraform".
## Q/A
### Задание 1
> Создадим бэкэнд в S3
Документация по подключению бэкенда s3 к `terraform`:
* [настройка terraform](https://www.terraform.io/language/settings/backends/s3)
* [руководство по настройке yandex.cloud](https://cloud.yandex.ru/docs/tutorials/infrastructure-management/terraform-state-storage)
Первым шагом необходимо создать сервисный аккаунт по [документации](https://cloud.yandex.ru/docs/iam/operations/sa/create).
Для этого необходимо выполнить следующую команду:
```shell
yc iam service-account create --name my-robot
```
Следующим шагом нужно добавить сервисному аккаунту роль `editor` по [документации](https://cloud.yandex.ru/docs/iam/operations/sa/assign-role-for-sa).
Далее необходимо создать новый ключ доступа. Для этого нужно выполнить команду:
```shell
yc iam access-key create --service-account-name my-robot
```
Из вывода необходимо сохранить значения ключей `key_id` и `secret`, которыми необходимо заполнить
значения переменных окружения `YC_STORAGE_ACCESS_KEY` и `YC_STORAGE_SECRET_KEY` соответственно.
Для удобства, унесём файл с переменными окружения на верхний уровень: [.env.example](./.env.example) и [.env](./.env).
Затем необходимо создать новый бакет с именем `netology-tf-state` в `Object Storage` по [инструкции](https://cloud.yandex.ru/docs/storage/operations/buckets/create).
После всех приготовлений нужно вынести конфигурацию провайдера в файл [provider.tf](./terraform/provider.tf) и обновить конфигурацию следующим образом:
```terraform
terraform {
required_providers {
yandex = {
source = "yandex-cloud/yandex"
}
}
required_version = ">= 0.13"
backend "s3" {
endpoint = "storage.yandexcloud.net"
bucket = "netology-tf-state"
region = "ru-central1"
key = "tf/default.tfstate"
access_key = "service_account_access_key_id"
secret_key = "service_account_access_key_secret"
skip_region_validation = true
skip_credentials_validation = true
}
}
provider "yandex" {
token = "auth_token_here"
cloud_id = "cloud_id_here"
folder_id = "folder_id_here"
zone = "ru-central1-a"
}
```
Как и в прошлый раз, сам провайдер конфигурируется из переменных окружения. При этом настроить `backend` из переменных окружения напрямую невозможно из-за ограничений `terraform`.
Для этого необходимо воспользоваться флагом конфигурации `-backend-config` у команды `terraform init`.
Таким образом, команда инициализации примет вид:
```shell
source .env
cd ./terraform \
&& env $(cat ../.env) terraform init \
-backend-config="access_key=${YC_STORAGE_ACCESS_KEY}" \
-backend-config="secret_key=${YC_STORAGE_SECRET_KEY}"
```
### Задание 2
> Инициализируем проект и создаем воркспейсы.
>
> 1. Выполните `terraform init`:
> * если был создан бэкэнд в S3, то терраформ создат файл стейтов в S3.
> * иначе будет создан локальный файл со стейтами.
> 2. Создайте два воркспейса `stage` и `prod`.
> 3. В уже созданный `yandex_compute_instance` добавьте зависимость типа инстанса от вокспейса,
> что бы в разных ворскспейсах использовались разные `instance_type`.
> 5. Добавим `count`. Для `stage` должен создаться один экземпляр, а для `prod` два.
> 6. Создайте рядом еще один `yandex_compute_instance`, но теперь определите их количество при помощи `for_each`, а не `count`.
> 7. Что бы при изменении типа инстанса не возникло ситуации, когда не будет ни одного инстанса добавьте параметр
> жизненного цикла `create_before_destroy = true` в один из рессурсов `yandex_compute_instance`.
> 8. При желании поэкспериментируйте с другими параметрами и рессурсами.
>
> В виде результата работы пришлите:
> * Вывод команды `terraform workspace list`.
> * Вывод команды `terraform plan` для воркспейса `prod`.
// todo