Botを使い様々な業務の自動化を行っています。メインのAPIのReleaseはBotによる自動化がされており、JPとUSとUKの3拠点で1日に10回以上のReleaseをSlack上で実現しています(これ以外にも多くの事例があります)。Messageという仕組みも提供しています。これによりButtonによる決定やMenuによる選択といったアクションをユーザにとらせることができるようになります。Service専用という色合いが強かったように思います)。Messageを使ったBotの開発がより簡単に行えるようになりました。Mercariでは早速この仕組を利用したBotを開発し使い始めています。Messageを使ったBotの開発を書く方法を紹介します。slackapi/sample-message-menus-nodeが参考になるでしょう)。Buttonを押すのが気持ちいButtonを使えばある処理の実行の確認を1つのButtonに集約することができます。重要な処理の場合はそのButtonを押せる人を限定することで簡単な承認フローの実現もできます。Menuを使えばBot側から選択肢を提示することができ、ユーザに自由に入力をさせるよりもより安全に期待する入力を受け付けることができます(開発側からすれば入力のValidationが楽になります)。Appからの操作が非常に楽です。Botを作るモチベーションとしてChannelに参加しているメンバーとのコラボレーションが挙げられますが、エンジニア以外の仲間へそのツールの利用の窓口を広げることも重要な要素だと思います(エンジニアだけならCLIツールだけで十分なことが多い)。Messageを使うことでエンジニア以外のメンバーにより直感的な使いやすいインターフェースを提供できます。Messageを利用しています。USでは一部のサービスをKubernetes(GKE)で動かしています(新しく作るものは基本的にKubernetes前提です)。ImageをClusterにDeployします。ユーザがBotにDeployを依頼するとDeploy可能なイメージ一覧(具体的にはTag)をMenuで提示し、選択されたものをCluster上に展開します。ImageのVersionを書き換えてPRを作るところまでやるためレポジトリの設定ファイルと本番で動いているImageのVersionに乖離が発生しないようになっています。Bot特定のサーバーへアクセスするためのアカウントやVPNのアカウント作成はSREが担っています。昔はSREがサーバーにログインし手動で行ってきましたが、現在はBotで自動化されています。ユーザがBotに対してアカウント作成の依頼を行うとBotがSREに対してButtonで承認を求めます。SREの承認を受けてBotはアカウントの作成を開始します。これにより自動化はされていますが誰でも好き勝手にアカウントを発行することを防いでいます。PubSubに投げます。アカウントを実際に作成するためのWorkerはJPとUSとUKの3Regionで動いておりそれぞれ適切なTopicをSubscribeして実際の処理を行います。Messageを使ったBotの作り方とサンプルコードの解説を行います。今回は例としてビールを注文する@beerbotを作成します(実際には注文はしません。インターフェースのみを作成します)。Botに話しかけるとBotはMenuを使って注文可能なビールの銘柄一覧を提示してユーザに選択させます。Buttonを使って注文を確定、もしくはキャンセルさせることができるようにします。以下が今回作成するBotの動作例です。Appの準備では実際にBotを作成していきます。Appとして作成する必要があります。ここから新しくAppを作成します。Messageを有効にします。URLが必要になります。Messageに対するアクションの結果はこのURLにPOSTされることになります。AppをTeamにインストールします。Tokenが得られます。これらの値はBotを動かすのに必要になります。これで準備は完了です。GolangによるBotの開発では実際にBotを書いていきます。Botに必要なのは以下の2つです。Listenerを書きます。Event)に反応してMenuをユーザに提示するようにします。packageを利用します。以下のようなListenerを書いてEventをWatchし今回必要なMessageEventを待ち受けます。}}次にMessageEventを処理する以下のような関数を書きます。error関数内ではまずMessageEventのValidateを行います。最低限以下が必要でしょう。期待するChannelからのMessageであるか(botによっては反応するべきChannelを限定するべきです。Channelのみで動作するべきです)Botに対するメンションであるか次に実際の発言内容(MessageEvent.Msg.Text)をParseします。この辺りはCLIツールを書くときと同じように考えることができます。ここでのコマンドのParse結果により以下のMenuの表示などを変更します(今回の例は簡単のために単に「hey」という発言に反応するのみです)。次に実際にMenuの表示を行います。APIのAttachmentフィールドを利用します。Golangで書いた場合は以下のようになります。}まずAttachmentAction.Typeによりselect(Menu)かbuttonを指定します。AttachmentActionOptionのSliceがそのままMenuの選択肢として表示されます(今回はビールの銘柄を表示します)。APIでEventを受けたChannelに投稿するだけです。すると以下のようなMenuを表示することができます。Messageに対するアクションの結果を受け取るHandlerを書きます。以下のようなHandlerを書きます。Messageでも共通になると思います)。以下のような処理を行っています。Tokenと一致するかを確認するあとは得られたユーザのActionの結果を処理するだけです。この部分は以下のように書けます。}}ここでは得られたアクションによりそれぞれ処理を行います。アクションの判別はAttachmentAction.Nameで定義したものを利用します。今回の例では以下の3つのアクションを定義しています。注文をキャンセルするButtonのアクション例えばactionSelectの場合はユーザの選択(ビールの銘柄)を取り出し実際に注文を行ってよいかの確認を再びButtonを使って行っています。actionCancelの場合は注文がキャンセルされた旨をレスポンスとして返答しています。Messageではユーザのアクションに対する返答は既にPostされているOriginalMessageのメッセージを上書きするように返答を行います。これは例えばButtonを押してもButtonがそのまま表示されていたら永遠にButtonを押せることになるのを防ぐためです。これを行うためには以下のような関数を準備しておくと便利です。ButtonなどのAttachmentActionを消して新たなメッセージで上書きしたレスポンスを返す事ができます。}アクションのレスポンスには必ず誰がそのアクションを行ったかを提示するのが大切です。しないと誰がそのアクションを行ったかを後で追えなくなるためです。messagesが参考になります)。Messageを使ったBotの開発を書く方法について紹介しました。Messageを使いより使いやすいBotを開発しどんどん自動化していきましょう。Mercariでは自動化が好きGolangが好きなSREを募集しています。Meetupがあります。Messageを使ったBotを書くTweet関連記事2019-12-07Flutter製MTC2018アプリをSwiftUIでリライトした話こんにちは。Day」でちょっと便利なQAテストツールを作った話こんにちは。採用情報メルカリは常に優秀なソフトウェアエンジニアを募集しています。ご興味を持たれた方はぜひご応募ください。skills月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。