この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
概要
ClouswatchでEC2を監視するハンズオンをやっていきます。
要件は2点です。
①サーバのメトリクス閾値が下記を超えた場合、メールで通知を受け取れるようにする。
- CPU使用率 >=80%
- メモリー使用率 >=80%
- Disk使用率 >=80%
②この時、利用者が勝手にSNStopicのサブスクリプションを解除できないようにする。
※メモリ使用率とDisk使用率については、通常のCloudWatchでは取得できないため、EC2インスタンスにCloudWatchエージェントをインストールし、カスタムメトリクスとして取得します。
構成図
前提
VPC,EC2は以下設定で作成済とします。
VPC | |
---|---|
名前タグ | VPC-nakaniwa |
IPv4CIDR | 10.0.0.0/16 |
サブネット | |
サブネット名 | Public subnet-nakaniwa |
アベイラビリティゾーン | ap-northeast-1a |
IPv4CIDR | 10.0.1.0/24 |
インターネットゲートウェイ | |
名前タグ | igw-nakaniwa |
VPC | VPC-nakaniwa |
ルートテーブル/ Public subnet-nakaniwa | |
送信先 | ターゲット |
10.0.0.0/16 | Local |
0.0.0.0 | Internet Gateway |
セキュリティグループ | |
セキュリティグループ名 | sg-nakaniwa |
インバウンドルール | |
タイプ:SSH | ソース:0.0.0.0 |
タイプ:HTTP | ソース:0.0.0.0 |
タイプ:HTTPS | ソース:0.0.0.0 |
EC2インスタンス | |
---|---|
名前タグ | ec2-nakaniwa |
AMI | Amazon Linux 2 |
インスタンスタイプ | t2.micro |
キーペア | nakaniwa |
ネットワーク | VPC-nakaniwa |
サブネット | Public subnet-nakaniwa |
パブリックIPの自動割り当て | 有効化 |
セキュリティグループ | sg-nakaniwa |
作業ステップ
EC2にSSMエージェントをインストール
SSMエージェントはEC2 インスタンス、オンプレミスサーバー、仮想マシン (VM) にインストールして設定することができる Amazon のソフトウェアです。
SSMエージェントにより、Systems Manager がこれらのリソースを更新、管理、設定できるようなります。
[ec2-user@ip-10-0-1-176 ~]$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
IAM ロールの作成。
EC2にSystems ManagerとCloudWatchAgentエージェントを使用するために必要な3つのポリシーを付与していきます。
①AmazonSSMManagedInstanceCore
②CloudWatchAgentServerPolicy
③CloudWatchAgentAdminPolicy
ロールを作成をクリック。
信頼されたエンティティタイプとユースケースを選択
必要な3つのポリシーを検索して選択したら次へをクリック
①Systems Manager でCloudWatchAgentをインストールするのに必要なポリシー
②CloudWatchAgentエージェントを実行するのに必要なポリシー
③エージェント設定ファイルをParameter Storeに保存するために必要なポリシー
ロール名を入力し、ロールを作成をクリック
ロール名はわかりやすく「CloudwatchAgentRole」としました。
ロールを作成したらEC2にアタッチ。
アクション>セキュリティ>IAMロールを変更と選択していきます。
作成したIAMロールを選択し、IAMロールの更新をクリックしたらアタッチ完了
Systems Manager を使用して CloudWatch エージェントをインストール
Systems Managerにアクセスし、[Run Command] を選択
コマンドドキュメントで[AWS-ConfigureAWSPackage] を選択
コマンドのパラメータを入力
パラメータは以下を指定して実行します。
- Action:install
- Installation Type:Uninstall and reinstall
- Name:AmazonCloudWatchAgent
- Version:latest
[ターゲット] で、CloudWatch エージェントをインストールする先のインスタンスを選択し、実行をクリック。
ステータスが「成功」となっていたらインストール完了
CloudWatch エージェント設定ファイルを作成する
EC2にSSHで接続して以下のコマンドを実行。
CloudWatch エージェント設定ウィザードが開始するので質問に回答していきます。
[ec2-user@ip-10-0-1-176 ~]$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
どのOSでエージェントを使用するか聞かれています。今回Amazon linuxを使用しているのでデフォルトのままエンターを押します。
On which OS are you planning to use the agent?
1. linux
2. windows
3. darwin
default choice: [1]:
EC2かオンプレミス使用かを聞かれています。EC2を使用しているので、デフォルトのままエンターを押します。
Are you using EC2 or On-Premises hosts?
1. EC2
2. On-Premises
default choice: [1]:
どのユーザーでエージェントを使用するか聞かれています。rootで使用で大丈夫ですので、デフォルトのままエンターを押します。
Which user are you planning to run the agent?
1. root
2. cwagent
3. others
default choice: [1]:
StatsDデーモンを有効にするか聞かれています。有効でOKなのでデフォルトのままエンターを押します。
Do you want to turn on StatsD daemon?
1. yes
2. no
default choice: [1]:
CloudWatch エージェントで StatsD プロトコルを使用することで、アプリケーションやサービスから追加のカスタムメトリクスを取得できます。StatsDは、さまざまなアプリケーションからメトリクスを収集できる一般的なオープンソースソリューションです。StatsD は、独自のメトリクスを計測する場合に特に便利です。
StatsD がどのポートを利用するかき聞かれています。デフォルトの8125でよいのでそのままエンターを押します。
Which port do you want StatsD daemon to listen to?
default choice: [8125]
StatsDデーモンの収集間隔をを何にするか聞かれています。デフォルトの10秒でいいのでそのままエンター押します。
What is the collect interval for StatsD daemon?
1. 10s
2. 30s
3. 60s
default choice: [1]:
StatsDデーモンが収集するメトリクスの集計間隔を何にするか聞かれています。デフォルトの60秒でよいのでそのままエンターを押します。
What is the aggregation interval for metrics collected by StatsD daemon?
1. Do not aggregate
2. 10s
3. 30s
4. 60s
default choice: [4]:
CollectDからメトリクスを監視するか聞かれています。利用するのでデフォルトのままエンターを押します。
ここで注意が必要で、CollectDがインストールされていないと、Agentの起動に失敗します。
Do you want to monitor metrics from CollectD? WARNING: CollectD must be installed or the Agent will fail to start
1. yes
2. no
default choice: [1]:
CloudWatch エージェントで collectd プロトコルを使用することで、アプリケーションやサービスから追加のメトリクスを取得できます。collectd プロトコルは Linux サーバーでのみサポートされています。collectd は、さまざまなアプリケーションのシステム統計を収集できるプラグインを備えた、一般的なオープンソースソリューションです。CloudWatch エージェントが既に収集できるシステムメトリクスと collectd からの追加のメトリクスを組み合わせることで、システムやアプリケーションのモニタリング、分析、トラブルシューティングを強化できます。CloudWatch エージェントによってインポートされた collectd メトリクスの表示
collectd メトリクスを CloudWatch にインポートした後、これらのメトリクスを時系列グラフとして表示し、これらのメトリクスをモニタリングし、指定したしきい値に違反した場合に通知できるアラームを作成できます。
CPU,メモリ等を監視するか聞かれています。監視するのでデフォルトのままエンターを押します。
Do you want to monitor any host metrics? e.g. CPU, memory, etc.
1. yes
2. no
default choice: [1]:
コアごとにCPUメトリクスを監視するか聞かれています。これも監視でよいのでデフォルトのままエンターを押します。
Do you want to monitor cpu metrics per core?
1. yes
2. no
default choice: [1]:
ec2のディメンション(ImageId, InstanceId, InstanceType, AutoScalingGroupName)が利用可能であれば、すべてのメトリクスに追加するか聞かれています。これも追加でよいのでデフォルトのままエンターを押します。
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]:
高解像度でメトリクスを収集するか聞かれています。デフォルトの60秒でよいのでそのままエンターを押します。
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]:
どのデフォルトメトリクス設定を希望するか聞かれています。
Basic, Standard, Advancedで取得できるメトリクスが変わります。
詳細レベル | 含められるメトリクス |
---|---|
Basic | Mem: mem_used_percent |
Disk: disk_used_percent | |
Standard | CPU: cpu_usage_idle、cpu_usage_iowait、cpu_usage_user、cpu_usage_system |
Disk: disk_used_percent、disk_inodes_free | |
Diskio: diskio_io_time | |
Mem: mem_used_percent | |
Swap: swap_used_percent | |
Advanced | CPU: cpu_usage_idle、cpu_usage_iowait、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 | |
Netstat: netstat_tcp_established、netstat_tcp_time_wait | |
Swap: swap_used_percent |
今回はメモリ使用率とDisk使用率がわかればよいので1のBasicを選びます。
Which default metrics config do you want?
1. Basic
2. Standard
3. Advanced
4. None
default choice: [1]:
上記の選択をし終わると、設定内容が出力されます。
Current config as follows:
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"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": 10,
"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]:
既存のCloudWatch Log Agentの設定の設定ファイルはあるか聞かれています。ないのでデフォルトのままエンターを押します。
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]:
ログファイルを監視するか聞かれています。今回ログは監視しないのでnoの2を選択します。
Do you want to monitor any log files?
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"
},
"metrics": {
"aggregation_dimensions": [
[
"InstanceId"
]
],
"append_dimensions": {
"AutoScalingGroupName": "${aws:AutoScalingGroupName}",
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}"
},
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"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": 10,
"service_address": ":8125"
}
}
}
}
上記のconfigファイルは/opt/aws/amazon-cloudwatch-agent/bin/config.json に配置されています。
必要であれば手動で編集してください。
SSMパラメータストアにconfigを保存しますかと聞かれています。保存するのでデフォルトのままエンターを押します。
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]:
パラメータストア名を何にするか聞かれています。デフォルトのAmazonCloudWatch-linuxで良いので良いのでそのままエンターを押します。
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]
パラメータストアをどのリージョンに保存するか聞かれています。ap-northeast-1に保存したいのでデフォルトのままエンターを押します。
Which region do you want to store the config in the parameter store?
default choice: [ap-northeast-1]
パラメータストアにjson configを送信するために、どのAWSクレデンシャルを使用する必要があるか聞かれています。今回CloudWatchAgentAdminPolicyで書き込み権限を付与しているのでデフォルトのままエンターを押します。。
パラメータストアへの書き込み権限のあるロールがないとここでエラーとなります。
Which AWS credential should be used to send json config to parameter store?
1. ASIA2N5I5XLCP6PXDUJO(From SDK)
2. Other
default choice: [1]:
以上で設定が完了です。
Successfully put config to parameter store AmazonCloudWatch-linux.
Program exits now.
collectdをインストール
エージェントの設定ファイルでCollectdを有効にしたので、Collectdをインストールする必要があります。Amazon Linux 2 にはデフォルトで collectd がインストールされていないためです。
[ec2-user@ip-10-0-1-176 ~]$ sudo amazon-linux-extras install collectd
Systems ManagerからCloudWatchエージェントを起動
Systems Managerにアクセスし、[Run Command] を選択。
コマンドドキュメント で「AmazonCloudWatch-ManageAgent」を選択。
コマンドのパラメータを入力
*[Optional Configuration Location]にはエージェント設定ファイルで設定したパラメータストア名を入力します。
[ターゲット]でインスタンスを手動で選択するにチェックし実行をクリック
ステータスが[成功]となっていたら完了。
CloudWatchでメモリ使用率とディスク使用率が取得できているか確認する
全てのメトリクスを選択
カスタム名前空間の[CWAgent]をクリック
[InstanceId]をクリック
メモリ使用率の[mem_used_percent]とディスク使用率の[disk_used_percent]が取得できていることを確認
SNSトピックを作成
CloudWatchアラームの通知をメールで受け取るためにSNSトピックを作成します。
トピックの作成をクリック
[タイプ]はスタンダード、[名前]と[表示名]にCloudWatch_Alarms_nakaniwa(任意の名前)と入力し次へをクリック
次にサブスクリプションを作成します。
作成したトピックを選択し、サブスクリプションの作成をクリック
プロトコルにEメール、エンドポイントにメールアドレスを入力し、サブスクリプションの作成をクリック
入力したアドレス宛に確認メールが送られてくる。
今回はサブスクリプションを勝手に解除されないようにしたいので、届いたメールからの確認登録はせず、[Confirm subscription]を右クリックしリンクをコピーする。
サブスクリプションの確認をクリック
先ほどコピーしたリンクを貼り付け、サブスクリプションの確認をクリック
サブスクリプションが正常に確認されましたと表示されたらOK
テストメールを送信し確認してみる
トピックからメッセージの発行をクリック。
件名と本文を入力し、メッセージの発行をする
メールが届いたら、unsubscribeのリンクをクリックする
解除されないことを確認
アラームを作成する
CloudWatchにアクセスし、すべてのアラームを選択、アラームの作成をクリック
メトリクスの選択
AWS名前空間からEC2を選択
インスタンス別メトリクスを選択
[CPUUtilization]を検索し、自分が作成したインスタンスの左の□にチェックを入れメトリクスの選択をクリック
アラームを出す閾値を設定して次へをクリック
トリガーをアラーム状態にし、既存のSNSトピックを選択し通知の送信先をCloudWatch_Alarms_nakaniwaに指定し次へをクリック
名前と説明を記入し次へをクリック
設定内容に問題なければアラームを作成をクリックし完了
同様の手順でメモリ使用率とDisk使用率のアラームを作成。
検証
CPUに負荷をかけてアラームを出すようにして通知が来る検証をします。
以下のコマンドでCPUに負荷をかける
[ec2-user@ip-10-0-1-176 ~]$ yes > /dev/null &
[1] 3236
[ec2-user@ip-10-0-1-176 ~]$ yes > /dev/null &
[2] 3238
[ec2-user@ip-10-0-1-176 ~]$ yes > /dev/null &
[3] 3239
CPU使用率が80%を超えてアラーム状態になったことを確認
アラーム通知がメールで届いたことを確認し検証完了
さいごに
今回ハンズオンをしていて最初IAMロールの権限が足りてなかったり、CollectdをインストールしていないためにRun Commandが失敗したりして、原因がわかるまでハマってしまって大変でしたがとても勉強になりました。