Создание Kafka топиков через Terragrunt командами разработки
Общая схема
Kafka топики теперь описываются централизованно в репозитории terraform.
Для stage конфигурация живет в ветке stage и применяется компонентом:
live/stage/kafka-topics
Для prod конфигурация находится в ветке master и применяется аналогичным компонентом:
live/prod/kafka-topics
Пайплан terraform сам генерирует джобы по всем файлам live/*/*/terragrunt.hcl. Если в репозитории есть компонент live/stage/kafka-topics/terragrunt.hcl, то в пайплайне появляются джобы:
validate-stage-kafka-topics
plan-stage-kafka-topics
apply-stage-kafka-topics
Для prod по той же логике появляются:
validate-prod-kafka-topics
plan-prod-kafka-topics
apply-prod-kafka-topics
validate и plan запускаются в обычном пайплайне, apply ручной, как и в остальных джобах.
Где описывать топики
Топики описываются в infrastructure.yaml внутри нужного окружения.
Пример для stage:
environments:
stage:
kafka:
topics:
- name: sarex.stage.kafka-topics-test.events.v1
owner: kafka-topics-test
clusterRef: stage
partitions: 1
replicationFactor: 1
config:
cleanup.policy: delete
retention.ms: "604800000"
min.insync.replicas: "1"
deletionPolicy: orphan
Формат топика
Минимальная рабочая конфигурация топика:
- name: sarex.stage.service-name.events.v1
owner: service-name
clusterRef: stage
partitions: 1
replicationFactor: 1
config:
cleanup.policy: delete
retention.ms: "604800000"
min.insync.replicas: "1"
deletionPolicy: orphan
name это имя топика в Yandex Cloud. Про рекомендуемый формат можно прочитать в спеках по event-driven, а более конкретно - в разделе по наименованию топиков
owner это имя Kafka пользователя, который будет создан для доступа к топику.
clusterRef выбирает Kafka кластер из kafka_cluster_refs текущего окружения.
partitions это число партиций топика.
replicationFactor это фактор репликации.
config передается в topic конфигурацию. Сейчас используются cleanup.policy, retention.ms, retention.bytes, segment.bytes, compression.type, min.insync.replicas.
deletionPolicy: orphan означает, что топик не должен удаляться автоматически. На уровне Terraform дополнительно стоит prevent_destroy = true.
Как добавить новый топик
Нужно сделать MR в нужную ветку и добавить в infrastructure.yaml в блоке environments.<env>.kafka.topics новый элемент:
- name: sarex.stage.my-service.events.v1
owner: my-service
clusterRef: stage
partitions: 1
replicationFactor: 1
config:
cleanup.policy: delete
retention.ms: "604800000"
min.insync.replicas: "1"
deletionPolicy: orphan
После мержа в ветку создадутся джобы validate-stage-kafka-topics и plan-stage-kafka-topics.
После успешного plan нужно вручную запустить apply-stage-kafka-topics.