🐮
Amazon ECS FargateでMackerel監視を導入する
背景
Amazon ECS Fargateで稼働しているコンテナのリソース使用状況(CPU、メモリ)やアプリケーションのメトリクスを監視するために、Mackerelを導入しました。
CloudWatchでも監視は可能ですが、Mackerelを使用することで以下のメリットがあります。
- 視覚的なダッシュボード: より見やすいグラフとメトリクス表示
- 柔軟なアラート設定: 複数の条件を組み合わせた通知
- サービス単位の管理: 複数のコンテナをサービスとしてグループ化
この記事では、Terraformを使ってECSタスク定義にMackerelエージェントを追加する手順を記録します。
前提条件
- Amazon ECS Fargateの環境が構築済み
- Terraformでインフラ管理している
- Mackerelアカウントを持っている(無料トライアルでも可)
Mackerel APIキーの取得
Mackerelにログイン
Mackerelにアクセスしてログインします。
APIキーを取得
- 右上のユーザーアイコン → 「オーガニゼーション」を選択
- 左メニューから「APIキー」をクリック
- 「新しいAPIキー」をクリック
- 「書き込み権限」を選択して作成
- 表示されたAPIキーをコピー(後で使用)
実装方法
AWS Systems Manager Parameter StoreにAPIキーを保存
重要: APIキーをタスク定義に直接書くのはセキュリティ上危険です。Parameter Storeを使用して安全に管理します。
aws ssm put-parameter \
--name "/mackerel/api-key" \
--type "SecureString" \
--value "YOUR_MACKEREL_API_KEY"
Terraformで管理する場合:
resource "aws_ssm_parameter" "mackerel_api_key" {
name = "/mackerel/api-key"
type = "SecureString"
value = "YOUR_MACKEREL_API_KEY"
}
ECSタスク実行ロールに権限を追加
Parameter Storeから値を読み取るために、ECSタスク実行ロールに権限を追加します。
resource "aws_iam_role_policy" "ecs_task_execution_ssm" {
name = "ecs-task-execution-ssm-policy"
role = aws_iam_role.ecs_task_execution_role.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"ssm:GetParameters",
"ssm:GetParameter"
]
Resource = [
"arn:aws:ssm:ap-northeast-1:YOUR_ACCOUNT_ID:parameter/mackerel/api-key"
]
}
]
})
}
タスク定義にmackerel-container-agentを追加
既存のタスク定義に、mackerel-container-agentコンテナを追加します。
resource "aws_ecs_task_definition" "app" {
family = "my-app"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = "256"
memory = "512"
execution_role_arn = aws_iam_role.ecs_task_execution_role.arn
task_role_arn = aws_iam_role.ecs_task_role.arn
container_definitions = jsonencode([
{
name = "app"
image = "your-app-image:latest"
# アプリケーションコンテナの設定...
},
{
name = "mackerel-container-agent"
image = "mackerel/mackerel-container-agent:latest"
essential = false
environment = [
{
name = "MACKEREL_CONTAINER_PLATFORM"
value = "ecs"
}
]
secrets = [
{
name = "MACKEREL_APIKEY"
valueFrom = "arn:aws:ssm:ap-northeast-1:YOUR_ACCOUNT_ID:parameter/mackerel/api-key"
}
]
}
])
}
ポイント:
-
essential = false: mackerel-container-agentが停止してもタスク全体は停止しない -
secrets: Parameter Storeから安全にAPIキーを読み取る -
MACKEREL_CONTAINER_PLATFORM = "ecs": ECS用の設定
Terraform適用
Terraformで変更を適用します。
terraform plan
terraform apply
確認方法
Mackerelでホストを確認
- Mackerelにログイン
- 左メニューから「ホスト」を選択
- ECSタスクがホストとして登録されていることを確認
タスク単位で以下の情報が表示されます:
- タスクARN
- CPU使用率
- メモリ使用率
- ネットワークトラフィック

ECSコンソールで確認
- AWSマネジメントコンソール → ECS
- 対象クラスターのタスクを選択
- ログタブで
mackerel-container-agentのログを確認 - エラーがなければ正常に動作しています
トラブルシューティング
mackerel-container-agentが起動しない
原因: Parameter Storeへのアクセス権限がない
対処法: ECSタスク実行ロールにssm:GetParameter権限が付与されているか確認
Mackerelにホストが表示されない
原因: APIキーが間違っている、またはネットワーク接続の問題
対処法:
- Parameter Storeに保存したAPIキーが正しいか確認
- ECSタスクがインターネットに接続できるか確認(NATゲートウェイの設定など)
セキュリティ上の注意
APIキーを直接書かない
以下のようにAPIキーを直接タスク定義に書くのはやめましょう。
# ❌ 悪い例
environment = [
{
name = "MACKEREL_APIKEY"
value = "YOUR_API_KEY_HERE" # 危険!
}
]
理由:
- タスク定義がバージョン管理システムに保存される
- AWSコンソールから誰でも閲覧できる
- APIキーが漏洩するとアカウントが不正利用される
必ずParameter Storeまたは Secrets Managerを使用してください。
Discussion