Как заблокировать файл состояния при использовании 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).