目次
はじめに
こんにちは、omkです。
CEDEC2023観ましたか?私は記事でちょろちょろ追ってる次第ですがプロダクトやエンジニアリングにかける想いがやはりすごいですね。
それは右に置いておいて、今回はIoT EventsでSNSにパブリッシュする際のメッセージをカスタマイズしてみました。
上手いこと変数や入力(input)の内容がSNSのペイロードで変換できなかったり、そもそもパースエラーで設定できなかったりということがあったので検証してみました。
発端
IoT EventsでSNSのデフォルトペイロードでメールが届いた際にどこを読めばいいのかぱっと見ではわからないので、
カスタムペイロードを設定しようとしたところ以下のエラーが。
DetectorModelDefinition is invalid due to: We couldn't parse your content expression for the payload of SNSTopicPublishAction. Enter a content expression with the correct syntax. Error found in state ~~~~~~~~~~ in action SNSTopicPublishAction.
パースエラーでペイロードを設定できませんでした。
解決方法
以下のドキュメントを読みます。
IoT EventsでのAPIリファレンス全般は以下にあります。
https://docs.aws.amazon.com/iotevents/latest/apireference/API_Types_AWS_IoT_Events.html
その中での「SNSTopicPublishAction」のリファレンスは以下です。
https://docs.aws.amazon.com/iotevents/latest/apireference/API_SNSTopicPublishAction.html
特にカスタムペイロードに関連する箇所は以下です。
https://docs.aws.amazon.com/iotevents/latest/apireference/API_Payload.html
コンパネで操作する場合は最後のやつだけ読めばいいと思います。
とりあえずペイロードタイプに文字列を指定して送信する前提で以下進めます。(JSONを指定しても別にJSONフォーマットでなくても送信できるのであんまりよく分かっていないです)
ペイロードの表現として以下に合致するように記述必要があるとのこと。
contentExpression
The content of the payload. You can use a string expression that includes quoted strings (''), variables ($variable. ), input values ($input. . ), string concatenations, and quoted strings that contain ${} as the content. The recommended maximum size of a content expression is 1 KB.
要は文字列をシングルクォートで囲ってその中に変数やインプットを含める場合はその名前を「${}」で囲えとのことでした。
試しに以下の文字列で試してみます。
'input: ${$input.test_input.message},
var: ${$variable.message}'
インプットそのものと、インプットの値を変数に格納したものを出力するようにしています。
テスト的に次のメッセージを入力します。
{
"message": "test"
}
以下のメッセージがSNSに登録したメールアドレス宛てに届きました。
input: test,
var: test
入力の値も変数の値も取得できていますね。
あとは伝えたい内容に書き換えたり持っておきたい値を計算して変数に入れたりすればいい感じの通知が出来ますね。
おわりに
これで自由に通知の文言を変えられるようになりました。
人が介在するシステムでは読み手に優しくありたいですね。
以上、最後までお付き合いありがとうございました。
アーキテクト課のomkです。
AWSについて雑多に取り組んだ内容を発信しています!!