Блокировка состояний Terraform в Яндекс.Облаке

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Данный вопрос возник при миграции облачных ресурсов в Яндекс.Облако. Официальная документация, к сожалению, не даёт ответа на этот счёт, как и гуглёж. Однако, можно применить подход, который используется в другом облачном провайдере - AWS.

Для чего нужна блокировка состояний (state locking): когда с облаком работает более одного человека, необходимо предотвратить возможность одновременного изменения ресурсов разными людьми. Иначе есть вероятность, в лучшем случае, просто повредить state (а восстановление может занять довольно много времени), в худшем же - запороть продуктовый сервис. Подробнее можно прочесть в документации.

В AWS вопрос блокировок решается через таблицу DynamoDB. В Яндекс.Облаке есть аналогичный сервис - Yandex Managed Service for YBD (далее просто YDB).

Предполагается, что у нас уже создан создан бакет в Object Storage, и есть сервисный аккаунт с правами записи в этот бакет.

Назначим этому сервисному аккаунту роль для работы с YDB

yc resource-manager folder add-access-binding <folder-id> \
  --role ydb.editor \
  --subject serviceAccount:<service-account-id>

Теперь создадим базу данных

yc ydb database create terraform-state-lock --serverless

Далее создадим таблицу. Для этого есть два пути:

  1. через вэб-интерфейс:

1. в дашборде Managed Service for YDB

2. база "terraform-state-lock"

3. Навигация

4. Создать таблицу

5. Тип: документная, колонка "LockID" типа String которая будет ключем партицирования

  1. c помощью AWS CLI, указав Document API эндпоинт базы данных (посмотреть можно на главной странице базы. Имеет вид https://docapi.serverless.yandexcloud.net/ru-central1/<folder-id>/<database-id>)

aws dynamodb create-table \
  --table-name terraform-state-lock \
  --attribute-definitions \
    AttributeName=LockID,AttributeType=N \
  --key-schema \
    AttributeName=LockID,KeyType=HASH \
  --endpoint <document-api-endpoint>

Остаётся только обновить настройки terraform backend, добавив параметры

dynamodb_endpoint = "<document-api-endpoint>"
dynamodb_table = "tettaform-state-lock"

И выполнить реконфигурацию

terraform init -reconfigure

Теперь, пока кто-то выполняет операции записи в бэкенд (terraform apply/delete), все остальные будут получать ошибку вида

terraform apply -target=module.test
╷
│ Error: Error acquiring the state lock
│
│ Error message: ConditionalCheckFailedException: Condition not satisfied
│ Lock Info:
│   ID:        <...>
│   Path:      <...>
│   Operation: OperationTypeApply
│   Who:       <...>
│   Version:   1.3.7
│   Created:   <...>
│   Info:
│
│
│ Terraform acquires a state lock to protect the state from being written
│ by multiple users at the same time. Please resolve the issue above and try
│ again. For most commands, you can disable locking with the "-lock=false"
│ flag, but this is not recommended.

На этом всё. Надеюсь, данную инструкцию многие найдут полезной.

Источник: https://habr.com/ru/post/711982/


Интересные статьи

Интересные статьи

Terraform за 15 дней (AWS/Yandex). День 1Мы от простого к сложному, поднимем небольшую инфраструктуру на aws и Яндекс (актуальность последнего я думаю объяснять не нужно). Так что по итогу вы сможете ...
Привет, Хабр! Разрешите поделиться своим велосипедом. Речь пойдет о минималистичном менеджере состояний React, интерфейс которого состоит из одной функции — createShared(). GitHub репозиторий прое...
Здравствуйте! Меня зовут Артём Сидельников, я работаю в юридической фирме «Тимофеев/Черепнов/Калашников». Сейчас мы ведём дело, в котором пытаемся оспорить блокировку криптовалютного ...
Но если для интернет-магазина, разработанного 3–4 года назад «современные» ошибки вполне простительны потому что перед разработчиками «в те далекие времена» не стояло таких задач, то в магазинах, сдел...
Одной из «киллер-фич» 12й версии Битрикса была объявлена возможность отдавать статические файлы из CDN, тем самым увеличивая скорость работы сайта. Попробуем оценить практический выигрыш от использова...