CloudWatch AgentでEC2インスタンスのメモリ使用率を取得する

  • 2021年4月14日
  • 2021年4月16日
  • AWS, IT
AWS

こんにちはますのです。

AWSのお勉強をしている中で「CloudWatchはメモリの取得が出来んのやろ??」という事実は知っておりました。
解決方法もエージェントをインストールすれば良いということもさらりと理解していました。

そこで今回、ついに。
EC2インスタンスのメモリ取得を行う必要が出ました。
今まで知識として理解していた内容を実際にやってみようという状況です。

今まで億劫で知識だけ蓄えていたのですが、実践してみるきっかけになりました。
調べていくなかで、手順が長くてめんどくさ…。と死んだ目をしています。が、やるしかありません。れっつとらい。

やることのざっくりまとめ

おおよそですが、以下の流れで進めていきます。

  • メモリ値等を取得するためのIAMロールを作成する
  • IAMロールをEC2インスタンスにアタッチする
  • SystemsManagerからCloudWatchエージェントをインストールする
  • EC2インスタンス上でCloudWatchエージェントの設定ファイルを作成する
  • SystemsManagerからCloudWatchエージェントを起動する
  • CloudWatch上からメモリ値を確認する

OS:Amazon Linux2のインスタンスからメモリを取得する

参考手順はこちら
新しいCloudWatch AgentでEC2インスタンスのメモリ使用率を監視する

検証用で雑に作っていたEC2インスタンスを対象に取得検証です。OS情報を確認。

[ec2-user@ip-172-16-0-72 ~]$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

EC2インスタンスへIAMロールをアタッチする

まずは事前にEC2インスタンスにアタッチするIAMロールを作成します。

ロールの作成:ユースケースの選択

IAMロールの作成から

「AWSサービス」>「ユースケースの選択:EC2」を選択

ロールの作成:Attachアクセス権限ポリシー

必要になるポリシーは以下のどちらか。

AdminPolicyは設定ファイルをパラメータストアへ書き込むための「ssm:PutParameter」権限が付与されています。
こちらは必要に応じて使い分けるそうな。

わたしは今回「CloudWatchAgentAdminPolicy」を設定します。

CloudWathcエージェントをインストールする際に手法がいくつかあります。
・AWS Systems Managerからインストールする
・EC2インスタンスにSSH接続してインストールする
参考:CloudWatch エージェントのインストール
今回は「SystemsManager」からインストールを行うため、別途「AmazonSSMManagedInstanceCore」もポリシーに含めています。
※「AmazonEC2RoleforSSM」は旧ポリシーとなるため利用は非推奨のようです。
参考:マネージドインスタンスポリシーのベストプラクティスの適用

EC2インスタンスへIAMロールをアタッチする

続いて先ほど作成したIAMロール「CloudWatchAgentAdminPolicy」をメモリ取得したいEC2インスタンスへアタッチします。

  • 設定箇所:EC2ダッシュボード>対象のEC2を選択>アクション>セキュリティ>IAMロールを変更

以上で事前作業のIAMロール作成とアタッチは完了となります。

CloudWactch Agent のインストール

続いて本題です。
EC2インスタンスへインストールを行います。

yumでインストールする場合(Amazon Linux2限定)

Amazon Linux2であればyumコマンドで簡単にインストールが出来るようです。
今回はSystemsManagerでSSH接続無しでやってみたいので保留です。

sudo yum install amazon-cloudwatch-agent

AWS Systems Managerでインストールする(SSMエージェント事前確認)

前提として「amazon-ssm-agent」がサーバにインストールされている必要があります。
ちなみに今回はAmazon Linux2なのでデフォルトでインストール済です。
念のため「yum info」コマンドで確認します。

[ec2-user@ip-172-16-0-72 ~]$ yum info amazon-ssm-agent

Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
Installed Packages
Name : amazon-ssm-agent
Arch : x86_64
Version : 3.0.161.0
Release : 1.amzn2
Size : 135 M
Repo : installed
Summary : Manage EC2 Instances using SSM APIs
URL : http://docs.aws.amazon.com/ssm/latest/APIReference/Welcome.html
License : ASL 2.0
Description : This package provides Amazon SSM Agent for managing EC2 Instances using SSM APIs
AWS SystemsManagerの使い方は筆者も勉強中。
ハンズオンのPDFがありましたが、基本設定は同じようですね。
設定後、10分程度放置したあと確認したらSystemsManager上からインスタンスを確認出来ました。
参考:AWS Systems ManagerのハンズオンPDF

AWS SystemsManager:Run Commandからコマンド実行

それでは実際にCloudWatchエージェントをインストールしてみましょう。
コマンドドキュメントでは「AWS-ConfigureAWSPackage」を選択します。

  • AWS Systems Manager>Run Commandを選択>「AWS-ConfigureAWSPackage」を選択
  • コマンドのパラメータ:「Name:AmazonCloudWatchAgent」「Version:latest」を入力する
  • ターゲット:インスタンスを手動で選択する>対象のEC2インスタンスを選択

    EC2インスタンスに割り当てたロールに「AmazonSSMManagedInstanceCore」が含まれていない場合、ターゲットのインスタンス一覧には表示されないので注意。
  • 他はデフォルト設定のまま実行します。
    S3へログを出力、SNSによる通知が必要な場合は適宜設定を行います。

コマンドが成功になればインストール完了となります。

CloudWatchAgent:設定ファイルの作成

最後にCloudWatchエージェントの設定ファイルを作成します。
作成方法は2通り。

  • ウィザードを使用してCloudWatchエージェント設定ファイルを作成
  • 手動で作成、編集して適用

今回は簡単そうな「ウィザードを使用」で作っていきたいと思います。

設定ファイル作成の概要

今回はメモリの値を取得したいので「StatsD」や「CollectD」は設定しない方針です。
参考:Amazon CloudWatch Agent adds Custom Metrics Support

EC2インスタンスへ接続しウィザードを起動する

EC2インスタンス接続してからウィザードを起動します。

  • 以下のコマンドを実行
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
  • OSはAmazonLinux2なので「1. linux」を選択
=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
1
  • EC2インスタンスなので「1. EC2」を選択
Trying to fetch the default region based on ec2 metadata...
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
1
  • エージェントを実行するユーザはデフォルトのrootなので「1. root」を選択
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
  • StatsD デーモン監視は不要なので「2. no」を選択
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
2
  • CollectD のメトリクスを監視は不要なので「2. no」を選択
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]: 
2
  • CPUとメモリを取得するため「1. yes」を選択
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
  • 1コア毎にCPUを監視するか?課金されたくないので今回は「2. no」を選択。
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
2
  • EC2のイメージID, インスタンスID などもメトリクスの情報に追加したいか?よくわからないのでとりあえず「1. yes」を選択
Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
1. yes
2. no
default choice: [1]:
1
  • メトリクス取得の頻度は60秒で良いので「4. 60s」を選択
Would you like to collect your metrics at high resolution (sub-minute resolution)? This enables sub-minute resolution for all metrics, but you can customize for specific metrics in the output json file.
1. 1s
2. 10s
3. 30s
4. 60s
default choice: [4]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1
  • 今までの設定した内容をjsonファイルとして表示されます。

Current config as follows:
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
    },
  "metrics": {
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
      },
    "metrics_collected": {
      "disk": {
        "measurement": [
          "used_percent"
          ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
          ]
        },
      "mem": {
        "measurement": [
          "mem_used_percent"
          ],
        "metrics_collection_interval": 60
      }
    }
  }
}
Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
1. yes
2. no
default choice: [1]:
1
  • CloudWatch Log Agentは入れていないので「2. no」を選択
Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
1. yes
2. no
default choice: [2]:
2
  • ログファイルは監視対象としないので「2. no」を選択
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:
  • 再度確認画面が表示される。
    先ほどの内容にAccessLogが追加されるか否かの違いの様子。
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
  "agent": {
    "metrics_collection_interval": 60,
    "run_as_user": "root"
  },
  "metrics": {
    "append_dimensions": {
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}"
    },
    "metrics_collected": {
      "disk": {
        "measurement": [
          "used_percent"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
        ]
      },
      "mem": {
        "measurement": [
          "mem_used_percent"
        ],
        "metrics_collection_interval": 60
      }
    }
  }
}
Please check the above content of the config.
The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
Edit it manually if needed.
Do you want to store the config in the SSM parameter store?
1. yes
2. no
default choice: [1]:
  • パラメータストアにconfigを保存する際の名前。
    デフォルトで良いのでそのままエンター。
What parameter store name do you want to use to store your config? (Use 'AmazonCloudWatch-' prefix if you use our managed AWS policy)
default choice: [AmazonCloudWatch-linux]
  • パラメータストアをどのリージョンに保存するか。
    EC2インスタンスと同じリージョンで良いのでそのままエンター。
Trying to fetch the default region based on ec2 metadata...
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]
  • AWSのクレデンシャルはIAMロールに設定されている「AmazonEC2RoleForSSM」を使うのでそのままエンター。
Which AWS credential should be used to send json config to parameter store?
1. AAAABBBBCCCC111122223333(From SDK)
2. Other
default choice: [1]:

こちらで最後になります。
IAMロールの設定が間違えていなければウィザードが完了となります。

Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.

CloudWatch Agentの起動

先ほど設定した設定ファイルを元にCloudWatchエージェントを起動します。

SystemsManager>RunCommandより実行

  • SystemsManagerの「Run Command」ボタンをクリックします。
  • AmazonCloudWatch-ManageAgent」を検索より抽出し、選択します。
  • Optional Configuration Locationの欄に先ほど作成したconfigファイル名「AmazonCloudWatch-linux」を入力します。
  • 「ターゲット:インスタンスを手動で選択する」を選択>メモリ値を取得したいEC2インスタンスを選択>実行をクリック
  • コマンド実行が成功となれば完了です。

CloudWatchからEC2インスタンスのメモリを確認する

それでは今まで設定してきた内容が反映されているかCloudWatchから動作確認してみましょう。

  • CloudWatch:メトリクス>「CWAgent」が表示される
    ※表示されるまでに数分掛かりました。筆者は大体5分程度??
  • 「メトリクス名:mem_used_percent」の項目をチェックするとメモリ値が確認出来ました。
設定値をひとつひとつ確認すると時間が掛かりましたが、設定方法はそこまで重たい作業ではない印象でした。
SystemsManagerでSSH接続も可能になるので、CloudWatchエージェント導入時はSystemsManagerエージェントも一緒に入れると幸せになれそうです。

 

最新情報をチェックしよう!