はじめに
初めまして。
ニフティ株式会社 会員システムグループの川上拓哉です。
今回は、私の所属しているチームでの運用業務を、Webサービス「Zapier」とSlackを用いてChatOps化をしてみた、という記事です。
Zapierとは
Zapierとは様々なクラウドサービス、アプリ間をノーコードで連携することができるSaaS です。
クラウドサービスのイベントやスケジュール(Trigger)をもとに、特定の操作(Action)を実行させることができ、煩雑な操作の自動化に一役買うようなサービスとなっています。
設定、編集もGUIで直感的に操作できるため、導入と実装がとても簡単です。
Slackから実行したい操作
今回ChatOps化したい操作・作業は、毎朝実施している作業です。
クラウド上の自社サーバーにあるバッチを、サーバーに入って手動で実行しています。
毎回毎回サーバーに直接入らなければならず、サクッとSlackから実行できると便利そうですね。
Slackから直接サーバーの操作はできませんが、Zapier経由でSlackをトリガーにしたさまざまな操作が可能なので、いくつか組み合わせることで今回のChatOpsの一部を実装できそうです。
構成図
ChatOpsのシステム全体では以下のような構成にしていきます。

- 運用者がSlackワークフローを実行しSlackに特定のメッセージを投稿すると、Zapier が起動して AWS S3 のバケットにリクエストファイルが置かれます。(今回はこちらの処理について説明します。)
- サーバー側で定期実行されるシェルスクリプトが、リクエストファイルを検知し、バッチを自動実行してくれます。
今回使う機能
今回は、「指定のSlackチャンネルにメッセージが投稿」されたら「AWS S3の特定バケットにテキストファイル(リクエストファイル)を作成」する機能(Zap)を活用していきます。
ZapはTriggerとActionという要素でで構成されており、今回活用していくZapだと以下のようになります。
- Trigger:指定のSlackチャンネルにメッセージが投稿される。

- Action:AWS S3の特定バケットにリクエストファイルを作成する。

S3バケットにリクエストファイルを置くことができれば、サーバー上から検知できるので、この機能を活用していきましょう。
(S3の操作は、有料のProfessionalプラン以上でしか使えない機能となりますのでご承知おきください。)
Zapier Tips
実際に編集していきましょう。
最終的には、実行結果をSlackに通知もしたいので、以下のような構成のZapにしました。
- Trigger:Slackにメッセージが投稿される。
- Action:Slackメッセージに特定のキーワードがあった場合に続行する。
- Action:Slackメッセージの投稿時間をフォーマットして抽出する。
- Action:AWS S3バケットに、名前に投稿日付を含めたリクエストファイルを作成する。
- Action:実行結果をSlackに通知する。

ここからは、今回のZap実装に活用した、いくつかの便利な機能やActionを紹介したいと思います。
チャンネル一覧に出てこないSlackチャンネルを指定したい
Slackのチャンネルをチャンネル名で検索してもでてこないことがあります。そんなときは「SlackチャンネルをIDで指定」しましょう。
SlackチャンネルID の確認方法は割愛いたしますが、ZapierのSlackチャンネル選択画面にて「Custom」を選択しIDを入力することで指定することが可能です。

特定のメッセージが投稿された時のみ処理をしたい
チャンネルに投稿されたメッセージ全てで発火してほしくない。そんなときは「キーワードを指定して続行」させましょう。
Zapierの「Filter」の中の「Only continue if…」を使います。

画像のように設定することで、指定したSlackチャンネルに、「指定したい文言」が含まれたメッセージが投稿された時のみ後続の処理を行うことができます。
今回は、専用のチャンネルのSlackワークフローから、特定のキーワードを含んだメッセージを投稿するよう実装しました。
日時のフォーマットやタイムゾーンを変更したい
今回、ChatOps実行時の日時を取得してリクエストファイルの名前に含めることにしました。
Slackに投稿されたメッセージから時間が取得したいときは、「Format」の「Date / Time」を活用しましょう

実は、Slackメッセージから取得できる時間はUTCになっており、今回は日本時間(東京タイムゾーン)での実行開始時間が欲しいので少し工夫が必要でした。
Zapierの「Format」の「Date / Time」では、タイムゾーンを変更して出力できるだけでなく、出力フォーマットを指定できます。

出力形式についてはテンプレートもいくつか用意されています。

「YYYYMMDD」のように自由に指定もできます。

以下画像のように、フォーマットを指定した出力ができました。(タイムゾーンの修正もうまくいきました。)

後続の処理でも出力結果が利用できます。

無事ChatOps化できました!
今回作成したZapを使い、SlackからリクエストファイルをS3に作成することができました。加えてサーバーからシェルスクリプトでリクエストファイルを検知することでChatOpsを実装することができました。
ZapierにはSlack、S3の他にも連携サービスがたくさんあるので、みなさんもZapierを活用してみてください。