Как заблокировать файл состояния при использовании Google Cloud Platform?

Что представляет собой механизм Google Cloud Platform для блокировки файла состояния при использовании Terraform? Как DynamoDB на AWS..

Спасибо

3 ответа

Решение

Где вы храните файлы состояния (определенные с помощью бэкэнда) отличается от того, куда вы развертываете. Они могут быть одинаковыми, но не обязательно. Например, вы можете развернуть ресурсы в Azure, сохраняя файл состояния в корзине AWS S3.

Если вы заинтересованы в сохранении файла состояния в Google Cloud, у Terraform есть бэкэнд, называемый gcs, который включает в себя блокировку. Цитировать документацию:

gcs сохраняет состояние как объект в настраиваемом префиксе и контейнере в Google Cloud Storage (GCS).

gcs бэкэнд реализует блокировку состояния Terraform с помощью специального файла блокировки с .tflockрасширение. Этот файл помещается рядом с самим состоянием Terraform на время работы состояния Terraform. Например, если файл состояния расположен по пути

      gs://BUCKET/PREFIX/WORKSPACE.tfstate

тогда соответствующий файл блокировки будет расположен по пути

      gs://BUCKET/PREFIX/WORKSPACE.tflock

Источник: hashicorp / terraform

Атомарность блокировки гарантируется использованием функции GCS, называемой предварительным условием. Сам Terraform использует пакета SDK GCP Go, которое, в свою очередь, использует условие DoesNotExistпредварительное условиеGCS . Внизу это добавляет этот HTTP-заголовок x-goog-if-generation-match: 0 к запросу копирования GCS.

Согласно документации GCS :

Когда Match В предварительном условии используется значение 0 вместо номера поколения, запрос выполняется только в том случае, если в сегменте Cloud Storage нет живых объектов с именем, указанным в запросе.

Это именно то, что нужно для блокировки состояния Terraform.

Облачная платформа Google, как и большинство удаленных серверных модулей, изначально поддерживает блокировку. AWS не поддерживает блокировку через S3, но делает, как вы упомянули, через DynamoDB.

Бежать terraform apply, Terraform автоматически установит блокировку; если кто-то другой уже запускает приложение, у него уже будет блокировка, и вам придется подождать.

Вы можете запустить apply с -lock-timeout=<TIME> параметр, указывающий Terraform ждать до TIME для снятия блокировки (например, -lock-timeout=10m буду ждать минут 10).

Другие вопросы по тегам