2

Amazon SNS の Webhook をセットアップしようとしています。SNS は JSON オブジェクトを Webhook に送信します。KRL ドキュメントに基づいて、event:param('name') を使用してイベント パラメータを取得できます。これはフォーム エンコードされたデータでは機能しますが、JSON ではどうでしょうか。

postbin.org に電話をかけたところ、postbin は次のように報告しました。

body {
  "Message": "You have ...",
  "MessageId": "958....",
  "Signature": "vo3v5f....",
  ...
}

KRLで書きたいことは次のとおりです。

rule sns_webhook {
  select when webhook sometopic Type "SubscriptionConfirmation"
  pre {
    topic_arn = event:param("TopicARN");
    signature = event:param("Signature");
    message = event:param("Message");
    subscribe_url = event:param("SubscribeURL");
  }
  if valid_signature(signature) then {
    confirm_subscription(subscribe_url);
  }
}

これはおそらく HTTP フォームでエンコードされたデータに対しては機能しますが、JSON では次のものが必要になると思います。

rule sns_json {
  select when webhook sometopic
  pre {
    body = event:param('body').decode();
    msg_type = body.pick("Type");
    signature = body.pick("Signature");
    ...
  }
  if msg_type eq "SubscriptionConfirmation" && valid(signature) then
  {
    confirm_subscription(...);
  }
}

ここで説明されている 2 番目の方法を使用する必要がありますか? event:param('body') は SNS メッセージから JSON データを取得しますか?

4

1 に答える 1

2

2 番目のコード ブロックは非常に近いものです。ここに、正しい event:param() を使用するように書き直したものがあります。

rule sns_json {
  select when webhook sometopic
  pre {
    body = event:param('request_body').decode();
    msg_type = body.pick("Type");
    signature = body.pick("Signature");
    ...
  }
  if msg_type eq "SubscriptionConfirmation" && valid(signature) then
  {
    confirm_subscription(...);
  }
}

このルールが最初にあった場合はlastfiredpostlude ブロックに a を追加することを忘れないでください。

本文を複数回デコードする代わりに、既にデコードされたメッセージをイベント パラメータとして明示的なイベントを発生させ、メッセージの Type を含めて、さまざまなタイプを明示的に処理するルールを記述できるようにすることもできます。

于 2011-06-03T22:12:18.753 に答える