🐟

Cognito User Pool の Sign-In 数を Mackerel サービスメトリックに定期投稿する

2021/10/01に公開

このエントリは @sogaoh の Mackerel Ambassador としての記事 その10です。
(一覧は こちら

Mackerel には AWSインテグレーション があって、だいたいの AWS サービスの各種メトリックが可視化できます。
ところが 2021/9/23 時点で Amazon Cognito ユーザープール には未対応で、直接的に Mackerel にメトリックを投稿することができません。
そこで、AWS Lambda

というスクリプトを作って運用を始めました。
少し工夫してあって、スクリプトにいくらか手を加えれば他のメトリックでも投稿できるような感じに作ったので、利用できそうであればご自由に、という意図で記事化しました。

スクリプトはこちらに公開しています。

https://github.com/sogaoh/mackerel-practice/tree/master/scripts/lambda-cognito-metric

リポジトリトップの README.md には他のディレクトリの概要が書いてあったりしてますが、 scripts/lambda-cognito-metric 配下の内容がこの記事の範囲となります。

ということで、機構について自分なりの解説を書きます。

リソース構築/更新

概要図1:Create/lambroll

Create

scripts/lambda-cognito-metric/create にて terraform.tfvars を整備すれば以下のリソースを一括生成できます

  1. terraform-aws-modules/lambda/aws を利用してリソースを作成(lambdaFunction.tf の module lambda_cognito_metric_invoker
  2. var.function_name で指定した Lambda Function を作成する(Runtime は Python 3.9)
  3. policy_jsons に追加で必要となる IAM Policy を指定する
    • 投入される Policy は iam.tf で定義している cw_get_metric_policy_documentssm_get_parameter_policy_document
  4. CloudWatch Log Group を作成(terraform-aws-modules/lambda/aws デフォルト)
  5. 定期的に Lambda スクリプトを呼び出すように cloudWatchEvent.tf で定義した cognito_metric_post_rule_1 : schedule_expression = "rate(5 minutes)"cognito_metric_post_target_1 を作成
  6. tfstate を保存(サンプルソースでは backend を未指定なのでS3でなくローカルに保存されることになります)

lambroll

scripts/lambda-cognito-metric/lambroll にて .envrc を整備すれば、Lambda デプロイツールとして特化された lambroll [1] で関数の更新ができます。指定によりますが、invoke で実行も可能です。

  1. tfstate を参照している場合、参照項目を見に行く
  2. 新しいソースコードで 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 を調整してください)

おまけ

  1. terraform-provider-mackerel を利用することで Mackerel のリソースを効率的に整備できます。Pull Request に AWS インテグレーションの Resource・DataSource も来ており、超期待しています・・・

メトリック投稿

概要図2:src

src

  1. Cognito から SignIn や SignUp などのメトリックが記録されている(と想定しています)
  2. EventBridge から定期的(schedule_expression = "rate(5 minutes)")に handler メソッド(post_cognito_sign_in_stats)が呼び出される
  3. System Manager パラメータストアに必要なパラメータを取得しに行く
  4. CloudWatch に蓄積されているメトリックを取得しに行く
  5. Lambda 関数のログを記録する
  6. 取得した Cognito の SignIn メトリック(成功数・試行数)を Mackerel サービスメトリックとして POST する

補足

脚注
  1. ecspresso advent calendar 2020 day 24 - lambroll, sailtrim に lambroll の説明があります。 ↩︎

Discussion