AWS IoT Core のルールアクションで、受け取ったデータに合わせた任意の文字列データを追加してみる

AWS IoT Core のルールアクションで、受け取ったデータに合わせた任意の文字列データを追加してみる

SELECTでCASEを利用すれば実現できました。
Clock Icon2025.04.24

AWS IoT Coreで、同じトピックに対して異なるデータが届く状況になっちゃうことって、ありますよね。というわけで、異なるデータが届いたとき、区別するためのデータの追加を試してみました。

おすすめの方

  • タイトルについて知りたい方
  • AWS IoT CoreのルールアクションをCloudFormationで作成したい方
  • AWS IoT CoreのルールアクションでCASEを利用したい方
  • AWS IoT CoreのトピックにAWS CLIでデータを送信したい方

トピックとデータの想定

次のトピックとします。

blog/sample/test

このトピックに対して、それぞれ次のデータが届きます。

{
    "type": 1,
    "temperature": 12.3
}
{
    "type": 2,
    "humidity": 67.8
}

これらのデータに対してIoTルールアクションを実行したとき、「typeString」を付与したデータを後続に渡します。

{
    "type": 1,
    "temperature": 12.3,
    "typeString": "temperature"
}
{
    "type": 2,
    "humidity": 67.8,
    "typeString": "humidity"
}

AWS IoT Coreのルールアクションを作成する

CloudFormationテンプレート

CASEを利用して、条件分岐で任意の文字列を設定します。

受け取ったデータは、確認用のCloudWatch Logsに保存します。

cfn.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: IoT Core Rule Sample

Resources:
  TopicRule:
    Type: AWS::IoT::TopicRule
    Properties:
      RuleName: !Sub blog_sample_test_rule
      TopicRulePayload:
        AwsIotSqlVersion: "2016-03-23"
        RuleDisabled: false
        Sql: >-
          SELECT
            *,
            CASE type
                WHEN 1 THEN 'temperature'
                WHEN 2 THEN 'humidity'
                ELSE 'unknown'
            END AS typeString,
          FROM
            'blog/sample/test'
          WHERE
            type = 1 OR type = 2
        Actions:
          - CloudwatchLogs:
              LogGroupName: !Ref IoTRuleActionnLogGroup
              RoleArn: !GetAtt TopicRuleRole.Arn

  TopicRuleRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: iot-core-rule-test-role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: iot.amazonaws.com
            Action: sts:AssumeRole
      Path: !Sub /${AWS::StackName}/
      Policies:
        - PolicyName: iot-core-rule-test-role-policy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                  - logs:DescribeLogStreams
                Resource: "*"

  IoTRuleActionnLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub /iotcore/rule-action/blog-test

デプロイ

aws cloudformation deploy \
    --template-file cfn.yaml \
    --stack-name IoT-Core-Rule-Sample-Stack \
    --capabilities CAPABILITY_NAMED_IAM

IoT Coreにデータを送信して、動作を確認する

温度データを送信する

aws iot-data publish \
    --topic 'blog/sample/test' \
    --cli-binary-format raw-in-base64-out \
    --payload '{"type": 1, "temperature": 12.3}'

CloudWatch Logsには、想定通りのデータがありました。

01_cloudwatch_logs

湿度データを送信する

aws iot-data publish \
    --topic 'blog/sample/test' \
    --cli-binary-format raw-in-base64-out \
    --payload '{"type": 2, "humidity": 67.8}'

CloudWatch Logsには、想定通りのデータがありました。

02_cloudwatch_logs

さいごに

IoT Coreで受け取ったデータに対して、任意のAttributeを付与してみました。参考になれば幸いです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.