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