feat: перенос IoT managed service из sless в отдельную репу
Компоненты: - iot-operator: controller-manager (IoTDevice CRD) + REST API (порт 9090) - mqtt-bridge: MQTT (EMQX) → Kafka bridge - kafka-consumer: Kafka → Postgres pipeline Модуль: gitea.services.ngcloud.ru/Nail/IoT Все 3 бинарника собираются, import paths адаптированы.
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
# Создано: 2026-04-04
|
||||
# E2E Demo: IoT Device → MQTT → RabbitMQ → Serverless Function
|
||||
#
|
||||
# Порядок применения:
|
||||
# 1. terraform init
|
||||
# 2. terraform apply
|
||||
# 3. Получить credentials: terraform output mqtt_password
|
||||
# 4. Отправить тестовое MQTT сообщение (см. README.md ниже)
|
||||
|
||||
terraform {
|
||||
required_providers {
|
||||
sless = {
|
||||
source = "kube5s.ru/naeel/sless"
|
||||
version = ">= 0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Адрес API sless оператора
|
||||
provider "sless" {
|
||||
api_url = "https://sless.kube5s.ru"
|
||||
}
|
||||
|
||||
# Переменные
|
||||
variable "namespace" {
|
||||
description = "Namespace пользователя (создаётся через EnsureNamespace)"
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "api_token" {
|
||||
description = "JWT токен для аутентификации в sless API"
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
# Python функция-обработчик IoT-телеметрии
|
||||
resource "sless_function" "iot_telemetry_handler" {
|
||||
namespace = var.namespace
|
||||
name = "iot-telemetry-handler"
|
||||
runtime = "python3.11"
|
||||
entrypoint = "handler.handle"
|
||||
memory_mb = 128
|
||||
timeout_sec = 30
|
||||
|
||||
env_vars = {
|
||||
LOG_LEVEL = "INFO"
|
||||
}
|
||||
}
|
||||
|
||||
# Event Trigger: подписка на IoT telemetry queue
|
||||
# event-dispatcher читает из этой очереди и вызывает функцию
|
||||
resource "sless_trigger" "iot_telemetry_trigger" {
|
||||
namespace = var.namespace
|
||||
name = "iot-telemetry-events"
|
||||
type = "event"
|
||||
function_ref = sless_function.iot_telemetry_handler.name
|
||||
# queue = "iot.{namespace}.telemetry" — формируется mqtt-bridge автоматически
|
||||
queue = "iot.${var.namespace}.telemetry"
|
||||
enabled = true
|
||||
}
|
||||
|
||||
# IoT устройство — температурный датчик
|
||||
resource "sless_iot_device" "temperature_sensor" {
|
||||
namespace = var.namespace
|
||||
name = "temperature-sensor"
|
||||
device_id = "temp-sensor-01"
|
||||
enabled = true
|
||||
|
||||
metadata = {
|
||||
model = "DHT22"
|
||||
location = "server-room"
|
||||
owner = "ops-team"
|
||||
}
|
||||
}
|
||||
|
||||
# ——— Outputs ———
|
||||
|
||||
output "mqtt_broker" {
|
||||
value = "emqx.sless.svc:1883"
|
||||
description = "MQTT broker адрес (доступен внутри кластера)"
|
||||
}
|
||||
|
||||
output "mqtt_username" {
|
||||
value = sless_iot_device.temperature_sensor.mqtt_username
|
||||
description = "MQTT username для устройства"
|
||||
}
|
||||
|
||||
output "mqtt_password" {
|
||||
value = sless_iot_device.temperature_sensor.mqtt_password
|
||||
sensitive = true
|
||||
description = "MQTT пароль для устройства (sensitive)"
|
||||
}
|
||||
|
||||
output "mqtt_topic" {
|
||||
value = "${var.namespace}/telemetry/temp-sensor-01"
|
||||
description = "MQTT topic для публикации телеметрии"
|
||||
}
|
||||
|
||||
output "iot_device_phase" {
|
||||
value = sless_iot_device.temperature_sensor.phase
|
||||
description = "Статус IoT устройства (Active/Pending/Disabled/Error)"
|
||||
}
|
||||
Reference in New Issue
Block a user