AWS::IoT::TopicRuleを使用したIoTルール定義
構文については公式ドキュメント参照
ただし、以下のように記載されているYAML例がYAMLではなくJSON

英語サイトの場合は、YAML例はちゃんとYAMLになっている
ただし、bool値の箇所が'true'と文字列になっている(ただしくはtrue)等の誤りがあったりするので注意

ということで以下が実際のIoTルール定義
# IoTルール
EdgeRecvMessageTopicRule:
Type: AWS::IoT::TopicRule
Properties:
TopicRulePayload:
RuleDisabled: false
Sql: SELECT * FROM '+/info'
Actions: # IoTルールに合致した場合に実行するアクション(今回はLambda)
- Lambda:
FunctionArn: !GetAtt EdgeRecvMessageHook.Arn
# IoTルールに合致した場合にフックされるLambda定義
EdgeRecvMessageHook:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub '${StackName}_EdgeRecvMessageHook'
CodeUri: Edge-Recv-Message/
Handler: function.lambda_handler
Runtime: python3.8
# IoTからLambdaを実行する権限付与定義
EdgeRecvMessageHookPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName: !GetAtt EdgeRecvMessageHook.Arn
Principal: iot.amazonaws.com
IoTルールの名前について
EdgeRecvMessageTopicRule:
Type: AWS::IoT::TopicRule
Properties:
RuleName:
!Sub '${StackName}_EdgeRecvMessage'
TopicRulePayload:
RuleDisabled: false
Sql: SELECT * FROM '+/info'
Actions:
- Lambda:
FunctionArn: !GetAtt EdgeRecvMessageHook.Arn
上記のようにスタック名をprefixにしたRuleNameにしようと考えたが、
スタック名に-が入っていたためエラーとなった。
IoTルールの名前には_は使用できるが、-は使用できない。
逆にCloudFormationのスタック名には-は使用できるが、_は使用できない。
ちなみにS3バケット名はスタック名と同様、-は使用できるが、_は使用できない。
RuleNameは必須項目ではないので、自動生成される名前で逃げる手はあり。
自動生成されたルール名にはprefixとしてスタック名から-を除いた文字列が付く。