[Day.19] TerraformでMackerel監視整備
以下の19日目のエントリです。
手抜きで恐縮なのですが、ほぼ↓の記事化です。[3]
監視設定一発化、それは割と理想なんじゃないでしょうか。
とあるプロダクトで、同様の構成であればパパッと監視を組めるように、この理想を目指してみたときのメモです。
情報源の列挙で、細かいことはあまり書いてありませんのでそのあたりはご承知おきください。
前提
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インテグレーション導入
マネコンで仕込んで後で terraform import した
タグで絞り込み(除外)
terraform-provider-mackerel で設定
Service・Role
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')
Channel・Alert(Group)
ここで1つリクエストを上げた
12/19 時点で Close にはなっていない
Monitor
Web外形監視 をいくつか設定
Notification Group
このあたりでも1つissue を上げていて、こちらは Close。slack
の mentions
には文字列を何かしら入れればOK
Fargate の Container を監視する
(エージェントを入れる)
Container Agent の利用準備
プラグインの利用
メトリックプラグイン、チェックプラグインが利用可能です。また、mackerel-container-agentでは 公式プラグインを同梱したDockerイメージ も公開しています。
plugins
> はlatest
に、vX.Y.Z-plugins
はvX.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 を使用
Container Agent 使ってみたメモ
nginx と php-fpm を /nginx_status と /phpfpm_status エンドポイントでメトリック採取に成功
だがしかし、 30 メトリックを越えると +1 マイクロホストになってしまうので php-fpm の設定を無念のコメントアウト。
AWSマネージドサービス毎の Monitor 設定例
EC2 以外はマイクロホスト扱い(たぶん。しかし、30 メトリックを越えると +1 マイクロホスト)
AWSインテグレーションで自動認識されたホスト(?)に Monitor (アラート閾値) 設定するときは custom.${Mackerel上でのメトリック名}
でホストメトリック監視を指定する
RDS
たとえば
- CPU使用率 : rds.cpu.used
- ディスク空き容量 : rds.aurora.storage.free
- DB接続数 : rds.database_connections.used
Redis
たとえば
- CPU使用率 : elasticache.cpu.used
- メモリ使用率 : elasticache.redis.memory_percentage.database
- Swap Usage : elasticache.swap.usage
参考情報
ECS
たとえば
- CPU使用率 : ecs.service_cpu_utilization.
#
.average - メモリ使用率 : ecs.service_memory_utilization.
#
.average - 稼働タスク数 : ecs.running_task.
#
.count
( #
には、ECSのサービス名が入る)
S3
メトリックは取るがとりあえずアラートはいいかな(容量気にしなくていい)
ALB
たとえば
- 4xx エラー(多すぎだったら不正アクセス試行とか) : alb.httpcode_count.alb_4xx
- 5xx エラー(多すぎだったらどこかにバグか障害) : alb.httpcode_count.alb_5xx
補足など
外形監視(external) アラート発生までの最大試行回数
ドキュメントには記載がないが
コードを確認する限り max_check_attempts
で指定可能、と予想して apply したらできた
terraform-provider-mackerel v0.0.5 から follow_redirect を指定できるようになった
Fargateまわり以外のインテグレーション情報
-
API Gateway
https://mackerel.io/ja/docs/entry/integrations/aws/apigateway -
Lambda
https://mackerel.io/ja/docs/entry/integrations/aws/lambda -
DynamoDB
https://mackerel.io/ja/docs/entry/integrations/aws/dynamodb
[4]
Heroku の監視↓の通りでいける。(けどサポート対象外です)
Heroku Dyno 料金の扱いなど
スタンダードホスト扱いの料金
公式プラグインをインストールする方法は今のところなさそう(yum,debコマンドでは Dyno にインストールできない)
(その後の進化)
ここまで、terraform-provider-mackerel v0.0.5 でやってましたが、
まだ v0.0.6 の目玉であった AWSインテグレーションの tf 化をやっていなかったり、
v0.0.7 で追加された mackerel_service_metric_names Data Source を活用できてなかったりなので是非使っていきたいです。
さいごに
明日20日目の予定は以下になっています。それぞれお楽しみに。
- Terraform :「Terraformで構築したインフラのテスト自動化について」by @Aquamarine_1010さん
- Mackerel :「継続的E2Eテストを監視する!」by @a_knowさん
-
18日目は @kzkamago0721 さんの 2021年 Terraform でやったことをまとめてみる でした。 ↩︎
-
18日目は @ne_sachirou さんの Mackerel の Google Cloud インテグレーションから、Compute Engine instance を自動退役する でした。 ↩︎
-
ひとりごとですが、スクラップを markdown で出力できなくなっていて軽く衝撃を受けました・・・ ↩︎
-
refs https://mackerel.io/ja/docs/entry/overview#support-environments ↩︎
Discussion