Короткий ответ Data source каждый раз запрашивает текущее состояние у провайдера при plan/apply, поэтому если внешняя команда опубликовала новый AMI, подходящий под тот же фильтр, значение data.aws_ami.latest.id меняется без единого изменения в самом Terraform-коде, и ресурс, использующий этот id (например, aws_instance с ami = data.aws_ami.latest.id без lifecycle.create_before_destroy/ignore_changes), будет пересоздан при следующем apply, что и произошло — изменение пришло «снаружи» конфигурации. Как это работает подробнее data source в Terraform не версионируется и не фиксируется в конфигурации так, как явный resource: он выполняет live-запрос к API на этапе plan и подставляет свежий результат в граф зависимостей; если результат отличается от предыдущего apply, Terraform видит разницу в значении атрибута, который использует зависимый resource, и планирует соответствующее действие (в данном случае replace, если ami требует пересоздания). Пример кода Что использовать на практике Практика. если нужна предсказу