Skip to content

TopicRule

The TopicRule resource allows you to manage AWS IoT TopicRules that define actions to be taken when messages are published to specific MQTT topics.

Minimal Example

Create a basic TopicRule with a payload that triggers an action based on incoming MQTT messages.

ts
import AWS from "alchemy/aws/control";

const simpleTopicRule = await AWS.IoT.TopicRule("simpleTopicRule", {
  TopicRulePayload: {
    ruleDisabled: false,
    sql: "SELECT * FROM 'sensors/temperature'",
    actions: [{
      lambda: {
        functionArn: "arn:aws:lambda:us-west-2:123456789012:function:TemperatureAlerts",
        payload: {
          type: "json",
          data: {
            temperatureThreshold: 75
          }
        }
      }
    }],
    description: "Triggers Lambda function on temperature readings."
  },
  RuleName: "TemperatureAlertRule",
  Tags: [{ Key: "Environment", Value: "Production" }]
});

Advanced Configuration

Configure a TopicRule with multiple actions and specific IAM role permissions for enhanced functionality.

ts
const advancedTopicRule = await AWS.IoT.TopicRule("advancedTopicRule", {
  TopicRulePayload: {
    ruleDisabled: false,
    sql: "SELECT * FROM 'home/+/temperature'",
    actions: [{
      sns: {
        targetArn: "arn:aws:sns:us-west-2:123456789012:TemperatureAlerts",
        roleArn: "arn:aws:iam::123456789012:role/SNSTopicRole",
        messageFormat: "RAW"
      }
    }, {
      dynamoDB: {
        tableName: "TemperatureRecords",
        roleArn: "arn:aws:iam::123456789012:role/DynamoDBRole",
        hashKeyField: "deviceId",
        hashKeyType: "S",
        hashKeyValue: "${deviceId}",
        payloadField: "temperature"
      }
    }],
    description: "Sends alerts to SNS and stores readings in DynamoDB."
  },
  RuleName: "HomeTemperatureRule",
  Tags: [{ Key: "Project", Value: "SmartHome" }]
});

Custom SQL Filters

Define a TopicRule with a custom SQL filter to trigger actions based on specific message attributes.

ts
const filteredTopicRule = await AWS.IoT.TopicRule("filteredTopicRule", {
  TopicRulePayload: {
    ruleDisabled: false,
    sql: "SELECT * FROM 'sensors/+/alerts' WHERE alertSeverity = 'high'",
    actions: [{
      lambda: {
        functionArn: "arn:aws:lambda:us-west-2:123456789012:function:HighAlertHandler"
      }
    }],
    description: "Handles high severity alerts from sensors."
  },
  RuleName: "HighSeverityAlertRule",
  Tags: [{ Key: "AlertType", Value: "Critical" }]
});

Multi-Action Example

Set up a TopicRule with multiple actions to send notifications and log data simultaneously.

ts
const multiActionTopicRule = await AWS.IoT.TopicRule("multiActionTopicRule", {
  TopicRulePayload: {
    ruleDisabled: false,
    sql: "SELECT * FROM 'factory/machine/status'",
    actions: [{
      lambda: {
        functionArn: "arn:aws:lambda:us-west-2:123456789012:function:MachineStatusHandler"
      }
    }, {
      kinesis: {
        streamArn: "arn:aws:kinesis:us-west-2:123456789012:stream/MachineStatusStream",
        partitionKey: "${machineId}"
      }
    }],
    description: "Handles machine status updates and logs them to Kinesis."
  },
  RuleName: "MachineStatusRule",
  Tags: [{ Key: "Application", Value: "FactoryMonitoring" }]
});