【Mackerel】AWSインテグレーションでECSを監視してみた

2022.02.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。ネクストモード株式会社 セールス担当のmachiです。
最近お客様から「ECSを監視したい!」というご要望をいただくことが増えたので、実際にやってみました。

※こちらのブログを参考にさせていただきました。

監視方法

今回はAWSインテグレーションを利用してECSのクラスターを監視します。
AWSインテグレーションとはMackerelの機能で、エージェントをインストールせずにAWSリソースを監視することができます。

詳細は公式ヘルプサイトをご確認ください。

ちなみに今回は実施しませんが、タスクの監視を行いたい場合は mackerel-container-agentをタスク定義に設定することで実現可能です。

監視対象の環境

さっそく監視しよう!と思ったのですが、監視をするためには監視する対象がなければいけないという当たり前の事実に直面しました。しかしECSなど構築したことはありません。

どうしたものかと思っていたら、AWS公式が出しているECSのハンズオンを見つけたのでやってみました。今回はこれで作ったECS環境(Fargate)を監視対象にします。

ちなみにこのハンズオン、初心者向けに懇切丁寧に解説してくれているのでめちゃめちゃ分かりやすかったです。手順通りに進めると最終的にはチャットアプリケーションが構築できちゃうので楽しい。

↓こんなヤツ

ECS環境

ハンズオンで作成したECS環境の情報を記載します。

クラスター情報

saml-access:~/environment/simplechat_ecs_app $ aws ecs describe-clusters --clusters simplechat
{
    "clusters": [
        {
            "clusterArn": "arn:aws:ecs:us-east-1:xxx:cluster/simplechat",
            "clusterName": "simplechat",
            "status": "ACTIVE",
            "registeredContainerInstancesCount": 0,
            "runningTasksCount": 1,
            "pendingTasksCount": 0,
            "activeServicesCount": 1,
            "statistics": [],
            "tags": [],
            "settings": [],
            "capacityProviders": [
                "FARGATE_SPOT",
                "FARGATE"
            ],
            "defaultCapacityProviderStrategy": []
        }
    ],
    "failures": []
}

タスク定義

saml-access:~/environment/simplechat_ecs_app $ aws ecs describe-task-definition --task-definition simplechat_taskdef
{
    "taskDefinition": {
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:xxx:task-definition/simplechat_taskdef:1",
        "containerDefinitions": [
            {
                "name": "simplechat_container",
                "image": "xxx.dkr.ecr.us-east-1.amazonaws.com/simplechat",
                "cpu": 0,
                "portMappings": [
                    {
                        "containerPort": 80,
                        "hostPort": 80,
                        "protocol": "tcp"
                    }
                ],
                "essential": true,
                "environment": [
                    {
                        "name": "DB_HOST",
                        "value": "simplechat-ecs-db.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com"
                    },
                    {
                        "name": "DB_PASS",
                        "value": "simplechat"
                    },
                    {
                        "name": "DB_USER",
                        "value": "root"
                    }
                ],
                "mountPoints": [],
                "volumesFrom": [],
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "/ecs/simplechat_taskdef",
                        "awslogs-region": "us-east-1",
                        "awslogs-stream-prefix": "ecs"
                    }
                }
            }
        ],
        "family": "simplechat_taskdef",
        "executionRoleArn": "arn:aws:iam::xxx:role/xxx",
        "networkMode": "awsvpc",
        "revision": 1,
        "volumes": [],
        "status": "ACTIVE",
        "requiresAttributes": [
            {
                "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
            },
            {
                "name": "ecs.capability.execution-role-awslogs"
            },
            {
                "name": "com.amazonaws.ecs.capability.ecr-auth"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
            },
            {
                "name": "ecs.capability.execution-role-ecr-pull"
            },
            {
                "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
            },
            {
                "name": "ecs.capability.task-eni"
            }
        ],
        "placementConstraints": [],
        "compatibilities": [
            "EC2",
            "FARGATE"
        ],
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "cpu": "256",
        "memory": "512",
        "registeredAt": 1638845804.548,
        "registeredBy": "arn:aws:sts::xxx:assumed-role/saml-access/xxx"
    }
}

モニタリング設定の流れ

前提が長くなってしまいましたが、ここからモニタリングの設定をしていきます。
下記のような流れで進めていきます。

  1. AWSインテグレーション用のIAMロールを作成
  2. AWSインテグレーション設定画面でECSを選択&タグを指定
  3. ECSのクラスターにタグを設定
  4. Mackerelでホストが登録されたか確認

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

AWSインテグレーションは、CloudWatch APIを利用してメトリクスを収集しています。
なので、Mackerelに対して自分のアカウントの読み取り権限を持つIAMロールを付与する必要があります。

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

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

IAMロールの作成方法はこちらを参照してください。

AWSインテグレーション設定画面でECSを選択&タグを指定

ECSにチェックを入れ、ホストを紐づけるサービス/ロールを指定します。
ちなみに取得するメトリックもここで細かく指定できます。

タグを指定することでホストを絞り込みます。今回はmonitoring:trueとします。

ECSのクラスターにタグを設定

クラスターで先ほど決めたタグ monitoring:true を設定してあげます。

Mackerelでホストが登録されたか確認

Mackerelポータルを確認してみると、早速Hostsに反映されています。

メトリックもちゃんと取れてます!!

おわりに

AWSインテグレーション機能を利用することで、簡単にECSクラスターの監視ができました。興味があれば是非お試しいただければと思います!

また、弊社ではMackerelをベースとした監視サービス「運用アシスタント」をご提供しています。
障害対応や日々の運用代行の実施も可能ですので、AWS運用にご不安がありましたらお気軽にお問い合わせ頂けますと幸いです。