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としてスタック名から-
を除いた文字列が付く。