Компоненты: - 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 адаптированы.
103 lines
2.9 KiB
Terraform
103 lines
2.9 KiB
Terraform
# Создано: 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)"
|
|
}
|