AWS IoT Core のルールアクションで、受け取ったデータに合わせた任意の文字列データを追加してみる
SELECTでCASEを利用すれば実現できました。
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には、想定通りのデータがありました。
湿度データを送信する
aws iot-data publish \
--topic 'blog/sample/test' \
--cli-binary-format raw-in-base64-out \
--payload '{"type": 2, "humidity": 67.8}'
CloudWatch Logsには、想定通りのデータがありました。
さいごに
IoT Coreで受け取ったデータに対して、任意のAttributeを付与してみました。参考になれば幸いです。