EventBridgeを使用してAWS上で発生したイベントをTeamsに通知する方法

本記事では、EventBridgeとLambdaを使用して、AWS上で発生したイベントをTeamsのチャネルに通知する方法について解説いたします。

この方法を使用すれば、監視したいイベントの即時検知を行うことができ、インシデントへの対応速度の向上にも繋がります。

EventBridgeとは

EventBridgeとは、AWSリソースやアプリケーションのイベントを使用して、イベント駆動型のアプリケーションを構築することができるサービスとなります。

今回は、EventBridgeを使用して「IAMロールの作成」イベントをLambdaに連携し、イベントの内容を整形してTeamsに通知する仕組みを作成していこうと思います。

実際にやってみよう

今回は、以下の手順でEventBridgeルールの作成とLambda関数の作成を実施致します。

  1. 受信用Teamsチャネルの準備
  2. Lambda関数の作成
  3. EventBridgeルールの作成

今回構築するシステムの構成図は以下の通りです。

「IAMロール作成」イベントの内容をLambdaに連携し、イベントの内容から通知のメッセージに組み込む値を取得し、Teamsに通知する構成とします。

受信用Teamsチャネルの準備

通知を受信するTeamsのチャネルで設定を行います。事前に専用のTeamsのチャネルを作成してから以下の手順を実施して下さい。

(1)通知を受信するTeamsチャネルの右上のメニューから「コネクタ」を選択します。

(2)「Incoming-Webhook」を検索し「構成」を選択します。

(3)任意の名前を入力し「作成」を選択します。

(4)WebhookURLをコピーし「完了」を選択します。コピーしたWebhookURLは控えておいて下さい。

Lambda関数の作成

今回は、バージニア北部のリージョンにLambda関数を作成します。

(1)「関数の作成」から「関数名」と「ランタイム」を設定して作成を行います。今回はランタイムに「Python 3.10」を設定します。

(2)作成したLambda関数のコードに以下のコードを貼り付けます。

今回は、必要最低限の処理のみを記述したコードを使用します。コード内のwebhookurlには「受信用Teamsチャネルの準備」手順でコピーしたURLを貼り付けてください。

import json
import urllib.request

webhookurl = 'コピーしたURL'

def lambda_handler(event, context):
    EventName = event['detail']['eventName']
    RoleName = event['detail']['requestParameters']['roleName']
    User = event['detail']['userIdentity']['arn']
    data = {
        "@type": "MessageCard",
        "@context": "http://schema.org/extensions",
        "themeColor": "d76100",
        "summary": "IAM Role Create Notification",
        "sections": [{
            "activityTitle": "IAMロール作成通知",
            "activityImage": "https://img.icons8.com/color/50/000000/amazon-web-services.png",
            "facts": [{
                "name": "イベント名",
                "value": EventName
            },{
                "name": "作成者",
                "value": User
            },{
                "name": "ロール名",
                "value": RoleName
            }]
            }]
        }
    headers = {'Content-Type': 'application/json'}
    request = urllib.request.Request(webhookurl,json.dumps(data).encode('utf-8'), headers)
    with urllib.request.urlopen(request) as response:
      response_body = response.read().decode("utf-8")

上記のコードでは、IAMロール作成時に発生するイベント文(JSON形式)から通知のメッセージに使用する値を取得して、メッセージに組み込みを行い、指定したWebhookのURL宛てにメッセージを送信しています。

今回は、イベント名と作成されたIAMロール名、作成者のARNをメッセージに組み込みます。

AWSのイベントの内容は、APIごとに内容が異なりますので、事前にイベントの内容を調べておくことを推奨いたします。

(3)Lambda関数の設定タブから「一般設定」>「編集」を押下します。次に表示された画面で「タイムアウト」時間を設定します。今回は余裕をもって1分間に設定します。

EventBridgeルールの作成

IAMロール作成のイベントを監視し、そのイベントが発生した際のイベント内容をLambdaに連携するルールを作成します。今回は、バージニア北部のリージョンでEventBridgeルールを作成します。

(1)EventBridgeルールから「ルールを作成」を選択し、任意の名前を入力します。また「ルールタイプ」では、イベント駆動型のルールを作成する場合には「イベントパターンを持つルール」、スケジュール駆動型のルールを作成する場合には「スケジュール」にチェックを入れます。

今回は、イベント駆動型のシステムとなるため「イベントパターンを持つルール」にチェックを入れて下さい。

(2)イベントパターンに検知するイベントのフィルター設定を行います。

今回は、「IAM」サービスの「CreateRole」(IAMポリシー作成時に実行されるAPI)を検知するため、以下の通りに設定します。

(3)ターゲットの設定から「Lambda関数」を設定し「Lambda関数の作成」手順で作成したLambda関数を指定します。

(4)設定内容に誤りがないことを確認し「ルールの作成」を選択します。

動作確認

(1)任意の名前でIAMロールの作成を行います。

(2)Teamsのチャネルに通知が送られていることを確認して下さい。

おわりに

今回は、EventBridgeを使用してAWS上で発生したイベントをTeamsに通知する仕組みを紹介致しました。

本記事では、IAMロール作成イベントを検知・通知する仕組みを構築しましたが、他にも、意図しないユーザーからのログインイベントを監視したり、EC2の停止や再起動を監視したりと、様々なアクションを監視することができます。

また、通知の送信先にはSlack等を設定することもできますので、使い慣れたチャットサービスへの通知を行うことも可能です。皆さん是非ともお試し下さい!

執筆担当者プロフィール
内田 順也

内田 順也(日本ビジネスシステムズ株式会社)

プロフェッショナルサービス事業本部に所属。AWSに関連する運用支援業務を担当しております。 最近ではセキュリティ周りのAWSサービスの学習に力を入れてます!

担当記事一覧