Files
sless/examples/IOT/main.tf
T
Naeel 1e53766c46 feat(iot): Этапы 2-7 — MQTT auth, IoT API, EMQX, mqtt-bridge, E2E demo
Этап 2+4: internal/api/handler/iot_device_handler.go
  - MQTTAuth: POST /internal/mqtt/auth (без JWT, для EMQX)
  - CreateIoTDevice, ListIoTDevices, GetIoTDevice (c password), DeleteIoTDevice, UpdateIoTDevice
  - crypto/subtle.ConstantTimeCompare против timing attacks

Этап 4: internal/api/router.go
  - /v1/namespaces/{ns}/iot/devices CRUD
  - /internal/mqtt/auth (без JWT middleware)

Этап 3: deployments/k8s/emqx.yaml
  - EMQX 5.5.1, emqx.conf (HOCON) с HTTP auth backend
  - Сервис exposure: 1883 (MQTT), 8083 (WS), 18083 (Dashboard)

Этап 3: iot/cmd/mqtt-bridge/main.go
  - paho.mqtt.golang: подписка на +/telemetry/+
  - amqp091-go: publish в iot.{namespace}.telemetry
  - deployments/k8s/iot-mqtt-bridge.yaml

Этап 7: examples/IOT/ — E2E demo (main.tf, handler.py, README.md)

go.mod: добавлен github.com/eclipse/paho.mqtt.golang v1.5.1
go build ./... — ошибок нет
2026-04-04 09:45:23 +03:00

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)"
}