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 にイベントを通知するアーキテクチャを実現する。
実現手順
Chatbot の管理者ガイドを参考に実施する。
なお、今回は通知機能の実現に必要な最低限の設定のみを行うこととする。 商用で採用する場合には要件にしたがい、蓄積データの暗号化やログの取得などを適切に行うこと。
Chatbot のセットアップ
Chatbot を利用するための前提条件が下記となる。 利用者の環境によっては既に設定されているものもあると思うが、不足があれば「Setting up AWS Chatbot」にしたがって設定を行う。
- Chatbot に対する適切な権限を持つ IAM ユーザを作成すること
- Chatbot からの通知を受け取る SNS トピックを作成すること
- 今回は「signin-notification」という SNS トピックを作成する。(作成手順を下記に示す)
- Slack のワークスペースの管理者権限を持っていること
- Slack のワークスペースに SNS トピックからの通知を受け取るチャネルを作っておくこと
- 今回は「notification」チャネルに通知する。
なお、サインインのイベントは「米国東部(バージニア北部)us-east-1」リージョンで発生するので、ここで作業を行う。
SNS トピックの作成
下記に SNS トピックの作成手順を示す。
ここでの作業範囲を下図に示す。
マネジメントコンソールで SNS のコンソールに移動する。 画面右上の「トピック作成」に「トピック名」を入力して、「次のステップ」を選択する。
「タイプ」で「スタンダード」が設定されていることを確認する。 その他はオプション設定なのでデフォルトのままとする。 画面の下までスクロールして「トピックの作成」を選択する。
SNS トピックの作成に成功すると、下記のようなメッセージが表示される。
Chatbot の設定
「Getting started with AWS Chatbot」を参考にして、Chatbot を設定する。
ここでの作業範囲を下図に示す。
Chatbot のチャットクライアントのセットアップ
マネジメントコンソールで Chatbot のコンソールに移動する。
チャットクライアントには「Slack」と「Amazon Chime」が選べるが、ここでは「Slack」とする。 「クライアントを設定」を選択する。
Slack の認証ページにリダイレクトされるので、Slack のワークスペース名を確認する。 連携したいワークスペース名が表示されていない場合は、右上のプルダウンから選択する。 内容を確認して「許可する」を選択する。
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 の設定が完了すると、下図のようなメッセージが表示される。
デスクトップアプリなどで Slack を開き、App 配下に「aws」が存在することを確認する。 存在しない場合は、「アプリを追加する」から「AWS Chatbot」を追加する。
ここまでの手順で Chatbot と Slack の連携が完了している。 下図のように、上記で設定したワークスペースの設定(「notification-configuration」)の左のラジオボタンを選択し、「テストメッセージを送信」を選択すると Slack にテストメッセージを送信できる。
Chatbot と Slack の連携がうまくできていれば、下図のようなメッセージが届く。
EventBridge の設定
Amazon EventBridge(EventBridge)のルールを使って、マネジメントコンソールへのサインインイベントの発生を捕捉する。
「Tutorial: Creating an Amazon EventBridge rule that sends notifications to AWS Chatbot」を参考にして、EventBridge のルールを作成する。
ここでの作業範囲を下図に示す。
EventBridge のルールの作成
マネジメントコンソールで EventBridge のコンソールに移動する。
「ルールを作成」を選択する。
ルールの作成画面に遷移する。
ここでは、下表のように設定する。 設定が終わったら、画面の下までスクロールして「作成」を選択する。
分類 | 設定項目 | 説明 | 設定値 |
---|---|---|---|
名前と説明 | 名前 | ルールの名前を設定する。 | 「signin-rule」 |
説明 | ルールの説明を記載する。 | 設定しない | |
パターンを定義 | イベント駆動もしくは時間駆動のルールを選択する。 | 「イベントパターン」 | |
イベント一致パターン | サービスごとに事前定義されたパターンか、パターンをカスタマイズするかを選択する。 | 「サービスごとの事前定義パターン」 | |
サービスプロバイダー | イベントソースとなるサービスの提供者を選択する。 | 「AWS」 | |
サービス名 | イベントソースのサービス名を選択する。 | 「AWS コンソールのサインイン」 | |
イベントタイプ | イベントのタイプを選択する。 | 「サインインイベント」 | |
サインインイベントを捕捉するユーザを設定する。 | 「任意のユーザ」 | ||
イベントバスを選択 | ルールのイベントバスを選択する。 | 「AWS のデフォルトのイベントバス」 | |
選択したイベントバスのルールを有効化するか選択する。 | 「選択したイベントバスでルールを有効にする」 | ||
ターゲットを選択 | ターゲット | イベントがイベントパターンに一致した場合に呼び出すターゲットを選択する。 | 「SNS トピック」 |
メッセージを発行する SNS トピックを選択する。 | 「signin-notification」 | ||
タグ | ルールに付与するタグを設定する。 | 設定しない |
ルールの作成が完了すると、下図のようなメッセージが表示される。
以上で設定は完了である。
通知のテスト
マネジメントコンソールへのサインインで Slack に通知が届くかテストする。
一度マネジメントコンソールをサインアウトして、再度サインインする。
設定が正しく行われていれば、下図に示すようなメッセージが通知される。 なお、一段階目のパスワード認証時と二段階目の MFA 認証時で2つのサインインイベントが発生するため、2通メッセージが届く。
AWS のイベント情報は JSON で記録されるが、利用者側で特に情報の抽出や整形をすることなく Chatbot が自動で実行してくれている。
まとめ
Chatbot を使ってマネジメントコンソールのサインインイベントを Slack に通知する仕組みを構築した。 今回はサインインイベントをターゲットにしたが、コードを一切書くことなく簡単に実現できた。 他にも日々の Billing 情報の通知、CloudWatch Alarms でのエラー検知、CI/CD の実行状況の通知などにも使えるので、別の機会に試したい。