- doc/progress.md: обновлена версия до operator v0.1.18 / provider v0.1.11, добавлен блок source_dir + fix destroy cleanup (2026-03-09), уточнены комментарии к контроллерам и trigger_resource - doc/errors/log.md: добавлены две записи — source_dir/hashicorp/archive, destroy route cleanup bug (три причины + решения) - .gitignore: добавлены examples/*/dist/ и terraform.tfstate.*.backup - examples/: удалены dist/ zip и tfstate.*.backup из трекинга
7.9 KiB
Bug Report: HTTP route is not removed after Terraform destroy
Summary
При удалении примера hello-node через Terraform команда terraform destroy завершается успешно, но публичный HTTP endpoint не удаляется.
Фактическое поведение после destroy такое:
- Сразу после удаления endpoint ещё некоторое время отвечает
HTTP 200и возвращает корректный ответ функции. - Затем backend функции действительно исчезает, но публичный маршрут остаётся опубликованным и начинает отвечать
HTTP 502 function unreachable. - Даже через 120 секунд endpoint не исчезает.
Это выглядит как баг cleanup в platform/backend/provider lifecycle для HTTP trigger/route.
Affected Example
- Example:
hello-node - Terraform files:
hello-node/main.tf,hello-node/http.tf,hello-node/job.tf - Public URL:
https://sless-api.kube5s.ru/fn/default/hello-http - Function name:
hello-http - Trigger name:
hello-http-trigger
Reproduction
Использовался репозиторий examples и скрипт:
- Script:
./run_terraform_examples.sh
Шаги воспроизведения:
- Выполнить
terraform initвhello-node - Выполнить
terraform apply - Убедиться, что endpoint живой
- Выполнить
terraform destroy - Проверять публичный URL после destroy
Логика проверки встроена в run_terraform_examples.sh:
- После
applyendpoint обязан отвечать200 - После
destroyendpoint должен исчезнуть - Скрипт ждёт до 120 секунд и перепроверяет endpoint каждые 5 секунд
Expected Result
После успешного terraform destroy:
- Публичный URL должен перестать существовать
- Запрос на URL должен вернуть
404или другой явный признак отсутствия маршрута - Provider не должен возвращать успешный destroy раньше, чем cleanup HTTP route завершён
Actual Result
После успешного terraform destroy:
- Terraform сообщает
Destroy complete! Resources: 4 destroyed. - Endpoint
https://sless-api.kube5s.ru/fn/default/hello-httpпродолжает отвечать200 - Через некоторое время тот же endpoint начинает отвечать
502 - Тело ответа на
502:
{"error":"function unreachable: Post \"http://hello-http.sless-fn-default.svc.cluster.local:8080\": dial tcp 10.106.128.167:8080: connect: operation not permitted"}
Это означает:
- внешний HTTP маршрут всё ещё существует;
- запрос по нему всё ещё направляется внутрь платформы;
- backend функции уже удалён или недоступен;
- cleanup маршрута не завершён.
Timeline From Real Run
Подтверждённая последовательность из фактического прогона:
terraform destroyзавершился успешно- первые проверки после destroy возвращали
HTTP 200 - затем проверки начали возвращать
HTTP 502 function unreachable - в течение всех 24 проверок по 5 секунд endpoint не исчез
- итоговое время ожидания: 120 секунд
Итоговый summary из скрипта:
ERROR SUMMARY
example: hello-node
step: endpoint cleanup after clean destroy
reason: route cleanup bug: public endpoint still exists but backend is already gone (HTTP 502 function unreachable); endpoint was still published after 120s
Why This Is A Real Platform Bug
Это не похоже на проблему тестового скрипта или Terraform CLI по следующим причинам:
terraform destroyзавершается без ошибки- state Terraform очищается как ожидалось
- сначала endpoint отвечает
200, значит маршрут реально жив после destroy - потом endpoint отвечает
502 function unreachable, значит backend уже исчез, но route ещё остался - скрипт ждёт 120 секунд, то есть это не мгновенная eventual consistency на 1-2 секунды
Иными словами: удаление backend и удаление публичного маршрута расходятся по времени, а route cleanup либо не выполняется, либо не дожидается завершения.
Most Likely Broken Layer
Наиболее вероятные точки проблемы:
- API/backend destroy trigger возвращает success до фактического удаления HTTP route
- Controller удаляет function workload, но не удаляет route/ingress/virtualservice/gateway mapping
- Удаление route запускается асинхронно, но его результат не awaited
- В системе остаётся запись маршрута на имя функции, хотя service/backend уже удалён
What To Check In The Development Repo
Нужно проверить destroy flow именно для HTTP trigger:
- Удаляется ли объект trigger только в metadata/storage или реально удаляется и внешний маршрут
- Какие Kubernetes/ingress объекты создаются для HTTP trigger и все ли они удаляются
- Есть ли race condition между удалением function/service и удалением route
- Не возвращает ли provider success раньше, чем backend подтверждает полное удаление маршрута
- Есть ли финальный polling/wait на исчезновение route перед возвратом успешного destroy
Если архитектура использует отдельные сущности route/service/function, то destroy должен идти в таком порядке:
- disable/remove public routing
- дождаться, что endpoint больше не публикуется снаружи
- удалить backend/service/workload
- завершить destroy success
Сейчас по фактическому поведению порядок либо обратный, либо неполный.
Minimal Acceptance Criteria For Fix
Исправление можно считать рабочим, если после terraform destroy для hello-node выполняются все условия:
- URL
https://sless-api.kube5s.ru/fn/default/hello-httpперестаёт отвечать как живой маршрут - URL не возвращает
502 function unreachable - URL исчезает в разумное время после destroy
./run_terraform_examples.shпроходит шагendpoint cleanup after clean destroy
Current Status
На данный момент массовый прогон examples корректно останавливается на hello-node, потому что это первый воспроизводимый failure.
Дальше прогонять остальные примеры без исправления destroy cleanup смысла нет: тест уже доказал platform bug на базовом HTTP сценарии.