私が歌川です

@utgwkk が書いている

AWS Step FunctionsのHTTP TaskでMackerelにメトリックを投稿する

やってみた記事ってやつです。

AWS Step Functionsから任意のHTTP APIを叩けるようになった*1ので、これを使ってMackerelに投稿してみましょう。

投稿するメトリックを用意する

サービスメトリックを投稿するときのリクエストボディの形式に沿ったJSONを組み立てるために、↓こういうしょぼいLambda関数を用意してみます。

export const handler = async (event) => {
  const time = Date.now() / 1000
  const value = Math.random() * 10000000
  return [
    { name: "custom.example_metrics.metric1", time, value }
  ]
};

Node.jsランタイムで実装する場合、非同期処理がなくてもハンドラは非同期関数として定義しておかないと、ステートの実行結果が常に null になってしまうので注意してください (1敗)。

EventBridge Connectionを用意する

  • 認証タイプ: API Key
  • APIキー名: X-Api-Key

でMackerelのAPIキーをセットしたらよいです。

ステートマシンを用意する

エラーハンドリングやリトライ処理を全部省略したステートマシンをつくりおきします。ARNとかservice nameって書いてあるところは必要なリソースのARNとかを書いてください。固定値でいいならLambda関数をはさむ必要すらないかも。

{
  "StartAt": "Construct request body",
  "States": {
    "Construct request body": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "<function ARN>"
      },
      "ResultSelector": {
        "mackerelRequestBody.$": "$.Payload"
      },
      "Next": "Post service metrics to Mackerel"
    },
    "Post service metrics to Mackerel": {
      "Type": "Task",
      "Resource": "arn:aws:states:::http:invoke",
      "Parameters": {
        "ApiEndpoint": "https://api.mackerelio.com/api/v0/services/<service name>/tsdb",
        "Method": "POST",
        "Authentication": {
          "ConnectionArn": "<EventBridge Connection ARN>"
        },
        "Headers": {
          "Content-Type": "application/json"
        },
        "RequestBody.$": "$.mackerelRequestBody"
      },
      "End": true
    }
  }
}

図示するとこう。図示するまでもなかったですね。

gyazo.com

おわりに

Step FunctionsからMackerelに投稿するにあたって、追加のLambda関数なしでHTTPリクエストを投げられるようになり、いい時代になりました。

HTTP TaskがVPCに対応するようになったら、もう1つLambda関数を減らせるな~と思いながら開発中のプロダクトのほうを見ているので、機能拡充されるとよいですね。

*1:VPCには対応していないので、パブリックネットワークから到達可能なHTTP APIにのみリクエストできる