Slackの招待作業をしてくれるbotを書いた話

Posted by jolantern on Thursday, December 19, 2019

こんにちは、これは情シスアドベントカレンダー12月20日の記事です。

僕は今いわゆる情シス、コーポレートエンジニアをやっているのですが、情シスの大事なお仕事の一つに「アカウント作成」というものがあります。Azure ADやOneloginでアカウントを作るとあらゆる社内システムでアカウントが生えてくるのが理想ではありますが、既存の社内システムであったり認証システムがあるとうまく行かないなんてことはザラにあります。過渡期の社内システムあるあるですね。 特に、社名変更でドメインが違うからうまく行かないなんてときも…。色々苦労が多いのがアカウント管理かなと思います。

さて、皆さんの所謂情シスチームはどんなメンバーで構成されていますか?私のいるチームはマネージャが1人、私を含むプロパーが2人、派遣で来てくれているパートナーが1人といった構成です。一人情シスだったころと比べると随分立派な構成になったのだと思います(僕はその一人ではないので、偉そうなことは言えませんが)。

派遣パートナーに仕事を委譲したい

さて察しのいい情シスの方はもう何を話そうとしているか察しが付いているんじゃないでしょうか。そう、派遣パートナーにすべての権限を与えるのはプロパーに与えるよりも大変です。幸いなことに今着てくれているパートナーはとても優秀なので僕は全部渡しちゃえばいいじゃ〜んと雑なことを提案したりもするんですが、そうは問屋がおろさない。何かしらの根拠が求められます。 そこで、アカウントの作成はお願いしていいよねという根拠を作って、さてアカウントの作成作業は全部お願いしちゃうぞ!と思ったところで障壁が現れます。そう、Slackです。

Slackのロールはざっくりしている

Slackの権限のロールは随分ざっくりしていて、ゲストアカウントを除くと「オーナー」、「管理者」、「メンバー」といった具合になっています。オーナーは、何でもできます。管理者は一部の管理者権限、といってもほとんどの権限を有しています。メンバーは一般的なユーザなので、ワークスペースの設定次第ですが大したことはできなかったりします。勤め先は比較的オープンにしています。とはいえ、このざっくり具合だと「アカウント作成とかの権限だけ渡したいな〜」というとき困ります。

困りますと言われても

そんなジャパニーズカンパニーな都合を言っても仕方ないので、取るべき手段は下記。

  • 派遣パートナーでも管理者権限を渡していい立て付けを作る
  • プロパーが頑張ればいいだろ!と運用でカバー。最悪
  • なんか自動化する
  • API叩く

やっぱ最高なのは自動化ですよね。でもこれがなされていないのにはそれなりに、お金とかお金とか、人手が足りなくてできないとか、色々理由があるわけで…。立て付けを作るのも、システムがたくさんあるので汎用的な指針を作らないと毎回やり直す羽目になります。それは勘弁願いたい。だけど立て付けを作ったとしても、結局それから逸脱するシステムが有ると権限が与えられなくなってしまいます。権限を渡す基準としての立て付けをつくるということは、渡さない基準を同時に作ることでもあります。そして僕は日本語よりコード書いてるほうが楽しいので、API叩いていい感じにしようと思い立ちます。 ~なんかコード書く仕事したいけど色々あってずっとAzure ADと戦ったりなんか日本語書く仕事ばっかりしててコードの書き方忘れるんじゃないかって気持ちになったんだよ・・・~

カッとなったから…

作りました。

j-o-lantern0422/slack-management-delegation-bot: Slack bot for more administrator functions role.

名前から分かる通り、色々機能追加できるといいな〜と思って書いています。僕はSlackのAdmin Consoleをそもそも開きたくないのだ。できればbotじゃなくてターミナルから触りたいぐらいだったのですが、エンジニア出身じゃない人でも使えるといいよねとbotにしました。動かすところまでは頑張ってください。 動作方法は、 .env にSlack bot tokenと、Slackの管理者が発行できるlegacy tokenと、ワークスペース名を記述、 config.yml.sampleconfig.yml にリネームして bundle install 後に bundle exec ruby bot.rb とすればとりあえず動きます。

こんな感じ。 @bot invite mailaddress@mail.com name といった感じです。nameは省略可能です。 @bot invite help でヘルプが出ます。単純な作りですね。 ちなみに失敗したときはAPIレスポンスをそのまんま吐き出すパターンと、正規表現でメールアドレスがメールアドレスになっているかはみているのでメールアドレスが不正である旨のメッセージが表示されるパターンがあります。

Slackのinvite APIについて

ご存じの方もいると思いますが、今回利用しているSlackのinvite相当のAPIは公式にはサポートされていません。閉じられているというわけではなくて、正確には「undocumentedなAPI」です。Slack曰く、まだ開発中で今後動作が変更になる可能性が大いにあるので、ドキュメント化してないよ、とのこと。

Create users.admin.invite API doc · Issue #30 · slackhq/slack-api-docs

確かに僕がこのAPIの存在を知った2年前ぐらいとでは挙動が変わっていました。テストしてて気づいたんですが、昔は適当なメールアドレスでも招待成功したんですが(存在しなくてもpendingにはいった)今は入りませんね。招待の一覧、みたいなのを見るとそこに無効なメールアドレスですみたいなエラーとともに表示されます。

気にしたところ

まだまだ大したことはできませんが、気にしたこともあります。

  • inviteコマンドを実行したユーザがログに記録されるようにした
  • なるべくinviteコマンド以外のコマンドが存在しうることを意識した設計にした
  • 秘匿情報(特にレガシートークン)を環境変数から読むようにした
    • 環境変数にそういうのを入れるのは普通はあんまイケてない
    • k8sを使ってbotを動かしたりしているので、secretから読み込んで環境変数にセットするみたいな運用ならまあ良かろうと思った

今後の課題

アドベントカレンダーに間に合わせようと急いで作ったので課題がいっぱい!

  • 機能もっとほしい
    • ゲストユーザも指定したいよね
  • コマンドライン(ターミナルから)操作したいでござる…
  • インタラクティブレスポンス使ってもうちょい賢い感じでやりたい
  • 今は誰の言うことでも聞いてしまうので、人を見て選んでほしい
  • 社内でリリースする
    • 12月って忙しいねん