Na šta će dovesti istovremeno pokretanje dva Terraform primera?
sobes.tech АИ
Одговор од АИ
К стању трке (race condition) и могућој оштећењу фајла стања (state file). Ово је критично јер Terraform користи фајл стања за синхронизацију стварне инфраструктуре са конфигурацијом. Оштета може довести до некоректне примене измена, дуплирања ресурса или њиховог брисања без обзира на планирано стање.
Да би се то избегло, користи се блокирање фајла стања. Већина Terraform бекенда (нпр. S3, GCS, Artifactory) подржава механизам блокирања. Када се покуша покретање другог примерка Terraform-а, док први извршава операцију, други чека уклањање блокаде или се завршава грешком.
Пример конфигурације бекенда са блокирањем (за S3):
terraform {
backend "s3" {
bucket = "my-terraform-state-bucket"
key = "path/to/my/terraform.tfstate"
region = "us-east-1"
dynamodb_table = "my-terraform-lock-table" // Користи се за блокирање
}
}
У овом случају, dynamodb_table се користи за имплементацију расподељеног блокирања. Пре извршавања операције Terraform, покушава да креира елемент у овој таблици, који служи као индикатор заузетости фајла стања. Други примерак, који покушава да приступи, видеће постојећи елемент и неће моћи да добије блокаду.
Ако блокада није подешена или се користи локални бекенд без подршке за блокирање, истовремено извршавање ће довести до непредвидивог понашања.
Последице могу укључивати:
- Оштета фајла стања: Запис података од два процеса истовремено може довести до његове неконзистентности.
- Некоректно стање инфраструктуре: Делови измена могу бити примењени, други игнорисани или изменјени другим процесом.
- Дуплирање ресурса: Terraform може креирати ресурсе за које мисли да не постоје, јер информације у фајлу стања још нису ажуриране.
- Брисање ресурса: У ретким случајевима, погрешно тумачење стања може довести до брисања ресурса који су потребни по конфигурацији.
Да би се спречиле такве ситуације, увек треба користити бекенд са подршком за блокирање и уверити се да је правилно подешен. У CI/CD пипелинима ово се постиже синхронизацијом задатака и гаранцијом да само један процес Terraform ради са одређеним фајлом стања у одређеном тренутку.