【小ネタ】MackerelのAWSインテグレーションを使ってECSを監視する

こんばんわ、札幌のヨシエです。
MackerelのAWSインテグレーションにAmazon ECSが対応しており、EC2インスタンスとFargateの2種類で
設定方法の認識に曖昧な部分があったので確認のために検証作業を行いました。

ECS環境を作成

現在のECSではコンテナホストにEC2インスタンスとFargateが利用できます。
どちらの作業手順も確認するためにそれぞれのECSクラスターを作成しました。

クラスター情報(EC2)

% aws ecs describe-clusters --clusters test-ondemand
{
    "clusters": [
        {
            "status": "ACTIVE",
            "statistics": [],
            "tags": [],
            "clusterName": "test-ondemand",
            "settings": [
                {
                    "name": "containerInsights",
                    "value": "disabled"
                }
            ],
            "registeredContainerInstancesCount": 2,
            "pendingTasksCount": 0,
            "runningTasksCount": 5,
            "activeServicesCount": 1,
            "clusterArn": "arn:aws:ecs:ap-northeast-1:xxx:cluster/test-ondemand"
        }
    ],
    "failures": []
}

クラスター情報(Fargate)

% aws ecs describe-clusters --clusters test-fargate
{
    "clusters": [
        {
            "status": "ACTIVE",
            "statistics": [],
            "tags": [],
            "clusterName": "test-fargate",
            "settings": [
                {
                    "name": "containerInsights",
                    "value": "disabled"
                }
            ],
            "registeredContainerInstancesCount": 0,
            "pendingTasksCount": 0,
            "runningTasksCount": 5,
            "activeServicesCount": 1,
            "clusterArn": "arn:aws:ecs:ap-northeast-1:xxx:cluster/test-fargate"
        }
    ],
    "failures": []
}

タスク定義

今回は同様のタスクとしたかったのでネットワークモードをawsvpcとして、Apacheイメージを利用してます。

% aws ecs describe-task-definition --task-definition monitor-http:4
{
    "taskDefinition": {
        "status": "ACTIVE",
        "networkMode": "awsvpc",
        "family": "monitor-http",
        "placementConstraints": [],
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
            },
            {
                "name": "ecs.capability.task-eni"
            }
        ],
        "cpu": "256",
        "compatibilities": [
            "EC2",
            "FARGATE"
        ],
        "volumes": [],
        "memory": "512",
        "requiresCompatibilities": [
            "EC2",
            "FARGATE"
        ],
        "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:xxx:task-definition/monitor-http:4",
        "containerDefinitions": [
            {
                "environment": [],
                "name": "http",
                "mountPoints": [],
                "image": "httpd:latest",
                "cpu": 0,
                "portMappings": [
                    {
                        "protocol": "tcp",
                        "containerPort": 80,
                        "hostPort": 80
                    }
                ],
                "memory": 128,
                "essential": true,
                "volumesFrom": []
            }
        ],
        "revision": 4
    }
}

Mackerel AWSインテグレーション用IAMロール作成

ECS情報を取得するポリシーには以下のIAMポリシーをアタッチしたIAMロールを作成します。

  • ecs:Describe* / ecs:List*
  • CloudWatchReadOnlyAccess

アタッチポリシー以外の作業は以下のURLを参照いただければと思います。
AWSインテグレーション

AWSインテグレーション設定

AWSインテグレーション画面にてECSのチェックボックスにチェックを入れ、監視対象に設定したいサービス/ロールを指定します。

EC2と同じようにタグ指定にてホストを絞り込みます。

ECS上でタグを設定

EC2インスタンスの場合

EC2インスタンスをコンテナホストとしている場合、EC2の画面から対象のホスト情報をが確認できます。
通常のEC2インスタンスであればEC2画面からインスタンスごとにタグを設定する形で問題ありませんが、今回はECSクラスターを監視対象とするためクラスターのタグに監視対象タグを追加します。

Fargateの場合

Fargateに関しても同じ設定で監視対象の登録が出来ました。

以上で監視追加設定は完了です。

取得メトリックを確認

当たり前ですが、AWSインテグレーションとしてCloudWatchのメトリックを取得する点からコンテナホストの種別によって
取得メトリックが異なります。

EC2

Fargate

最後に

約30分程度でECSクラスターのメトリックをMackerelで確認できるようになりました。
ECS自体はWorkerの役割で使われることもあってウェブサーバーなどのELBと連携しているコンテナであれば、 アラートグループで関係するリソースをまとめることでELBのメトリック状態とECSコンテナのメトリック状態を確認することが出来るのでおすすめです。 より詳細なメトリックが必要な時は、サイドカーとしてmackerel-container-agentを起動する形が適切かと思いますので要件によってご検討いただければと思います。