BLOG

ブログ

【AWS】3ステップで出来るCloudWatchでEC2内のログを監視する方法

2022.01.03

タロウです。

CloudWatchでミドルウェアやアプリケーションログを簡単にキャッチすることができたのでご紹介します!

手順

  • EC2インスタンスにAWS System Manegerからエージェントをインストール
  • SSHでインスタンスへ入り、Watchするファイルなど基本設定を行う
  • 出力されたログをClowdWatchから確認する

の3ステップとなります!

CloudWatchエージェントの設定

CloudWatchでEC2内で出力されるログを参照できるよう権限設定を行います。
System Managerからエージェントをインストールし、
SSHで入って質問に答えて完了します。

ロール設定

AmazonSSMFullAccessAmazonEC2ReadOnlyAccessの権限を持ったIAMRoleを作成します。

まずはIAMから新規ロールを作成します。

ユースケースの選択:EC2 を選択します。

ポリシーをアタッチします。
フィルタ検索に下記を入力し、チェックボックスをつけます。
・AmazonSSMFullAccess
・AmazonEC2ReadOnlyAccess

ロール名とロールの説明を入力し、ロールの作成で完了します。

※注意※

EC2にすでにアタッチ済みのロールが存在する場合は、アタッチ済みのロールに上記権限を追加します!

作成したロールをEC2にアタッチする

ログ収集対象のEC2インスタンスへ作成したロールをアタッチします。

コンソールよりEC2サービスを選択、ログ収集対象のインスタンスを選択します。

IAMロールを変更より、IAMロールを作成したロールへ変更します。

ロールの設定は以上で終了です。

ログ収集の設定を行う

AWS SystemManagerを使用して、ログ収集を行う準備を進めます。
SSHでEC2インスタンスに入らずとも収集設定ができるのはとても便利です!

AWS Systems ManagerからSSMエージェントをアップデートする

AWS Systems Managerへアクセスします。

画面左下の Run commandを選択

検索部分に”AWS-UpdateSSMAgent”を入力して選択

画面中段の”ターゲット”から、EC2インスタンスを選択して、そのまま実行

しばらくすると、コマンドが正常終了します。

AWS-ConfigureAWSPackageをインストールする

同様にコマンドAWS-ConfigureAWSPackageを検索し、インスタンスを選択します。
コマンドのパラメータへ下記を入力し実行します。

NameAmazonCloudWatchAgent
Versionlatest

設定内容作成

設定ファイルの初期化を行います。
SSHでインスタンスに入り、操作します。

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

質問に答えながら進めていきます。
※ログファイルであればなんでも大丈夫ですが、今回はApatchログをWatchします。

Apatch/var/log/httpd/access_log
Versionlatest

ログファイルの指定

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

=============================================================
= Welcome to the AWS CloudWatch Agent Configuration Manager =
=============================================================
On which OS are you planning to use the agent?
1. linux
2. windows
default choice: [1]:

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]:

Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:

Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:

Which port do you want StatsD daemon to listen to?
default choice: [8125]

What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
3
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
3
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:

Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:

Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:

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]:

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]:
3
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
3
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 30,
                "run_as_user": "root"
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 30
                        },
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 30,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 30,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time",
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 30,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 30
                        },
                        "netstat": {
                                "measurement": [
                                        "tcp_established",
                                        "tcp_time_wait"
                                ],
                                "metrics_collection_interval": 30
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 30,
                                "metrics_collection_interval": 60,
                                "service_address": ":8125"
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 30
                        }
                }
        }
}
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]:

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
Do you want to monitor any log files?
1. yes
2. no
default choice: [1]:

Log file path:
/var/log/httpd/access_log
Log group name:
default choice: [access_log]

Log stream name:
default choice: [{instance_id}]

Do you want to specify any additional log files to monitor?
1. yes
2. no
default choice: [1]:

default choice: [1]:
2
Saved config file to /opt/aws/amazon-cloudwatch-agent/bin/config.json successfully.
Current config as follows:
{
        "agent": {
                "metrics_collection_interval": 30,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/httpd/access_log",
                                                "log_group_name": "access_log",
                                                "log_stream_name": "{instance_id}"
                                        },
                                ]
                        }
                }
        },
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "collectd": {
                                "metrics_aggregation_interval": 30
                        },
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle",
                                        "cpu_usage_iowait",
                                        "cpu_usage_user",
                                        "cpu_usage_system"
                                ],
                                "metrics_collection_interval": 30,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": false
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent",
                                        "inodes_free"
                                ],
                                "metrics_collection_interval": 30,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "io_time",
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 30,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 30
                        },
                        "netstat": {
                                "measurement": [
                                        "tcp_established",
                                        "tcp_time_wait"
                                ],
                                "metrics_collection_interval": 30
                        },
                        "statsd": {
                                "metrics_aggregation_interval": 30,
                                "metrics_collection_interval": 60,
                                "service_address": ":8125"
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 30
                        }
                }
        }
}
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]:

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]

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]

Which AWS credential should be used to send json config to parameter store?
1. XXXXXXXXXXXXXXXX(From SDK)
2. Other
default choice: [1]:

最後の質問でEnterを押すと設定完了します。

Agentの設定を行う

インスタンスにSSHで入り、下記を実行する

sudo mkdir /usr/share/collectd
sudo touch /usr/share/collectd/types.db

CloudWatchの準備を行う

前ステップ同様にコマンドAmazonCloudWatch-ManageAgentを検索し、インスタンスを選択します。

コマンドのパラメータへ下記を入力し実行します。

Actionconfigure
Modeec2
Optional Configuration Sourcessm
Optional Configuration LocationAmazonCloudWatch-linux
Optional Restartyes

しばらくすると完了します。

ログの確認を行う

ブラウザからアクセスしてみます。

/var/log/httpd/access_logにApatchのログに残っていることを確認します。

続いてCloudWatchでも確認します。
ロググループのaccess_logを選択、EC2のインスタンスIDがあるので、さらに選択します。

CloudWatchでも同様のログを確認することができました!

さいごに

連携も全く難しくなく、任意のログをすぐにコンソールから確認することができました!
エージェント様様ですね・・!
アプリケーションログも同様にファイルを指定すればClowdWatchで確認することができるので、
ぜひ参考になればと思います。

以上、3ステップで出来るCloudWatchでEC2内のログを監視する方法 でした!