1. ハンズオン内容
- ハンズオンでは各リソースを段階的に作成していきます
※Cloud9はVSCodeとPowerShellで代用
※画像はAWS公式ページより引用
前提条件&注意事項
- 一部課金が発生します(数十円程度)。終了後は必ず削除しましょう。このハンズオンはec2が多いので注意です
- 親ページ見てない人は見てね
- CodeCommitが登場する場合はGitHubを代用しますので、AWSから接続できるようご用意ください。
- ブログ内でバケット、ドメインを扱っている場合、同一名称は使わないでください。
- UIの操作はルートアカウントを使っています。
2. (Step1)環境作成
CloudFormation テンプレートの DBInstance は 1つ。
MultiAZ: true にすると、AWS が自動的に別の AZ に スタンバイ(レプリカ)インスタンスを用意します。
図では便宜的に RDS (Master) と RDS (Slave) と書かれていますが、実際に利用者が接続するのは 1つのエンドポイントだけ。
※画像はハンズオンより引用
2.1 (Step1)CFnによる作成
ハンズオンでテンプレートが用意されてます。でも古くて動かないので修正しています。DBがあるせいか15分ほどかかります。
- CloudFormation > スタック > スタックの作成
スタックの作成
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
前提条件 - テンプレートの準備 | テンプレートの準備 | 既存のテンプレートを選択 | |
テンプレートの指定 | テンプレートソース | テンプレートファイルのアップロード | |
テンプレートファイルのアップロード | step1-monitoring-1.yml | ||
スタック名を提供 | スタック名 | step1-monitoring-1 | |
アクセス許可 - オプション | IAM ロール | (なし) | ユーザ権限で作成 |
上記以外 | 全てデフォルト |
wordpressにログインしなくてもハンズオンできると思われます。wordpressの画面が表示されればOK。
CloudWatchエージェントの設定ファイルが導入されます
この設定は、EC2上のWordPressサーバで /var/log/httpd/access_log と /var/log/httpd/error_log をCloudWatch Logsに送信しつつ、CPU・メモリ・ディスク・I/O・ネットワーク・スワップといった各種リソースメトリクスを60秒間隔で収集してCloudWatchに送信するためのCloudWatch Agent構成です。監視するときはamazon-cloudwatch-agent.jsonを作ることが重要
3. (Step2)メトリクスを見る方法
ハンズオンで見ていた画面は以下です。(手順化するのは厳しい)
- CloudWatch > Metrics > 参照 > EC2 > インスタンス別メトリクス
- CloudWatch > Metrics > 参照 > RDS > DBInstanceIdentifier
- CloudWatch > Metrics > 参照 > ApplicationELB > AppELB 別、AZ 別、TG 別メトリクス
- CloudWatch > Metrics > すべて > CWAgent > ImageId,InstanceId,InstanceType,device,fstype,path
メトリクス名が画面右側にあるので見ずらいと思った。
あとはメトリクスの表示期間を変える話をしていた。5分→1分
4. (Step3)EC2インスタンスのルートパスのDISK使用率が80%になったらアラートを出す
disk使用率の監視はCloudWatchエージェントが必要です
4.1 (Step3)SNSトピックの作成
アラートの通知でSNSトピックが必要になるのでまず作ります
- Amazon SNS > トピック > トピックの作成
トピックの作成
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
詳細 | 🔴タイプ | ⬜FIFO (先入れ先出し、先出し) ✅スタンダード |
|
🔴名前 | monitoring-1-topic | ||
表示名 - オプション | |||
暗号化 - オプション | ⬜暗号化 | ||
アクセスポリシー - オプション | メソッドの選択 | ✅ベーシック ⬜アドバンスト |
|
パブリッシャー | ✅トピックの所有者のみ ⬜全員 ⬜指定された AWS アカウントのみ |
||
サブスクライバー | ✅トピックの所有者のみ ⬜全員 ⬜指定された AWS アカウントのみ ⬜特定のエンドポイントを持つリクエスタのみ |
||
データ保護ポリシー - オプション | 項目が多すぎるので省略 | ||
配信ポリシー (HTTP/S) - オプション | 項目が多すぎるので省略 | ||
配信ステータスのログ記録 - オプション | 項目が多すぎるので省略 | ||
タグ - オプション | 項目が多すぎるので省略 | ||
アクティブトレース - オプション | 項目が多すぎるので省略 |
4.2 (Step3)SNSサブスクリプションの作成
- Amazon SNS > トピック > monitoring-1-topic > サブスクリプションの作成
画面名:サブスクリプションの作成
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
詳細 | 🔴トピック ARN | ✅arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:monitoring-1-topic | |
🔴プロトコル | ⬜Amazon Kinesis Data Firehose ⬜Amazon SQS ⬜AWS Lambda ✅E メール ⬜HTTP ⬜HTTPS ⬜JSON 形式のメール ⬜SMS ⬜プラットフォームアプリケーションのエンドポイント |
||
🔴エンドポイント | XXXXX@gmail.com | 任意の自分のメアド | |
サブスクリプションフィルターポリシー - オプション | ⬜サブスクリプションフィルターポリシー | 試験でみたことあるな | |
Redrive ポリシー (デッドレターキュー) - オプション | ⬜Redrive ポリシー (デッドレターキュー) | 試験でみたことあるな |
この後メールがくるので、Confirm subscription
クリックしておくこと。
You have chosen to subscribe to the topic:
arn:aws:sns:ap-northeast-1:XXXXXXXXXXXX:monitoring-1-topic
To confirm this subscription, click or visit the link below (If this was in error no action is necessary):
Confirm subscription # ここ
4.3 (Step3)CloudWatchアラームの作成
- CloudWatch > アラーム > アラームの作成 > メトリクスの選択 > CWAgent >
ImageId,InstanceId,InstanceType,device,fstype,path
> step1-monitoring-1-WebServer01のdisk_used_percent > メトリクスの選択
画面名:メトリクスと条件の指定
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
メトリクス | 名前空間 | CWAgent | |
メトリクス名 | disk_used_percent | ||
path | / | ||
InstanceId | i-05d9aeb56c35f79e8 | 人によって違います | |
ImageId | ami-07faa35bbd2230d90 | 人によって違う可能性あり | |
InstanceType | t3.micro | ||
device | nvme0n1p1 | ||
fstype | xfs | ||
インスタンス名 | step1-monitoring-1-WebServer01 | ||
統計 | ✅平均値 ⬜合計 ⬜最大 ⬜最小 ... |
||
期間 | ⬜10 秒 ⬜20 秒 ⬜30 秒 ⬜1 分 ✅5 分 |
||
条件 | しきい値の種類 | ✅静的 ⬜異常検出 |
|
🔴disk_used_percent が次の時... | ⬜より大きい ✅以上 ⬜以下 ⬜より低い |
||
🔴異常検出のしきい値 | 80 | ||
その他の設定 | アラームを実行するデータポイント | 1/1 | なんだろうこれ |
欠落データの処理 | ✅欠落データを見つかりませんとして処理 ⬜欠落データを適正(しきい値を超えていない)として処理 ⬜欠落データを無視(アラーム状態を維持する)として処理 ⬜欠落データを不正(しきい値を超えている)として処理 |
画面名:アクションの設定
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
通知 | アラーム状態トリガー | ✅アラーム状態 ⬜OK ⬜データ不足 |
|
次の SNS トピックに通知を送信 | ✅既存の SNS トピックを選択 ⬜新しいトピックの作成 ⬜トピック ARN を使用して他のアカウントに通知 |
||
🔴通知の送信先: | ✅monitoring-1-topic | ||
Lambda アクション | 項目が多すぎるので省略。閾値を超えたらラムダでアクションができるという意味です | ||
Auto Scaling アクション | 項目が多すぎるので省略。閾値を超えたらAuto Scalingでアクションができるという意味です | ||
EC2 アクション | 項目が多すぎるので省略。閾値を超えたらEC2でアクションができるという意味です | ||
Systems Manager アクション | 項目が多すぎるので省略。閾値を超えたらSystems Managerでアクションができるという意味です | ||
調査アクション - 新規 | 項目が多すぎるので省略。これは何ができるのかわかりません |
画面名:アラームの詳細の追加
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
名前と説明 | 🔴アラーム名 | monitoring-1-alarm | |
タグ - オプション |
- 画面を大きくしてないと見ずらい。右スクロールしないと見えないこともある
- なんでCWAgentなのかはわからない
-
ImageId,InstanceId,InstanceType,device,fstype,path
はfstypeがあるからだと思う
4.4 (Step3)動作確認
インスタンスコネクトで接続できたので、容量を上げてみる。4GBのファイルを作る
DISK使用率を80%超えればメールがくる。
# WebServer01
# /配下に4GBのファイルを作る。不足したらcountを増やせばOK
sudo dd if=/dev/zero of=/testfile bs=1M count=4096 oflag=direct
# こうなればメールが来るはずである
[ec2-user@ip-10-0-0-5 /]$ df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 453M 0 453M 0% /dev/shm
tmpfs 181M 444K 181M 1% /run
/dev/nvme0n1p1 8.0G 6.9G 1.1G 87% / # ここ.80%over
tmpfs 453M 124M 330M 28% /tmp
/dev/nvme0n1p128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 91M 0 91M 0% /run/user/1000
成功するとALARM: "monitoring-1-alerm" in Asia Pacific (Tokyo)
といったタイトルのメールが来ます
5.(Step4)CloudWatchInsight(ログ分析)
- CloudWatch > ログのインサイト
ロググループを選択(選択基準):wordpress_access_log
デフォルトのクエリ(@messageに時間とかを追加して出している)
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 10000
@timestamp, @message, @logStream, @log
はCloudWatchで定義されている。エージェントがログを CloudWatch Logs に送信するときに、イベントの発生時刻 → @timestampといった形にしている。
https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html で書いてあるらしい
次のクエリ、行毎にパースするクエリ
parse '* - * [*] "* * *" * * * *' as host, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes, referrer, userAgent
| filter statusCode like /(4\d\d)/
@messageは省略されているが、@messageをスペース区切りでparseをしている。そしてそれらをhost, identity, dateTimeString, httpVerb, url, protocol, statusCode, bytes, referrer, userAgent
として名前を付けている。ステータスコードを400番台に出力を限定している。これは利用者(クライアント)のエラーログだけを確認したいという意図だと思う。本来なら500番台も監視すべき。
@messageをみたいときはデフォルトクエリの実行や、ロググループに見に行けばよい
6. (Step5)CloudWatchダッシュボード作成
ダッシュボードの作成方法はハンズオン動画の通りなので、省略します。(手順化するのは厳しい)
コードでも作れると思います
- ダッシュボードは自分で作ることもできる
- CloudWatch > Dashboards > カスタムダッシュボード > ダッシュボードの作成
- ダッシュボードはAWSで自動で作ってくれる機能もある。EC2とかを選べば監視項目毎のグラフが表示される
- CloudWatch > Dashboards > 自動ダッシュボード
7. (Step6)EventBridge作成
7.1. (Step6)EventBridge作成
CloudWatchルールの後継機能
- Amazon EventBridge > ルール > ルールを作成
画面名:ルールの詳細を定義
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
ルールの詳細 | 🔴名前 | monitoring-1-event-rule | |
説明 - オプション | |||
イベントバス | ✅default | ||
⬜選択したイベントバスでルールを有効にする | |||
ルールタイプ | ✅イベントパターンを持つルール ⬜スケジュール |
画面名:イベントパターンを構築
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
イベント | イベントソース | ✅AWS イベントまたは EventBridge パートナーイベント ⬜その他 ⬜すべてのイベント |
|
サンプルイベント - オプション | 省略。用途がわからない。イベントパターンのサンプルを作ってくれる? | ||
イベントパターン | 🔴作成のメソッド | ⬜スキーマを使用する ✅パターンフォームを使用する ⬜カスタムパターン (JSON エディタ) |
|
イベントソース | ✅AWS のサービス ⬜EventBrideでパートナー |
||
🔴AWS のサービス | ✅EC2 ... |
||
🔴イベントタイプ | EC2 Instance State-change Notification | ||
🔴イベントタイプの仕様 1 | ⬜任意の状態 ✅特定の状態 |
stopping | |
イベントタイプの仕様 2 | ✅任意のインスタンス ⬜個別のインスタンス ID |
どのインスタンスが止まっても動作する、という意味だと思う |
画面名:ターゲットを選択
大項目 | 中項目 | 選択肢 | 備考 |
---|---|---|---|
ターゲット 1 | ターゲットタイプ | ⬜EventBridge イベントバス ⬜EventBridge API の宛先 ✅AWS のサービス |
|
🔴ターゲットを選択 | ✅SNSトピック ... |
||
ターゲットの場所 | ✅このアカウントのターゲット ⬜別の AWS アカウントのターゲット |
||
🔴トピック | ✅monitoring-1-topic ... |
||
✅実行ロールを使用 (推奨) | |||
🔴実行ロール | ✅この特定のリソースについて新しいロールを作成 ⬜既存のロールを使用 |
||
追加設定 | ターゲット入力を設定 | 省略 | |
イベントの最大有効期間 - オプション | 省略 | ||
再試行回数 - オプション | 省略 | ||
デッドレターキュー | 省略 | ||
タグ |
7.2. (Step6)動作確認
インスタンスを停止(stop)し、メール通知があればOK
削除
- monitoring-1スタック削除
- ダッシュボード削除
- CloudWatchアラーム削除
- ロググループ(wordpress)削除
- Amazon EventBridgeルール削除
- SNSトピック削除
さいごに
感想です
- 自動化するとしたらアラーム作成し、メール通知まで確認すればOK
- 自動化するとしたらeventBridgeルールを作成し、メール通知まで確認すればOK
- CloudWatchルールはもうない。eventBridgeルールが後継