🐮

Amazon ECS FargateでMackerel監視を導入する

に公開

背景

Amazon ECS Fargateで稼働しているコンテナのリソース使用状況(CPU、メモリ)やアプリケーションのメトリクスを監視するために、Mackerelを導入しました。

CloudWatchでも監視は可能ですが、Mackerelを使用することで以下のメリットがあります。

  • 視覚的なダッシュボード: より見やすいグラフとメトリクス表示
  • 柔軟なアラート設定: 複数の条件を組み合わせた通知
  • サービス単位の管理: 複数のコンテナをサービスとしてグループ化

この記事では、Terraformを使ってECSタスク定義にMackerelエージェントを追加する手順を記録します。

前提条件

  • Amazon ECS Fargateの環境が構築済み
  • Terraformでインフラ管理している
  • Mackerelアカウントを持っている(無料トライアルでも可)

Mackerel APIキーの取得

Mackerelにログイン

Mackerelにアクセスしてログインします。

APIキーを取得

  1. 右上のユーザーアイコン → 「オーガニゼーション」を選択
  2. 左メニューから「APIキー」をクリック
  3. 「新しいAPIキー」をクリック
  4. 「書き込み権限」を選択して作成
  5. 表示された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でホストを確認

  1. Mackerelにログイン
  2. 左メニューから「ホスト」を選択
  3. ECSタスクがホストとして登録されていることを確認

タスク単位で以下の情報が表示されます:

  • タスクARN
  • CPU使用率
  • メモリ使用率
  • ネットワークトラフィック

ECSコンソールで確認

  1. AWSマネジメントコンソール → ECS
  2. 対象クラスターのタスクを選択
  3. ログタブでmackerel-container-agentのログを確認
  4. エラーがなければ正常に動作しています

トラブルシューティング

mackerel-container-agentが起動しない

原因: Parameter Storeへのアクセス権限がない

対処法: ECSタスク実行ロールにssm:GetParameter権限が付与されているか確認

Mackerelにホストが表示されない

原因: APIキーが間違っている、またはネットワーク接続の問題

対処法:

  1. Parameter Storeに保存したAPIキーが正しいか確認
  2. ECSタスクがインターネットに接続できるか確認(NATゲートウェイの設定など)

セキュリティ上の注意

APIキーを直接書かない

以下のようにAPIキーを直接タスク定義に書くのはやめましょう。

# ❌ 悪い例
environment = [
  {
    name  = "MACKEREL_APIKEY"
    value = "YOUR_API_KEY_HERE"  # 危険!
  }
]

理由:

  • タスク定義がバージョン管理システムに保存される
  • AWSコンソールから誰でも閲覧できる
  • APIキーが漏洩するとアカウントが不正利用される

必ずParameter Storeまたは Secrets Managerを使用してください。

参考リンク

GitHubで編集を提案

Discussion