やってみた記事ってやつです。
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 } } }
図示するとこう。図示するまでもなかったですね。
おわりに
Step FunctionsからMackerelに投稿するにあたって、追加のLambda関数なしでHTTPリクエストを投げられるようになり、いい時代になりました。
HTTP TaskがVPCに対応するようになったら、もう1つLambda関数を減らせるな~と思いながら開発中のプロダクトのほうを見ているので、機能拡充されるとよいですね。
*1:VPCには対応していないので、パブリックネットワークから到達可能なHTTP APIにのみリクエストできる