Перейти к содержанию

Создание 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.