目的
プライベートサブネットに存在するEC2インスタンスから、Cloudwatch Agent(以下、CW Agentとします。)経由でカスタムメトリックを取得する方法を解説します。
何が取れるのか?
こちらを参照するとわかる通り、Cloudwatchで取得できるメトリックは3種類(Basic、Standard、Advanced)存在します。もっとも、多くのメトリックが取得できるのはAdvancedです。Advancedで取得可能なメトリックの種類について、以下に載せます。
CPU: cpu_usage_guest、cpu_usage_idle、cpu_usage_iowait、 cpu_usage_steal、cpu_usage_user、cpu_usage_system
Disk: disk_used_percent、disk_inodes_free
Diskio: diskio_io_time、diskio_write_bytes、diskio_read_bytes、diskio_writes、diskio_reads
Mem: mem_used_percent
Net: net_bytes_sent、net_bytes_recv、net_packets_sent、net_packets_recv
Netstat: netstat_tcp_established、netstat_tcp_time_wait
Swap: swap_used_percent
手順
以下の手順でCW Agentを設定します。
- IAMロールの作成(for EC2 Instance)
- SSM Agentインストール
- VPCエンドポイントの作成(for Private Subnet)
- CW Agentのインストール(via SSM)
- CW Agentの設定ファイル作成(using インストールウィザード)
- CW Agebntの実行(via SSM)
- CloudWatchからカスタムメトリックを取得
1. IAMロールの作成(for EC2 Instance)
- Cloudwatch Agentをインストールする前にIAMロールをEC2インスタンスに設定する必要あり。
- CW Agentが使用できるように、CloudWatchAgentServerPolicyか、loudWatchAgentAdminPolicy。
- CloudWatchAgentAdminPolicyは、パラメータストアの書き込み許可を有しているもので通常は使用しない
- 一般的な監視をする限りはCloudWatchAgentServerPolicyを利用するだけで十分。
- SSMで触れるように、AmazonSSMManagedInstanceCore
- IAMロールの設定方法は以下を参照する。
- https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html
2. SSM Agentインストール
SSM Agentをインストールする事で、SSM経由で設定CWAgentをインストール&設定する事ができる(SSM使った方が運用効率がいい)。
sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
sudo status amazon-ssm-agent
3. VPCエンドポイントの作成(for Private Subnet)
- こちらを参照して、プライベートサブネット内のEC2インスタンス(CW Agent)からアクセスできるようにVPCエンドポイントを作成
- EC2インスタンスと同一のセキュリティグループ&サブネットに所属させるように設定させる
4. CW Agentのインストール(via SSM)
SSMのRun Command を使用して CloudWatch をダウンロードするには、こちらを参照して、設定します。
1. Open the Systems Manager console at https://console.aws.amazon.com/systems-manager/.
2. [Run command] を選択します。
3. [Command document] リストで、[AWS-ConfigureAWSPackage] を選択します。
4. [ターゲット] 領域で、CloudWatch エージェントをインストールするインスタンスを選択します。特定のインスタンスが表示されない場合、Run Command 用に設定されていない可能性があります。詳細については、AWS Systems Manager ユーザーガイドの「ハイブリッド環境での AWS Systems Manager セットアップ」を参照してください。
5. [アクション] リストで、[インストール] を選択します。
6. [名前] ボックスに、「AmazonCloudWatchAgent」と入力します。
7. エージェントの最新バージョンをインストールには、[Version (バージョン)] を [latest (最新)] に設定したままにします。
8. [Run] を選択します。
9. 必要に応じて、[ターゲットと出力] 領域で、インスタンス名の横のボタンを選択して [View output (出力の表示)] を選択します。Systems Manager に、エージェントが正常にインストールされたことが表示されます。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
5. CW Agentの設定ファイル作成(using インストールウィザード)
- インストールウィザード経由でCW Agentの設定ファイル(json)を作成
- Jsonファイルはパラメータストアとして配置する事で、のちにSSMから設定ファイルとして選択する事が可能。
- この設定ファイル内でBasic,Standard,Advancedを選択する(ログの粒度を決める)
- パラメータストアに書き込むためには、EC2インスタンスにAWS認証情報を設定する必要あり
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]:
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]:
1
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
1
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
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]:
4
Do you want to monitor metrics from CollectD?
1. yes
2. no
default choice: [1]:
2
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
1
Do you want to monitor cpu metrics per core? Additional CloudWatch charges may apply.
1. yes
2. no
default choice: [1]:
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]:
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]:
4
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
1
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
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 60,
"service_address": ":8125"
}
}
}
}
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
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]:
1
Log file path:
/var/log/messages
Log group name:
default choice: [messages]
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]:
2
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"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/messages",
"log_group_name": "messages",
"log_stream_name": "{instance_id}"
}
]
}
}
},
"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
},
"statsd": {
"metrics_aggregation_interval": 60,
"metrics_collection_interval": 60,
"service_address": ":8125"
}
}
}
}
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]:
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]
TestAgent2
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-2]
Which AWS credential should be used to send json config to parameter store?
1. *****************(From SDK)
2. Other
default choice: [1]:
1
Successfully put config to parameter store TestAgent2.
Program exits now.
6. CW Agebntの実行(via SSM)
SSMのRun Command を使用して CloudWatch を開始するには、こちらを参照して、設定します。
1. Open the Systems Manager console at https://console.aws.amazon.com/systems-manager/.
2. [Run command] を選択します。
3. [Command document] リストで、[AmazonCloudWatch-ManageAgent] を選択します。
4. [ターゲット] 領域で、CloudWatch エージェントをインストールしたインスタンスを選択します。
5. [Action] リストで、[configure] を選択します。
6. [Optional Configuration Source] リストで、[ssm] を選択します。「CloudWatch エージェント設定ファイルを作成する」で説明されているとおり、[Optional Configuration Location (オプションの設定場所)] ボックスに、作成して Systems Manager Parameter Store に保存したエージェント設定ファイルの名前を入力します。
7. これらのステップを完了した後、[Optional Restart] リストで、[yes] を選択してエージェントを開始します。
8. [Run] を選択します。
9. 必要に応じて、[ターゲットと出力] 領域で、インスタンス名の横のボタンを選択して [View output (出力の表示)] を選択します。Systems Manager に、エージェントが正常に開始されたことが表示されます。
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
{
"status": "running",
"starttime": "2020-05-03T06:35:02+0000",
"version": "1.237768.0"
}
7. CloudWatchからカスタムメトリックを取得
Cloudwatch AgentからCloudWatchへのメトリック送信にはEC2インスタンスにIAMロール付与をお願いする必要がある。
8. CloudWatchからカスタムメトリックを取得
取得成功すると、設定ファイルのカスタムメトリクス上に表示されたら、無事取得できた事が確認できます。

以上