StackdriverからAWS SQSにキューを追加してみた


やりたいこと

Stackdriverで検知したアラートをSQSにつっこんで、その後ごにょごにょしたい。

つかったもの

  • Stackdriver
    • アラート内容をWebhookで投げる。
  • AWS API Gateway
    • JSONを受け取ってSQSにつっこむ。
  • AWS SQS
    • つっこまれる。

やりかた

AWS IAM

こんなロールを作りました。
権限もりもり。

AWS SQS

今回はFIFOタイプを選択しました。
コンテンツに基づく重複排除はチェックONにします。
そのほかはデフォルトで作りました。

AWS API Gateway

こんな感じで作りました。

API名、リソース名は任意で。

パス上書き(省略可能)はSQSのURL後半(012345678901/sqs_queue_name)を設定。
実行ロールは先ほど作成したIAMロールのarnを設定。

メソッドリクエスト統合リクエストを設定します。

メソッドリクエストは、こんな感じで設定しました。
実際はAPIキーを設定した方がよいかと思います。

統合リクエストはこんな感じで設定。

下部にスクロールして、HTTPヘッダーマッピングテンプレートを設定します。

HTTPヘッダー

名前 マッピング元 キャッシュ
Content-Type 'application/x-www-form-urlencoded' OFF

マッピングテンプレート

リクエスト本文のパススルー Content-Type テンプレート
なし application/json Action=SendMessage&MessageGroupId=hoge&MessageBody=$input.body

APIをデプロイします。

URLを控えておきます。
ついでにログ有効化してます。

Stackdriver

Webhookの設定

公式ドキュメント

Webhookの設定を作ります。
ENDPOINT URLは、先ほど控えたURLにメソッド(/messages)を追加して記載します。

アラートの作成

今回はGCEインスタンスのUptime監視データが欠損したらアラートを飛ばすように設定しました。
Notificationsに先ほど作成したWebhookを設定します。

うごかしてみる

正常

キューもない

インスタンス停止後、アラート発報。

キューができた!

中身

ログをみてみる

初めてAPIGateway使ったので、色々ハマりましてログが役立ちました。

ちなみにcurlでテストする際は下記コマンドでテストできました。

curl -H "Content-Type: application/json" -D - -X POST -d '{"hogehoge": "fugafuga"}' https://hogehoge.execute-api.ap-northeast-1.amazonaws.com/stackdrivertest/messages

参考

下記記事を参考にさせて頂きました。
ありがとうございます。

API Gateway 経由で SQS へメッセージを送る
https://qiita.com/itooww/items/df5efc6df64fae386e4c