Slack と AWS Chatbot で ChatOps をやってみよう

2020-06-15
ビジネスxクラウド

Author : 大村 幸敬 

システムを運用する人々の会話がチャットに集約されるなら、システムにもチャットに参加してもらうと良さそうです。
チャットを介したシステム運用スタイルを ChatOps と言い、多くのお客様がこの新しいスタイルを採用しています。

2020 年 4 月に一般利用可能となった AWS Chatbot は ChatOps を実現するための AWS のサービスです。Slack や Amazon Chime のチャット機能と連携し、AWS サービスのイベントをチャットに流したり、Slack にメッセージを送ることで AWS 環境を操作することができます。

この記事では具体的な ChatOps のユースケースを紹介しつつ、そのために AWS Chatbot がどのように使えるのか、またそのセットアップ方法をご紹介します。
 

Why ChatOps ? - 障害対応オペレーションの例

システムはそれ単体で動き続けることはできません。安定運用のためにはシステム運用上発生する多様なイベントを、人が認識して対応する必要があります。特に障害対応では迅速な対応が求められますが、従来こういったイベントはオペレータがパトランプの鳴動を認識して担当者に電話したり、メールを一斉送信することで通知されました。複数の担当者が相互に連絡を取りながら対応するため情報が集約されづらく、またシステムにアクセスしないと (場合によってはオペレーションルームに移動しないと) どういった事象が発生しているかわからないといった状況がありました。ご経験がある方もいらっしゃるのではないでしょうか。

では、ChatOps による障害対応オペレーションはどういった流れになるでしょうか。ここでは Slack を使った場合の例を見てみましょう。

  • ある時、あなたの手元のスマートフォンに通知が届きます。障害検知用の Slack チャネルに CloudWatch アラームのメッセージが入ったようです。Slack アプリを立ち上げると、@aws ユーザーがアラームの詳細情報とともにグラフを投稿しています。とあるサーバーの CPU 使用率が上昇し、しきい値を上回っていることがわかります。

  • 同僚が調査に入ったとチャットに書き込んで来ました。あなたも着手を伝えつつ、サービスのトップページの応答状況を監視している CloudWatch Synthetics のアラーム状況を表示するよう @aws ユーザーに依頼します。即座に状態とグラフが投稿され、サービス自体には影響ないことがわかりました。一旦対応の緊急度は下げられそうです。

  • 継続して同僚とチャットで会話したところ、問題が起きたサーバーを再起動することでサービスに影響なく事象を回復できそうです。@aws ユーザーにサーバーの再起動の定形作業を依頼します。しばらくして @aws ユーザーにサーバーのメトリクスを出してもらうと、対象サーバーの CPU 使用率が落ち着いていることがわかりました。

  • やれやれ、緊急対応が完了しました。あとはさらに詳しい原因究明のため、PC を出してマネジメントコンソールでの調査に入ります。リーダーから「対応ありがとう ! 」のコメントも来ていますね。

いかがでしたか ? チャットを中心にコミュニケーションを取ることで複数の担当者が同じ情報を見ながら判断し、迅速にインシデントを解決することができました。また @aws ユーザーはシステムの窓口として情報を提供したり、定形処理を実施したりしていることがわかります。チャットによるコミュニケーションは時系列の記録が残るため、対応が落ち着いた後から経緯を確認しやすいのもポイントです。

ChatOps の全体像

先程の例では緊急対応の場合を紹介しましたが、ChatOps は日常運用の多くの場所で利用できます。必要な対応のレベルや用途に分けて次のようにチャットルームを分けるのも良い考えです。

  • サービスレベルに影響が出るイベントのチャネル。このチャネルの内容はすぐに対応が必要です。常に通知されるよう設定したり、より重要な場合は Amazon Connect で電話連絡を行うような仕組みも組み合わせると良いでしょう。 

  • 翌営業日の対応でよいイベントのチャネル。緊急度の低いセキュリティイベント (ポートスキャンなど) や、サービスレベルに影響しないエラーメッセージが出力されます。これらは 1 日分をまとめて朝会でチェックして対応を検討するといった方法が考えられます。

  • ログ的なイベントのチャネル。スプリント (1 ~ 2 週間の作業単位) の振り返りなどで長期の傾向を見たりする場合に使われます。不定期に行われる処理の実行時間を大づかみに確認するようなときに効果的です。

  • この他、自動テストの状況報告や自動デプロイなど定形処理の実行、作業進捗の報告など、情報の可視化範囲や権限に合わせてチャットルームを作るのがよいでしょう。

一方でチャットは時系列に情報が流れる場所です (フロー情報)。ナレッジを蓄積したり、インシデントをトラッキングする要な場合 (ストック情報) は Wiki やチケット管理など別のツールも使う必要があるでしょう。 これが ChatOps の全体像です。
 

AWS Chatbot の特徴

こういった ChatOps を実現するために必要なのがシステムとチャットをつなぐ chatbot と呼ばれる自動化の仕組みです。chatbotは システムからのイベントを受けてメッセージを投稿したり、特定のメッセージを受けてシステムで処理を行ったりします。従来これらの処理は Lambda 関数と Slack の Webhook を使って実装する必要がありましたが、AWS Chatbot を使うことで容易に ChatOps を実現できるようになりました (AWS Chatbot が対応していないサービスは従来どおり自分で実装する必要があります)。 

AWS Chatbotの主要な機能は次のとおりです。

  • Slack および Amazon Chime に対応
  • AWS の多様なサービスから発生するイベントを自動的に整形して Slack メッセージを投稿
  • AWS CLI と同様のコマンドで AWS の API を呼び出す。詳細な調査や Lambda 関数の実行
  • IAM によるアクセスの制御。bot が実行可能な API を IAM Role で制限。テンプレートによる簡易な設定も可能

AWS Chatbot を活用した ChatOps の実現例

クリックすると拡大します

AWS Chatbot のセットアップ

AWS Chatbot のセットアップは次のように行います。

1. イベント通知用の SNS Topic 作成
まず AWS Chatbot に対応サービスがイベントを通知するための SNS Topic を作成します。
次に AWS Chatbot が対応したサービスそれぞれで、イベントが発生したらこの Topic にメッセージを Publish するよう設定します。
 

2. チャットクライアントをセットアップ
AWS Chatbot のサービス画面から、[新しいクライアントを設定] をクリックし、クライアントの種類として [Slack] を選択します。 

Slack の権限リクエスト画面に移りますので、Chatbot と連携したい ワークスペースを選択して [許可する] をクリックします。

3. Slack チャネルの設定
[新しいチャネルを設定] をクリックします。ここで Slack チャネル、アクセス許可、そして通知設定を行います。まず Slack チャネルを指定します。バブリックチャネルを使う場合は一覧から選択します。プライベートチャネルを使う場合 Slack アプリ等からコピーしたリンクを貼り付けて設定します。
 

4. アクセス許可の設定
AWS Chatbot が AWS にアクセスする際の IAM Role を指定します。イベント通知のみ、Lambda の呼び出し、サポートコマンドの利用などの IAM Policy が用意されており、必要に応じて適切な権限を付与します。 

5. 通知の設定
最後にサブスクライブする SNS トピック (各サービスからのイベントが Publish されるトピック) を選択します。 以上で Chatbot のセットアップは完了です。
 

6. 動作確認
それでは SNS Topic にメッセージを Publish して動作を確認してみましょう。例えばCloudWatch Alarm (hogeAlarmとします) がトリガーされたときの通知先として 1 のトピックを指定し、次の AWS CLI コマンドで擬似的にアラームをトリガーします。
 

aws cloudwatch set-alarm-state --alarm-name hogeAlarm --state-reason "threshold crossed" --state-value ALARM

Slack チャネルにメッセージが投稿されると共に、CloudWatch メトリクスグラフが表示されます。 その他のサービスも同様に適宜適切なフォーマットでメッセージが投稿されます。 

7. コマンドを実行する
読み取り権限を付与すれば AWS CLI と同様の形式で指示を出すことができます。 Slack チャネルに @aws ユーザーを招待した上で、"@aws サービス名 オプション" とメンションすることで指示を出せます。例えばヘルプを表示する場合は次のようになります。このほか、Lambda 関数の実行、サポートケースの作成が行えます。Lambda 関数の実行では適切な権限を付与することで、リソースの作成、変更などを行うことも可能です。
 

以上で AWS Chatbot のセットアップは完了です。コードを書くことなく ChatOps を実現できることがおわかりいただけたと思います。

おわりに

いかがでしたでしょうか。
障害対応のユースケースを例に ChatOps の実際をご紹介し、AWS Chatbot の使い方をご紹介しました。 AWS Chatbot はノンコーディングで、また追加料金なく AWS からのイベントをチャットに流し、また AWS を操作することができます。 ChatOps を始めるための入り口としてぜひお試しください。

 

参考文献
AWS Chatbot »
AWS Chatbot - Administrator Guide »
Running AWS commands from Slack using AWS Chatbot »
オンコール対応システム AWSサービスだけでやってみたらこうなった »


builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

大村 幸敬 (おおむら ゆきたか)
アマゾン ウェブ サービス ジャパン合同会社
シニア ソリューションアーキテクト

エンタープライズ企業のクラウド活用をサポートするアーキテクト。AWS のマネジメント & ガバナンスサービスのスペシャリストとして AWS の運用を楽にするための情報提供も行っています。
趣味は BBQ とキャンプとロードバイク。

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する