Cognito User Pool の Sign-In 数を Mackerel サービスメトリックに定期投稿する
このエントリは @sogaoh の Mackerel Ambassador としての記事 その10です。
(一覧は こちら)
Mackerel には AWSインテグレーション があって、だいたいの AWS サービスの各種メトリックが可視化できます。
ところが 2021/9/23 時点で Amazon Cognito ユーザープール には未対応で、直接的に Mackerel にメトリックを投稿することができません。
そこで、AWS Lambda で
- CloudWatch に蓄積されている Amazon Cognito ユーザープールのメトリック を取得
- サービスメトリックの形式に調整して API で Mackerel に投稿
というスクリプトを作って運用を始めました。
少し工夫してあって、スクリプトにいくらか手を加えれば他のメトリックでも投稿できるような感じに作ったので、利用できそうであればご自由に、という意図で記事化しました。
スクリプトはこちらに公開しています。
リポジトリトップの README.md には他のディレクトリの概要が書いてあったりしてますが、 scripts/lambda-cognito-metric
配下の内容がこの記事の範囲となります。
ということで、機構について自分なりの解説を書きます。
リソース構築/更新
概要図1:Create/lambroll
Create
scripts/lambda-cognito-metric/create
にて terraform.tfvars を整備すれば以下のリソースを一括生成できます
-
terraform-aws-modules/lambda/aws を利用してリソースを作成(lambdaFunction.tf の module
lambda_cognito_metric_invoker
) - var.function_name で指定した Lambda Function を作成する(Runtime は Python 3.9)
- policy_jsons に追加で必要となる IAM Policy を指定する
- 投入される Policy は iam.tf で定義している
cw_get_metric_policy_document
とssm_get_parameter_policy_document
- 投入される Policy は iam.tf で定義している
- CloudWatch Log Group を作成(terraform-aws-modules/lambda/aws デフォルト)
- 定期的に Lambda スクリプトを呼び出すように cloudWatchEvent.tf で定義した
cognito_metric_post_rule_1
:schedule_expression = "rate(5 minutes)"
とcognito_metric_post_target_1
を作成 - tfstate を保存(サンプルソースでは backend を未指定なのでS3でなくローカルに保存されることになります)
lambroll
scripts/lambda-cognito-metric/lambroll
にて .envrc を整備すれば、Lambda デプロイツールとして特化された lambroll [1] で関数の更新ができます。指定によりますが、invoke で実行も可能です。
- tfstate を参照している場合、参照項目を見に行く
- 新しいソースコードで Lambda を更新する(
make deploy
)- lambroll invoke を利用することで実行も可能
実行例
❯ echo '{"environment":"staging","mackerel_service":"ore-no-service","path_to_parameter":"/myApp"}' | lambroll invoke --log-level=debug
サンプルソースでは
MACKEREL_API_KEY
AWS_COGNITO_USER_POOL_ID
AWS_COGNITO_CLIENT_ID
というSSMパラメータが環境毎・アプリケーション毎で存在する前提となっている(必要に応じてsrc/main.py
を調整してください)
おまけ
- terraform-provider-mackerel を利用することで Mackerel のリソースを効率的に整備できます。Pull Request に AWS インテグレーションの Resource・DataSource も来ており、超期待しています・・・
メトリック投稿
概要図2:src
src
- Cognito から SignIn や SignUp などのメトリックが記録されている(と想定しています)
- EventBridge から定期的(
schedule_expression = "rate(5 minutes)"
)に handler メソッド(post_cognito_sign_in_stats)が呼び出される - System Manager パラメータストアに必要なパラメータを取得しに行く
- CloudWatch に蓄積されているメトリックを取得しに行く
- Lambda 関数のログを記録する
- 取得した Cognito の SignIn メトリック(成功数・試行数)を Mackerel サービスメトリックとして POST する
補足
- Mackerel サービスメトリックに投稿する際の時刻はエポック秒で指定する必要があります (see https://github.com/sogaoh/mackerel-practice/blob/master/scripts/lambda-cognito-metric/src/main.py#L31-L32)
-
ecspresso advent calendar 2020 day 24 - lambroll, sailtrim に lambroll の説明があります。 ↩︎
Discussion