AWS 勉強会 – 実践編①
はじめに
こんにちは、システム開発第一グループの kishinami です。
この記事は、ケーシーエスキャロット Advent Calendar 2024の22日目の記事です。
前回、AWS 勉強会 – 準備編を記載しましたが、準備した内容を踏まえて実施した勉強会の内容を記事にまとめてみました。
目的
AWS の各サービスを連携させて、監視から通知までの一連の自動化をハンズオンで体験することです。
実現したいことは、下図のような内容になります。
構築手順
基本的には、AWS コンソール上での構築手順となります。
(上図の CloudWatch - Alarm
~ lambda
の部分を構築します)
また、ターミナルで作業を実施する際は、Windows - WSL2 (Ubuntu 22.04)
環境で VSCode
を使用しています。
メトリクスの設定
まずは、VSCode
のターミナル上で、準備編で用意した Admin
ロールに切り替えてメトリクスを設定します。
$ export AWS_PROFILE=AdminRole
$ aws cloudwatch put-metric-data --dimensions slack-test=notify --namespace Carrot --metric-name test --unit Count --value 1
上記を実施後、以下の手順でメトリクスが表示されるかを確認します。
- AWS コンソールで
CloudWatch
の画面を表示し、左側ペインからすべてのメトリクス
を選択。 -
カスタム名前空間
-Carrot
-slack-test
-notify
/test
を選択。 -
グラフ化したメトリクス
タブで期間
を1分
に変更。
※ 設定直後はすぐに反映されませんが、1分ほど待つと表示されます。
SNS - Topic の作成
- AWS コンソールで
Amazon SNS
の画面を表示。 - 左側ペインから
トピック
を選択し、右上のトピックの作成
をクリック。 - 表示された
トピックの作成
画面で以下を入力- 詳細
- タイプ:
スタンダード
- 名前:
topic-test
- タイプ:
- 詳細
- 右下の
トピックの作成
をクリック。
以上を実施することにより topic-test
トピックが作成されます。
CloudWatch - Alarm の作成
- AWS コンソールで
CloudWatch
の画面を表示。 - 左側ペインから
すべてのアラーム
を選択し、右上のアラームの作成
をクリック。 - 表示された
メトリクスと条件の指定
画面で以下を入力- メトリクス
- グラフ:先ほど設定したメトリクスを指定 ⇒ 指定後、詳細情報が表示されるので
期間
を1分
に変更。
- グラフ:先ほど設定したメトリクスを指定 ⇒ 指定後、詳細情報が表示されるので
- 条件
- しきい値の種類:
静的
- xxx が次の時…:
より大きい
- … よりも:
3
- その他の設定
- アラームを実行するデータポイント:
1
/1
- 欠落データの処理:
欠落データを適正
- アラームを実行するデータポイント:
- しきい値の種類:
- メトリクス
- 右下の
次へ
をクリックし、表示されたアクションの設定
画面で以下を入力- 通知
- アラーム状態トリガー:
アラーム状態
- 次の SNS トピックに通知を送信:既存の SNS トピックを選択 (先ほど作成したトピックを指定)
- アラーム状態トリガー:
- 通知
- 右下の
次へ
をクリックし、表示された名前と説明を追加
画面で以下を入力- 名前と説明
- アラーム名:
alarm-test
- アラーム名:
- 名前と説明
- 右下の
次へ
をクリックし、表示された内容を確認して問題なければ、右下のアラームの作成
をクリック。
以上を実施することにより alarm-test
アラームが作成されます。
Slack Webhook の作成
Slack - App を作成するなどして、特定のチャンネルの Webhook
を作成します。
AWS 勉強会の記事なので、スコープ外となるために手順は割愛しますが、以下のサイトが参考になりました。
- https://zenn.dev/hotaka_noda/articles/4a6f0ccee73a18
lambda の作成
- AWS コンソールで
Lambda
の画面を表示。 - 左側ペインから
関数
を選択し、右上の関数の作成
をクリック。 - 表示された
関数の作成
画面で以下を入力- 基本的な情報
- 関数名:
lambda-test
- ランタイム:
Python 3.13
- アーキテクチャ:
x86_64
- デフォルトの実行ロールの変更
- 実行ロール:
基本的な Lambda アクセス権限で新しいロールを作成
- 実行ロール:
- 関数名:
- 基本的な情報
- 右下の
関数の作成
をクリック。
以上で lambda-test
(および実行用ロール)が作成されますが、追加で以下を行います。
トリガーの追加
- AWS コンソールで作成した
Lambda(lambda-test)
の画面を表示。 - 上部の
関数の概要
-トリガーを追加
をクリック。 - 表示された
トリガーを追加
画面で以下を入力- トリガーの設定:
SNS
- SNS トピック:先ほど作成した
topic-test
を選択。
- トリガーの設定:
- 右下の
追加
をクリック。
以上を実施すると SNS
が 関数の概要
に表示されます。
コードの修正
作成した Lambda のコードを修正して、トピック越しに通知を受け取ったら Slack へ通知するようにします。
(コンソール上のコードを直接編集して Deploy
を押下)
import json
import urllib.request
WEBHOOK = "https://hooks.slack.com/services/<作成した Slack Webhook パス>"
def post_slack(message: dict):
send_data = {
"username": "bot",
"icon_emoji": ":exclamation:",
"text": "<!here> " + message["NewStateReason"],
}
send_text = "payload=" + json.dumps(send_data)
# リクエストオブジェクト生成
request = urllib.request.Request(
WEBHOOK,
data=send_text.encode('utf-8'),
method="POST"
)
# リクエスト送信
with urllib.request.urlopen(request) as response:
response_body = response.read().decode('utf-8')
def lambda_handler(event, context):
print(json.dumps(event))
message = event["Records"][0]["Sns"]["Message"]
print(message)
post_slack(json.loads(message))
以上で必要なサービスの構築が完了しました。
動作検証
動作検証前のアラームは OK状態
だと思います。
(アラーム作成時、欠落データを適正
を指定しているため、メトリクスが無い場合は OK状態
となる)
アラーム状態
への遷移条件は、直近1データポイントで1つでもしきい値(3
)を超えたらとなるので、メトリクス値として 5
を設定してみましょう。
$ aws cloudwatch put-metric-data --dimensions slack-test=notify --namespace Carrot --metric-name test --unit Count --value 5
すると、1分程度で アラーム状態
へ遷移して、Slack へ通知されました!
最後に
ちなみに、今回は lambda を使用して Slack へ通知する仕組みを実現しましたが、下図のように Chatbot を使用しても実現可能です。
なるべく手を動かして欲しかったので lambda を選択しましたが、実現だけなら Chatbot の方が楽ですね。
しかも、下図のように監視対象メトリクスのグラフも表示してくれるので見栄えも良いです♪