AWS Chatbot を使ってサインインイベントを Slack に通知する

はじめに

AWS の新規開発案件に携わることがあったので、AWS を利用する上での初期設定の1つとなるマネジメントコンソールへのサインイン(ログイン)を Slack に通知する方法をまとめる。 実現方法はいくつかあるが、ここでは AWS Chatbot を使った方法を採用する。

AWS Chatbot とは

AWS Chatbot(Chatbot)は、AWS で「ChatOps」を実現するためのマネージドサービスであり、Slack と Amazon Chime への連携を簡単に行える。 今回扱うような簡単な通知であれば、コードを一切書かずにマネジメントコンソールの操作だけで実現できる。

Chatbot の利用に追加費用は不要(つまり、無料)であり、東京&大阪リージョンでも利用できる。

ChatOps とは

ChatOps は、「Chat(チャット)」+「Ops(Operations: 運用)」を合わせた用語であり、文字通りにシステム運用にチャットを活用する手法のことを指す。

多くの組織で Slack や Mattermost などのチャットツールがコミュニケーションツールとして採用されているが、システムで発生したイベントをチャットに通知することで、状態の変化や障害にすぐに気づくことができ、その後のアクションを迅速に行える。

ここで扱うマネジメントコンソールへのサインインイベントの Slack 通知が実現できると、誰がいつサインインをしたか?を把握でき、Slack にその記録も残せる。 想定しないタイミングでサインイン通知があった場合には、その異常にもすぐに気づいて対処ができる。

今回実現するアーキテクチャ

下図に示すように、マネジメントコンソールへのサインインを契機に Slack にイベントを通知するアーキテクチャを実現する。

マネジメントコンソールへのサインインイベントの Slack 通知
マネジメントコンソールへのサインインイベントの Slack 通知

実現手順

Chatbot の管理者ガイドを参考に実施する。

なお、今回は通知機能の実現に必要な最低限の設定のみを行うこととする。 商用で採用する場合には要件にしたがい、蓄積データの暗号化やログの取得などを適切に行うこと。

Chatbot のセットアップ

Chatbot を利用するための前提条件が下記となる。 利用者の環境によっては既に設定されているものもあると思うが、不足があれば「Setting up AWS Chatbot」にしたがって設定を行う。

  • Chatbot に対する適切な権限を持つ IAM ユーザを作成すること
    • 今回は管理者権限(AdministratorAccess)を持つ IAM ユーザで作業を実施するが、商用の場合は AWS のベストプラクティスにしたがって最小権限を付与したユーザで作業することが望ましい。
  • Chatbot からの通知を受け取る SNS トピックを作成すること
    • 今回は「signin-notification」という SNS トピックを作成する。(作成手順を下記に示す)
  • Slack のワークスペースの管理者権限を持っていること
  • Slack のワークスペースSNS トピックからの通知を受け取るチャネルを作っておくこと
    • 今回は「notification」チャネルに通知する。

なお、サインインのイベントは「米国東部(バージニア北部)us-east-1」リージョンで発生するので、ここで作業を行う。

SNS トピックの作成

下記に SNS トピックの作成手順を示す。

ここでの作業範囲を下図に示す。

作業範囲(SNS トピック)
作業範囲(SNS トピック)

マネジメントコンソールで SNS のコンソールに移動する。 画面右上の「トピック作成」に「トピック名」を入力して、「次のステップ」を選択する。

SNS のコンソール画面
SNS のコンソール画面

「タイプ」で「スタンダード」が設定されていることを確認する。 その他はオプション設定なのでデフォルトのままとする。 画面の下までスクロールして「トピックの作成」を選択する。

SNS トピックの作成画面
SNS トピックの作成画面

SNS トピックの作成に成功すると、下記のようなメッセージが表示される。

SNS トピックの作成成功画面
SNS トピックの作成成功画面

Chatbot の設定

Getting started with AWS Chatbot」を参考にして、Chatbot を設定する。

ここでの作業範囲を下図に示す。

作業範囲(Chatbot と Slack)
作業範囲(Chatbot と Slack)

Chatbot のチャットクライアントのセットアップ

マネジメントコンソールで Chatbot のコンソールに移動する。

チャットクライアントには「Slack」と「Amazon Chime」が選べるが、ここでは「Slack」とする。 「クライアントを設定」を選択する。

Chatbot のコンソール画面
Chatbot のコンソール画面

Slack の認証ページにリダイレクトされるので、Slack のワークスペース名を確認する。 連携したいワークスペース名が表示されていない場合は、右上のプルダウンから選択する。 内容を確認して「許可する」を選択する。

Slack の認証ページ
Slack の認証ページ

Slack と Chatbot との連携に成功すると、下図のようなメッセージが表示される。 「新しいチャネルを設定」を選択する。

Slack と Chatbot の連携成功画面
Slack と Chatbot の連携成功画面

ここでは、下表のように設定する。 設定が終わったら、画面の下までスクロールして「設定」を選択する。

分類 設定項目 説明 設定値
設定の詳細 設定名 設定の名前を設定する。 「signin-configuration」
ログ記録 CloudWatch Logs へのログの記録の有無を設定する。 設定しない
Slack チャネル チャネルタイプ 通知先となる Slack チャネルの公開レベルを選択する。 「パブリック」
パブリックチャネル名 通知先となる Slack チャネル名を選択する。 「notification」
アクセス許可 IAM ロール Chatbot に付与する IAM ロールをテンプレートから新規作成するか、既存の IAM ロールから選択する。 「テンプレートを使用して IAM ロールを作成する」
ロール名 IAM ロールの名称を設定する。 「AWSChatbot-role」
ポリシーテンプレート IAM ロールに設定する権限をポリシーテンプレートから設定する。 「通知のアクセス許可」
通知 SNS トピック 購読する SNS トピックがあるリージョンを選択する。 「米国東部 - バージニア北部」
購読する SNS トピックを選択する。 「signin-notification」

Chatbot の設定が完了すると、下図のようなメッセージが表示される。

Chatbot の設定完了画面
Chatbot の設定完了画面

デスクトップアプリなどで Slack を開き、App 配下に「aws」が存在することを確認する。 存在しない場合は、「アプリを追加する」から「AWS Chatbot」を追加する。

Slack の App に Chatbot が追加された画面
Slack の App に Chatbot が追加された画面

ここまでの手順で Chatbot と Slack の連携が完了している。 下図のように、上記で設定したワークスペースの設定(「notification-configuration」)の左のラジオボタンを選択し、「テストメッセージを送信」を選択すると Slack にテストメッセージを送信できる。

Chatbot のテストメッセージの送付
Chatbot のテストメッセージの送付

Chatbot と Slack の連携がうまくできていれば、下図のようなメッセージが届く。

Slack に届いたテストメッセージ
Slack に届いたテストメッセージ

EventBridge の設定

Amazon EventBridge(EventBridge)のルールを使って、マネジメントコンソールへのサインインイベントの発生を捕捉する。

Tutorial: Creating an Amazon EventBridge rule that sends notifications to AWS Chatbot」を参考にして、EventBridge のルールを作成する。

ここでの作業範囲を下図に示す。

作業範囲(EventBridge)
作業範囲(EventBridge)

EventBridge のルールの作成

マネジメントコンソールで EventBridge のコンソールに移動する。

「ルールを作成」を選択する。

EventBridge のコンソール画面
EventBridge のコンソール画面

ルールの作成画面に遷移する。

EventBridge のルールの作成画面
EventBridge のルールの作成画面

ここでは、下表のように設定する。 設定が終わったら、画面の下までスクロールして「作成」を選択する。

分類 設定項目 説明 設定値
名前と説明 名前 ルールの名前を設定する。 「signin-rule」
説明 ルールの説明を記載する。 設定しない
パターンを定義 イベント駆動もしくは時間駆動のルールを選択する。 「イベントパターン」
イベント一致パターン サービスごとに事前定義されたパターンか、パターンをカスタマイズするかを選択する。 「サービスごとの事前定義パターン」
サービスプロバイダー イベントソースとなるサービスの提供者を選択する。 AWS
サービス名 イベントソースのサービス名を選択する。 AWS コンソールのサインイン」
イベントタイプ イベントのタイプを選択する。 「サインインイベント」
サインインイベントを捕捉するユーザを設定する。 「任意のユーザ」
イベントバスを選択 ルールのイベントバスを選択する。 AWS のデフォルトのイベントバス」
選択したイベントバスのルールを有効化するか選択する。 「選択したイベントバスでルールを有効にする」
ターゲットを選択 ターゲット イベントがイベントパターンに一致した場合に呼び出すターゲットを選択する。 SNS トピック」
メッセージを発行する SNS トピックを選択する。 「signin-notification」
タグ ルールに付与するタグを設定する。 設定しない

ルールの作成が完了すると、下図のようなメッセージが表示される。

ルールの作成成功画面
ルールの作成成功画面

以上で設定は完了である。

通知のテスト

マネジメントコンソールへのサインインで Slack に通知が届くかテストする。

マネジメントコンソールへのサインインイベントの Slack 通知(再掲)
マネジメントコンソールへのサインインイベントの Slack 通知(再掲)

一度マネジメントコンソールをサインアウトして、再度サインインする。

設定が正しく行われていれば、下図に示すようなメッセージが通知される。 なお、一段階目のパスワード認証時と二段階目の MFA 認証時で2つのサインインイベントが発生するため、2通メッセージが届く。

Slack に届くサインイン通知メッセージ(パスワード認証時)
Slack に届くサインイン通知メッセージ(パスワード認証時)

Slack に届くサインイン通知メッセージ(MFA 認証時)
Slack に届くサインイン通知メッセージ(MFA 認証時)

AWS のイベント情報は JSON で記録されるが、利用者側で特に情報の抽出や整形をすることなく Chatbot が自動で実行してくれている。

まとめ

Chatbot を使ってマネジメントコンソールのサインインイベントを Slack に通知する仕組みを構築した。 今回はサインインイベントをターゲットにしたが、コードを一切書くことなく簡単に実現できた。 他にも日々の Billing 情報の通知、CloudWatch Alarms でのエラー検知、CI/CD の実行状況の通知などにも使えるので、別の機会に試したい。

参考文献