KCS Carrot logoKCS キャロットBlog

AWS 勉強会 – 実践編①

書いた人: @Naoya-Kishinami

はじめに

こんにちは、システム開発第一グループの kishinami です。

この記事は、ケーシーエスキャロット Advent Calendar 2024の22日目の記事です。

前回、AWS 勉強会 – 準備編を記載しましたが、準備した内容を踏まえて実施した勉強会の内容を記事にまとめてみました。

目的

AWS の各サービスを連携させて、監視から通知までの一連の自動化をハンズオンで体験することです。

実現したいことは、下図のような内容になります。

実現想定図

構築手順

基本的には、AWS コンソール上での構築手順となります。 (上図の CloudWatch - Alarmlambda の部分を構築します)

また、ターミナルで作業を実施する際は、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

上記を実施後、以下の手順でメトリクスが表示されるかを確認します。

  1. AWS コンソールで CloudWatch の画面を表示し、左側ペインから すべてのメトリクス を選択。
  2. カスタム名前空間 - Carrot - slack-test - notify / test を選択。
  3. グラフ化したメトリクス タブで 期間1分 に変更。

※ 設定直後はすぐに反映されませんが、1分ほど待つと表示されます。

SNS - Topic の作成

  1. AWS コンソールで Amazon SNS の画面を表示。
  2. 左側ペインから トピック を選択し、右上の トピックの作成 をクリック。
  3. 表示された トピックの作成 画面で以下を入力
    • 詳細
      • タイプ:スタンダード
      • 名前:topic-test
  4. 右下の トピックの作成 をクリック。

以上を実施することにより topic-test トピックが作成されます。

CloudWatch - Alarm の作成

  1. AWS コンソールで CloudWatch の画面を表示。
  2. 左側ペインから すべてのアラーム を選択し、右上の アラームの作成 をクリック。
  3. 表示された メトリクスと条件の指定 画面で以下を入力
    • メトリクス
      • グラフ:先ほど設定したメトリクスを指定 ⇒ 指定後、詳細情報が表示されるので 期間1分 に変更。
    • 条件
      • しきい値の種類:静的
      • xxx が次の時…:より大きい
      • … よりも:3
      • その他の設定
        • アラームを実行するデータポイント:1 / 1
        • 欠落データの処理:欠落データを適正
  4. 右下の 次へ をクリックし、表示された アクションの設定 画面で以下を入力
    • 通知
      • アラーム状態トリガー:アラーム状態
      • 次の SNS トピックに通知を送信:既存の SNS トピックを選択 (先ほど作成したトピックを指定)
  5. 右下の 次へ をクリックし、表示された 名前と説明を追加 画面で以下を入力
    • 名前と説明
      • アラーム名:alarm-test
  6. 右下の 次へ をクリックし、表示された内容を確認して問題なければ、右下の アラームの作成 をクリック。

以上を実施することにより alarm-test アラームが作成されます。

Slack Webhook の作成

Slack - App を作成するなどして、特定のチャンネルの Webhook を作成します。

AWS 勉強会の記事なので、スコープ外となるために手順は割愛しますが、以下のサイトが参考になりました。

  • https://zenn.dev/hotaka_noda/articles/4a6f0ccee73a18

lambda の作成

  1. AWS コンソールで Lambda の画面を表示。
  2. 左側ペインから 関数 を選択し、右上の 関数の作成 をクリック。
  3. 表示された 関数の作成 画面で以下を入力
    • 基本的な情報
      • 関数名:lambda-test
      • ランタイム:Python 3.13
      • アーキテクチャ:x86_64
      • デフォルトの実行ロールの変更
        • 実行ロール:基本的な Lambda アクセス権限で新しいロールを作成
  4. 右下の 関数の作成 をクリック。

以上で lambda-test (および実行用ロール)が作成されますが、追加で以下を行います。

トリガーの追加

  1. AWS コンソールで作成した Lambda(lambda-test) の画面を表示。
  2. 上部の 関数の概要 - トリガーを追加 をクリック。
  3. 表示された トリガーを追加 画面で以下を入力
    • トリガーの設定:SNS
    • SNS トピック:先ほど作成した topic-test を選択。
  4. 右下の 追加 をクリック。

以上を実施すると 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 へ通知されました!

Slack通知1

最後に

ちなみに、今回は lambda を使用して Slack へ通知する仕組みを実現しましたが、下図のように Chatbot を使用しても実現可能です。

実現変更図

なるべく手を動かして欲しかったので lambda を選択しましたが、実現だけなら Chatbot の方が楽ですね。

しかも、下図のように監視対象メトリクスのグラフも表示してくれるので見栄えも良いです♪

Slack通知2