CloudWatch Agentでインスタンスタイプも含めてメトリクスを転送する

cloudwatchアイキャッチ画像

CloudWatch Agentでは、append_dimensions を設定することで、メトリクスに追加情報を付与できます。
これにより、CloudWatch上でより詳細な分析が可能になります。

しかし、append_dimensions を設定しない場合、CloudWatch上では以下のように識別情報が不足した状態となります。

この状態では、複数インスタンスを管理する際にホスト名のみでの判別となります。
さらにホスト名は動的に変更されるケースもあり、運用上非常に不便です。

そこで今回は、以下の情報を付与します。

  • インスタンスID
  • インスタンスタイプ

これにより、CloudWatch上での可視性を向上させます。

事前準備

以下の準備が完了している前提とします。

  • httpd:インストール・起動・自動起動設定済み
  • CloudWatch Agent:インストール済み
  • EC2:必要なIAMロールをアタッチ済み
  • AWS CLI:インストール済み

CloudWatch Agent 設定ファイルの作成

設定ファイル作成

sudo vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json

以下の内容を記載します。

{
  "metrics": {
    "namespace": "CWAgent",
    "append_dimensions": {
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "aggregation_dimensions": [
      ["InstanceId"]
    ],
    "metrics_collected": {
      "procstat": [
        {
          "pattern": "httpd",
          "measurement": [
            "pid_count"
          ],
          "metrics_collection_interval": 60
        }
      ]
    }
  }
}

設定の反映

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
  -a fetch-config \
  -m ec2 \
  -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json \
  -s

ステータス確認

sudo systemctl status amazon-cloudwatch-agent

稼働確認

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a status

AWSマネジメントコンソールのCloudWatchから、インスタンスID、インスタンスタイプで取得できているのを確認

番外編:CloudWatch Alarmの作成(CloudFormation)

前提

SNSトピック作成済みEC2に以下のIAMロールが付与されていること

  • SNSトピック作成済み
  • EC2に以下のIAMロールが付与されていること
    CloudWatchAgentServerPolicy
    CloudWatchFullAccess(※検証用途)

CloudFormationテンプレート作成

vi cloudwatch-alarm.yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: Httpd procstat alarm

Parameters:

  TargetInstanceId:
    Type: AWS::EC2::Instance::Id

  InstanceType:
    Type: String

  SnsTopicArn:
    Type: String

Resources:

  HttpdDownAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      AlarmName: !Sub Httpd-Process-Down-${TargetInstanceId}
      Namespace: CWAgent
      MetricName: procstat_lookup_pid_count
      Statistic: Average
      Period: 60
      EvaluationPeriods: 1
      Threshold: 1
      ComparisonOperator: LessThanThreshold
      TreatMissingData: missing

      Dimensions:
        - Name: InstanceId
          Value: !Ref TargetInstanceId
        - Name: InstanceType
          Value: !Ref InstanceType
        - Name: pattern
          Value: httpd
        - Name: pid_finder
          Value: native  

      AlarmActions:
        - !Ref SnsTopicArn

デプロイ

aws cloudformation deploy \
  --template-file cloudwatch-alarm.yaml \
  --stack-name CloudWatch-Alarm-1

確認

CloudWatch Alarmが作成され、ステータスが「OK」であることを確認します。

インスタンスタイプを変えたらどうなるのか、テスト

今回の構成では、CloudWatchのディメンションに以下を含めています。

  • InstanceId
  • InstanceType

そのため、インスタンスタイプを変更するとディメンションが変化します。

例:

  • 変更前:t3.micro
  • 変更後:t3.small

この場合、メトリクスは「別データ」として扱われます。

結果として、

  • 旧アラーム → データ不足(INSUFFICIENT_DATA)

となります。

実際に試してみましょう。

CloudWatch メトリクスは現状下記です。

インスタンスタイプを変更

t3.microからt3.smallに変更します

CloudWatchメトリクスを確認

少し経つとインスタンスタイプがt3.microとt3.smallがでてきました。


ただし、以前のアラームは「データ不足」になりましたね。やはりDimensionでインスタンスタイプを指定した場合、インスタンスタイプ変更に合わせてCLoudWatchアラームの設定も変えないとダメなようです。