• トップ
  • ブログ一覧
  • Cloud Watch Agentについて調べてみた
  • Cloud Watch Agentについて調べてみた

    はじめに

    前回はAWSの監視ツールについて説明しました。

    CloudWatchが自動的にエラーをキャッチする機能についても触れましたが、残念ながらEC2インスタンスなどは標準設定では詳細なエラーログの自動出力をサポートしていません。

    今回の記事では、EC2インスタンスにCloudWatch Agentを導入し、エラーログや詳細メトリクスを検出する方法を解説します。

    EC2の作成

    まずはEC2を作成していきましょう。

    特に意識することはなく通常通りに作成して問題ないです。

      1. インスタンスの作成AWSマネジメントコンソールで「インスタンスを起動」ボタンをクリックします。
      2. AMIの選択希望するAmazon Machine Image (AMI) を選択します。今回は、無料枠のAmazon Linux AMIを利用します。
      3. インスタンスタイプの選択適切なインスタンスタイプ(例:t2.micro)を選び、「次のステップ: インスタンスの詳細の設定」へ進みます。
      4. ストレージの設定必要なストレージ容量を設定します。今回は最小値の8GBにします。
      5. キーペアキーペアを選択または新規作成します。
      6. セキュリティグループの設定新しいセキュリティグループを作成し、必要なポート(SSH用のポート22など)を開放します。
      7. 高度な詳細設定CloudWatchモニタリングの詳細を有効化します。

    1. インスタンスの確認と起動設定を確認し、「起動」ボタンを押します。

    注意する点は、詳細モニタリングを有効にする必要があることです。

    既に作成されているEC2インスタンスの設定を変更する場合は、起動中のインスタンスを選択し、「アクション」から「モニタリングとトラブルシューティング」へ進んで、「詳細モニタリングを有効化」を選択してください。

    これにより、詳細モニタリングが有効になります。再起動の必要はありません。

    IAMロールの作成

    次にIAMロールを作成します。

    EC2インスタンスがCloudWatchにログデータやメトリクスを送信するために必要です。

    1. IAMコンソールにアクセスAWSマネジメントコンソールにログインし、「サービス」メニューから「IAM」を選択します。
    2. ロールの作成「ロール」セクションで「ロールの作成」を選び、EC2を信頼されたエンティティとして設定します。
    3. ポリシーのアタッチ検索バーに「CloudWatchAgentServerPolicy」と「CloudWatchLogsFullAccess」と入力し、これらのポリシーを選択します。これにより、ロールにログデータとメトリクスをCloudWatchに送信する権限が与えられます。
    4. ロールの確認と作成設定内容を確認し、「ロールの作成」をクリックしてIAMロールを作成します。

    EC2インスタンスにIAMロールをアタッチ

    1. EC2ダッシュボードから、アタッチしたいインスタンスを選択します。
    2. 「アクション」>「セキュリティ」>「IAMロールの変更」を選び、先ほど作成したIAMロールを適用します。

    これで、EC2インスタンスがCloudWatchにデータを送信するための準備が整いました。

    CloudWatch Agentの設定

    導入方法

    それではEC2にCloudWatch Agentをインストールして設定していきましょう!!

    EC2インスタンスにSSHまたはセッションマネージャーでアクセスし、以下のコマンドを実行してください。

    1sudo yum install amazon-cloudwatch-agent -y

    インストールが完了したら、Agentの設定に進みます。

    設定ファイルの作成と編集

    CloudWatch Agentは設定ファイルに基づいて動作します。

    このファイルでは、監視するログファイルとデータ収集方法を定義します。

    設定ファイルはJSON形式で記述され、次の場所に/opt/aws/amazon-cloudwatch-agent/bin/config.json保存されます。

    設定ウィザードを使って設定ファイルを作成していきます。

    下記コマンドでウィザードが開始されます。

    1sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

    ウィザードの設定

    ウィザードでは、ログファイルのパスや収集間隔など、多くの設定を選択できます。

    例えば、メモリ使用量のような基本的なホストメトリクスの収集を設定できます。

    また、より詳細な設定で、特定のポートで動作するStatsDデーモンの設定も可能です。

    まず最初にagentと取得するmetricsについて質問されます。

    以下はコマンドの実行例です。

    1
    2[ec2-user@ip-172-31-0-26 ~]$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
    3================================================================
    4= Welcome to the Amazon CloudWatch Agent Configuration Manager =
    5=                                                              =
    6= CloudWatch Agent allows you to collect metrics and logs from =
    7= your host and send them to CloudWatch. Additional CloudWatch =
    8= charges may apply.                                           =
    9================================================================
    10On which OS are you planning to use the agent?
    111. linux
    122. windows
    133. darwin
    14default choice: [1]:
    15
    16Trying to fetch the default region based on ec2 metadata...
    17I! imds retry client will retry 1 timesAre you using EC2 or On-Premises hosts?
    181. EC2
    192. On-Premises
    20default choice: [1]:
    21
    22Which user are you planning to run the agent?
    231. cwagent
    242. root
    253. others
    26default choice: [1]:
    27
    28Do you want to turn on StatsD daemon?
    291. yes
    302. no
    31default choice: [1]:
    32
    33Which port do you want StatsD daemon to listen to?
    34default choice: [8125]
    35
    36What is the collect interval for StatsD daemon?
    371. 10s
    382. 30s
    393. 60s
    40default choice: [1]:
    41
    42What is the aggregation interval for metrics collected by StatsD daemon?
    431. Do not aggregate
    442. 10s
    453. 30s
    464. 60s
    47default choice: [4]:
    48
    49Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
    501. yes
    512. no
    52default choice: [1]:
    53
    54Do you want to monitor any host metrics? e.g. CPU, memory, etc.
    551. yes
    562. no
    57default choice: [1]:
    58
    59Do you want to monitor cpu metrics per core?
    601. yes
    612. no
    62default choice: [1]:
    63
    64Do you want to add ec2 dimensions (ImageId, InstanceId, InstanceType, AutoScalingGroupName) into all of your metrics if the info is available?
    651. yes
    662. no
    67default choice: [1]:
    68
    69Do you want to aggregate ec2 dimensions (InstanceId)?
    701. yes
    712. no
    72default choice: [1]:
    73
    74Would 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.
    751. 1s
    762. 10s
    773. 30s
    784. 60s
    79default choice: [4]:
    80
    81Which default metrics config do you want?
    821. Basic
    832. Standard
    843. Advanced
    854. None
    86default choice: [1]:

    このセクションでここまでの設定値が反映されたJSONが出力されます。

    1
    2  {
    3    "agent": {
    4      "metrics_collection_interval": 60,
    5      "run_as_user": "cwagent"
    6    },
    7    "metrics": {
    8      "aggregation_dimensions": [
    9        [
    10          "InstanceId"
    11        ]
    12      ],
    13      "append_dimensions": {
    14        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
    15        "ImageId": "${aws:ImageId}",
    16        "InstanceId": "${aws:InstanceId}",
    17        "InstanceType": "${aws:InstanceType}"
    18      },
    19      "metrics_collected": {
    20        "collectd": {
    21          "metrics_aggregation_interval": 60
    22        },
    23        "disk": {
    24          "measurement": [
    25            "used_percent"
    26          ],
    27          "metrics_collection_interval": 60,
    28          "resources": [
    29            "*"
    30          ]
    31        },
    32        "mem": {
    33          "measurement": [
    34            "mem_used_percent"
    35          ],
    36          "metrics_collection_interval": 60
    37        },
    38        "statsd": {
    39          "metrics_aggregation_interval": 60,
    40          "metrics_collection_interval": 10,
    41          "service_address": ":8125"
    42        }
    43      }
    44    }
    45  }

     

    設定項目について、重要な項目を説明します。

    • metrics_collection_interval: この値はメトリクスがどの頻度で収集されるかを定義します。例えば、60 と設定すると、メトリクスは毎分収集されます。
    • append_dimensions: これはメトリクスに追加される次元で、例えばEC2インスタンスに関連する InstanceId や InstanceType などを含めることができます。これにより、メトリクスがどのEC2インスタンスに関連しているかを簡単に特定できます。
    • metrics_collected: どのメトリクスを収集するかを定義します。disk や mem はそれぞれディスク使用率やメモリ使用率を収集します。

    基本的にはdefaultの設定でOKです。

    では引き続きウィザードで設定値を入力します。

    次はログファイルのモニタリング設定を行うプロセスです。

    1
    2  Are you satisfied with the above config? Note: it can be manually customized after the wizard completes to add additional items.
    3  1. yes
    4  2. no
    5  default choice: [1]:
    6  
    7  Do you have any existing CloudWatch Log Agent (http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html) configuration file to import for migration?
    8  1. yes
    9  2. no
    10  default choice: [2]:
    11  
    12  Do you want to monitor any log files?
    13  1. yes
    14  2. no
    15  default choice: [1]:
    16  
    17  Log file path:
    18  /home/ec2-user/test.log
    19  Log group name:
    20  default choice: [test.log]
    21  Test
    22  Log group class:
    23  1. STANDARD
    24  2. INFREQUENT_ACCESS
    25  default choice: [1]:
    26  
    27  Log stream name:
    28  default choice: [{instance_id}]
    29  test.log
    30  Log Group Retention in days
    31  1. -1
    32  2. 1
    33  3. 3
    34  4. 5
    35  5. 7
    36  6. 14
    37  7. 30
    38  8. 60
    39  9. 90
    40  10. 120
    41  11. 150
    42  12. 180
    43  13. 365
    44  14. 400
    45  15. 545
    46  16. 731
    47  17. 1096
    48  18. 1827
    49  19. 2192
    50  20. 2557
    51  21. 2922
    52  22. 3288
    53  23. 3653
    54  default choice: [1]:
    55  2
    56  Do you want to specify any additional log files to monitor?
    57  1. yes
    58  2. no
    59  default choice: [1]:
    60  2
    61  Do you want the CloudWatch agent to also retrieve X-ray traces?
    62  1. yes
    63  2. no
    64  default choice: [1]:
    65  2
    66  Existing config JSON identified and copied to:  /opt/aws/amazon-cloudwatch-agent/etc/backup-configs
    67  Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
    68  Current config as follows:
    69  {
    70    **省略**
    71  }
    72  Please check the above content of the config.
    73  The config file is also located at /opt/aws/amazon-cloudwatch-agent/bin/config.json.
    74  Edit it manually if needed.
    75  Do you want to store the config in the SSM parameter store?
    76  1. yes
    77  2. no
    78  default choice: [1]:
    79  2
    80  Program exits now.

    こちらも基本的にはdefaultの設定でOKですが、下記の項目はNoを選択しました。

    Do you want the CloudWatch agent to also retrieve X-ray traces?

    X-rayトレースの取得は今回は行いません。

    Do you want to store the config in the SSM parameter store?

    SSMパラメータストアに設定を保存しないためNoを選択しました。

    設定項目について、説明します。

    • Log file path: モニタリングしたいログファイルのパスを指定します。
    • Log group name: CloudWatch Logsのロググループ名を入力します。デフォルトではログファイル名が使用されますが、異なる名前を設定することもできます。
    • Log stream name: ログストリームの名前を設定します。デフォルトではEC2インスタンスのIDが使用されますが、ここでは「test.log」という名前を選択しています。
    • Log Group Retention in days: ログデータの保持期間を選択します。ここでは「2」(1日)を選択して、ログデータを1日間保持するように設定しています。

    設定したいログファイルが複数ある場合は、Do you want to specify any additional log files to monitor?で「1」(yes)を選択して同様の手順で複数のログファイルを設定できます。

    最終的なconfig.jsonは下記になります。

    1
    2{
    3  "agent": {
    4    "metrics_collection_interval": 60,
    5    "run_as_user": "cwagent"
    6  },
    7  "logs": {
    8    "logs_collected": {
    9      "files": {
    10        "collect_list": [
    11          {
    12            "file_path": "/home/ec2-user/test.log",
    13            "log_group_class": "STANDARD",
    14            "log_group_name": "Test",
    15            "log_stream_name": "test.log",
    16            "retention_in_days": 1
    17          }
    18        ]
    19      }
    20    }
    21  },
    22  "metrics": {
    23    "aggregation_dimensions": [
    24      [
    25        "InstanceId"
    26      ]
    27    ],
    28    "append_dimensions": {
    29      "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
    30      "ImageId": "${aws:ImageId}",
    31      "InstanceId": "${aws:InstanceId}",
    32      "InstanceType": "${aws:InstanceType}"
    33    },
    34    "metrics_collected": {
    35      "collectd": {
    36        "metrics_aggregation_interval": 60
    37      },
    38      "disk": {
    39        "measurement": [
    40          "used_percent"
    41        ],
    42        "metrics_collection_interval": 60,
    43        "resources": [
    44          "*"
    45        ]
    46      },
    47      "mem": {
    48        "measurement": [
    49          "mem_used_percent"
    50        ],
    51        "metrics_collection_interval": 60
    52      },
    53      "statsd": {
    54        "metrics_aggregation_interval": 60,
    55        "metrics_collection_interval": 10,
    56        "service_address": ":8125"
    57      }
    58    }
    59  }
    60}

    より具体的なメトリクスログを出力するための設定

    メモリ使用率やディスク使用率のみを取得する場合、collectdのインストールは不要です。

    アプリケーションやサービスから追加のメトリクスを取得する必要がある場合は、collectdをインストールしてください。

    collectdをインストールするには、以下のコマンドを実行します。

    1sudo yum install collectd -y

    Agentの起動とログの確認

    設定が完了したら、以下のコマンドを使用してCloudWatch Agentを起動します。

    このコマンドは、指定された設定ファイルに基づいてAgentを実行します。

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

    ここまでで、CloudWatch Agentの設定は完了です!

    Agentの停止と再起動

    設定ファイル/opt/aws/amazon-cloudwatch-agent/bin/config.jsonを変更した後は、プロセスの再起動が必要になります。

    CloudWatch Agentを停止するには、以下のコマンドを実行します。

    1sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop

    CloudWatch Agentを再起動するには、以下のコマンドを実行します。

    1sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a restart

    CloudWatch logの確認

    実際にAWSマネジメントコンソールからCloudWatchを確認していきます。

    CloudWatch ロググループの確認

    まずはロググループが正しく作成されているかを確認します。

    EC2インスタンスにSSH接続してログファイルを適当に作成します。

    1touch /home/ec2-user/test.log
    2echo "Sample log data for CloudWatch" >> /home/ec2-user/test.log

    次にAWSマネジメントコンソールにログインし、CloudWatchサービスに移動して「ログ」セクションを開きます。

    ここで「Test」という名前のロググループが作成されていることが確認できます。

    ロググループを選択すると、保存されたログエントリを見ることができます。

    無事にログを収集できたようです。

    CloudWatch メトリクスの確認

    CloudWatch で「CWAgent」カテゴリが追加されていることが確認できます。

    「CWAgent」を押すと、設定した名前空間毎に対象のメトリクスが確認できます。

    これで詳細なメトリクスログを確認できるようになりました。

    具体的には、ディスク使用率の詳細や、メモリ使用率です。

    まとめ

    今回はCloudWatch Agentについてご紹介してきました。

    CloudWatch Agentを利用することで、EC2インスタンスのエラーログやメトリクスログをキャッチすることが出来るようになりました。

    これらの情報を使ってSNSトピックを設定し、システムの重要な変更点に基づいてアラートを設定することが可能です。

    EC2を起動する際には、user_dataスクリプトによるCloudWatch Agentの自動ダウンロードと設定を行うと便利そうです。

    今後もAWSサービスに関するさまざまな情報をブログで共有していきたいと思います。

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    あだっちー(エンジニア)
    あだっちー(エンジニア)
    Show more...

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background