🎄

[Day.19] TerraformでMackerel監視整備

2021/12/19に公開

以下の19日目のエントリです。

手抜きで恐縮なのですが、ほぼ↓の記事化です。[3]
https://zenn.dev/sogaoh/scraps/92c7bc7d4706b0

監視設定一発化、それは割と理想なんじゃないでしょうか。
とあるプロダクトで、同様の構成であればパパッと監視を組めるように、この理想を目指してみたときのメモです。
情報源の列挙で、細かいことはあまり書いてありませんのでそのあたりはご承知おきください。

前提

Fargateのサービス環境に監視を入れていく
やっていったことの情報源を書く
2ヶ月前
  • terraform 1.0.4 -> 1.0.8
  • terraform-provider-aws 3.52.0 -> 3.62.0
  • terraform-provider-mackerel 0.0.3 -> 0.0.5

現時点では

になっています。

AWSインテグレーション導入

https://mackerel.io/ja/docs/entry/integrations/aws

マネコンで仕込んで後で terraform import した
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role#import
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy#import
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment#import

タグで絞り込み(除外)
https://mackerel.io/ja/docs/entry/integrations/aws#tag

terraform-provider-mackerel で設定

https://registry.terraform.io/providers/mackerelio-labs/mackerel/0.0.3/docs
https://github.com/mackerelio-labs/terraform-provider-mackerel

Service・Role

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/service

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/role

Metadata

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/service_metadata
https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/role_metadata

これ何だろう?と思ったけどこういうことか。使いどころはわかっていない。。
https://mackerel.io/ja/api-docs/entry/metadata

mkr でホストにシェルで Service:Role を一括設定する


# SES をこんな感じで設定した
mkr update --roleFullname ${SERVICE}:Mail $(mkr hosts | jq -r '.[] | select(.displayName=="SES") | .id')

# Redis はこんな感じ
mkr update --roleFullname ${SERVICE}:${ROLE} $(mkr hosts | jq -r '.[] | select(.name | startswith("production-hoge-redis-cluster-001")) | .id')

https://mackerel.io/ja/docs/entry/advanced/cli

Channel・Alert(Group)

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/channel

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/alert_group_setting

ここで1つリクエストを上げた
https://github.com/mackerelio-labs/terraform-provider-mackerel/issues/59

12/19 時点で Close にはなっていない

Monitor

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/monitor

Web外形監視 をいくつか設定
https://mackerel.io/ja/docs/entry/external-monitoring

Notification Group

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/notification_group

このあたりでも1つissue を上げていて、こちらは Close。slackmentions には文字列を何かしら入れればOK
https://github.com/mackerelio-labs/terraform-provider-mackerel/issues/61

Fargate の Container を監視する

(エージェントを入れる)

https://mackerel.io/ja/docs/entry/howto/install-agent/container/ecsawsvpc

https://mackerel.io/ja/docs/entry/howto/container-agent

Container Agent の利用準備

プラグインの利用
メトリックプラグイン、チェックプラグインが利用可能です。

また、mackerel-container-agentでは 公式プラグインを同梱したDockerイメージ も公開しています。 plugins > は latest に、vX.Y.Z-pluginsvX.Y.Z にプラグインを同梱したイメージとなります。

(イメージの)サイズだいたい倍(使う・・・使った)

S3 から設定ファイルを参照するときの IAM ポリシー例(雑...)

{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*Object",
      "Resource": "arn:aws:s3:::${var.config_bucket_name}/*"
    }
  ],
  "Version": "2012-10-17"
}
タスク定義に追加するコンテナ定義例 (ecspresso 前提。関連情報含む)

    {
      "name": "mackerel-container-agent",
      "image":"{{ must_env `MACKEREL_ECR_IMAGE_REPO_TAG` }}",
      "memoryReservation": 128,
      "essential": false,
      "environment": [
        {
          "name": "MACKEREL_CONTAINER_PLATFORM",
          "value": "fargate"
         },
         {
           "name": "MACKEREL_AGENT_CONFIG",
           "value": "s3://hoge-config-store/development/mackerel.yaml"
         },
         {
           "name": "MACKEREL_AGENT_CONFIG_POLLING_DURATION_MINUTES",
           "value": "5"
         }
      ],
      "secrets": [
        {
           "name": "MACKEREL_APIKEY",
           "valueFrom": "{{ must_env `PARAM_STORE_PREFIX`}}{{`MACKEREL_API_KEY`}}"
        }
      ]
    }

ecspresso v1.6.0 対応の意図で CircleCI の Orb は v0.0.15 を使用

https://circleci.com/developer/orbs/orb/fujiwara/ecspresso

https://sfujiwara.hatenablog.com/entry/ecspresso-v1.6.0

https://github.com/kayac/ecspresso

Container Agent 使ってみたメモ

nginx と php-fpm を /nginx_status と /phpfpm_status エンドポイントでメトリック採取に成功
だがしかし、 30 メトリックを越えると +1 マイクロホストになってしまうので php-fpm の設定を無念のコメントアウト。

https://ja.mackerel.io/pricing

https://support.mackerel.io/hc/ja/articles/360039702912-ホスト数の計算方法について

AWSマネージドサービス毎の Monitor 設定例

EC2 以外はマイクロホスト扱い(たぶん。しかし、30 メトリックを越えると +1 マイクロホスト)

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/monitor

AWSインテグレーションで自動認識されたホスト(?)に Monitor (アラート閾値) 設定するときは custom.${Mackerel上でのメトリック名} でホストメトリック監視を指定する

RDS

https://mackerel.io/ja/docs/entry/integrations/aws/rds

たとえば

  • CPU使用率 : rds.cpu.used
  • ディスク空き容量 : rds.aurora.storage.free
  • DB接続数 : rds.database_connections.used

Redis

https://mackerel.io/ja/docs/entry/integrations/aws/elasticache

たとえば

  • CPU使用率 : elasticache.cpu.used
  • メモリ使用率 : elasticache.redis.memory_percentage.database
  • Swap Usage : elasticache.swap.usage

参考情報

https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/CacheMetrics.WhichShouldIMonitor.html

ECS

https://mackerel.io/ja/docs/entry/integrations/aws/ecs

たとえば

  • CPU使用率 : ecs.service_cpu_utilization.#.average
  • メモリ使用率 : ecs.service_memory_utilization.#.average
  • 稼働タスク数 : ecs.running_task.#.count

# には、ECSのサービス名が入る)

S3

https://mackerel.io/ja/docs/entry/integrations/aws/s3

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/configure-request-metrics-bucket.html

メトリックは取るがとりあえずアラートはいいかな(容量気にしなくていい)

ALB

https://mackerel.io/ja/docs/entry/integrations/aws/alb

たとえば

  • 4xx エラー(多すぎだったら不正アクセス試行とか) : alb.httpcode_count.alb_4xx
  • 5xx エラー(多すぎだったらどこかにバグか障害) : alb.httpcode_count.alb_5xx

補足など

外形監視(external) アラート発生までの最大試行回数

ドキュメントには記載がないが
https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/monitor#external

コードを確認する限り max_check_attempts で指定可能、と予想して apply したらできた
https://github.com/mackerelio-labs/terraform-provider-mackerel/blob/main/mackerel/resource_mackerel_monitor.go#L73

terraform-provider-mackerel v0.0.5 から follow_redirect を指定できるようになった
https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/monitor#follow_redirect

Fargateまわり以外のインテグレーション情報

Heroku の監視 [4]

↓の通りでいける。(けどサポート対象外です)
https://mackerel.io/ja/docs/entry/advanced/monitoring-heroku

Heroku Dyno 料金の扱いなど

スタンダードホスト扱いの料金
https://ja.mackerel.io/pricing

公式プラグインをインストールする方法は今のところなさそう(yum,debコマンドでは Dyno にインストールできない)
https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins

(その後の進化)

ここまで、terraform-provider-mackerel v0.0.5 でやってましたが、
まだ v0.0.6 の目玉であった AWSインテグレーションの tf 化をやっていなかったり、
v0.0.7 で追加された mackerel_service_metric_names Data Source を活用できてなかったりなので是非使っていきたいです。

https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/resources/aws_integration
https://registry.terraform.io/providers/mackerelio-labs/mackerel/latest/docs/data-sources/service_metric_names

さいごに

明日20日目の予定は以下になっています。それぞれお楽しみに。

脚注
  1. 18日目は @kzkamago0721 さんの 2021年 Terraform でやったことをまとめてみる でした。 ↩︎

  2. 18日目は @ne_sachirou さんの Mackerel の Google Cloud インテグレーションから、Compute Engine instance を自動退役する でした。 ↩︎

  3. ひとりごとですが、スクラップを markdown で出力できなくなっていて軽く衝撃を受けました・・・ ↩︎

  4. refs https://mackerel.io/ja/docs/entry/overview#support-environments ↩︎

Discussion