インターネットメモ帳

文章を書く練習をする場所

イベント運営にterraformを使う

この記事は Recruit Advent Calendar 2021 の16日目の記事です。

初めに

普段業務ではクラウド使ったプロダクト開発のあれこれをやっていますが、たまに社内ISUCONやAWS GameDayの運営もやっていたりしています。

積み重ねが生み出した新たな一歩——若手が力を発揮した「R-ISUCON 2021 Summer」 | リクルート メンバーズブログ

社内イベントを実施する上でコンテンツ自体の完成度も重要ですが、円滑にイベントを進行させるもの大事です。

円滑に進行を行うための一、つに運営と参加者のコミュニケーションパスの作成があります。

最近では嬉しいことに社内でイベントを開くと90人近く集まってくれてチームも20チーム以上出来ることがあります。

が、チーム数が多いと準備に必要な量も比例してい多くなります。

f:id:int_tt:20211216211736p:plain

更にチームごとに個別の情報を送ったりする必要があるので手動でやるには骨が折れます。

terraformを使う

これらを準備するためにscript書いたりポータルで情報をやり取りできるようにしたりやり方は色々あるかと思います。

社内ISUCONの場合、競技用の環境をAWSで作成するためにTerraformを使っていたので、「折角ならTerraformでチャンネル作ったりメッセージも投稿出来たほうが便利じゃない?」と思い、Terraformを使ってみようと考えてみました。

slack provider

Terraformで利用できるslack providerはコミュニティのものがすでにいくつか存在しています。僕がやりたかったことは大きく以下のとおりです。

  • 各チーム向けのprivateチャンネルの作成
  • 各チャンネルに対してチームメンバーと運営の招待

コミュニティのものを利用しても良かったのですが、普段terraformを使っているけどproviderの仕組みのことまでちゃんと知らないなと思い、せっかくなので自作してみました。

https://github.com/int-tt/terraform-provider-slack

また、プロバイダーの作成に関しては以下のを記事がとても参考になりました

Terraform Provider実装 入門(1): Custom Providerの基礎 - febc技術メモ

使い方

使い方はとてもシンプルです。以下のようなCSVとterraformのコードを準備して実行するだけです。

もちろんCSVはなくても利用可能です。

id,email
team-A,example@example.com
locals {
  teams        = csvdecode(file("./team-list.csv"))
  team_names = distinct([for t in local.teams : t.id])
}
resource "slack_channel" "team-channel" {
  for_each = toset(local.team_names)
  name    = format("event-name-", trim(replace(lower(each.value), "/[・、 ]/", "-"), "!"))
  private  = true
}

data "slack_user_with_email" "team-member" {
  for_each = { for team in local.teams : team.email => team }
  email    = each.value.email
}

resource "slack_channel_invite" "team-member" {
  for_each   = { for team in local.teams_member : team.email => team }
  channel_id = slack_channel.team-channel[each.value.id].id
  user_id    = data.slack_user_with_email.team-member[each.value.email].id
}

これでチャンネル作成と招待を一気に実行することが出来ます。

また terraform destroy を使うことで一気にチャンネルのarchiveも実行できます。

やりたいけど出来てないこと

先程slackのメッセージも投稿できるようにしたいって書いてましたが、まだ出来ておらず、イベント運営のときは温かみのある対応をしていました。

APIで投稿するときにはmarkdownでシュッと書いて投稿するのは出来ないので、次のイベント運営の時に気力があれば対応したいなと思います

おわりに

実際に使ってみて感想は便利だったのであってよかったなーというのと、terraform-plugin-sdk よく出来ているなーと感じました。

イベント運営以外にも普段のプロダクト開発におけるslackチャンネル作成や入退室の管理にも使えそうだなと思ったので機会があればやってみたいなと思いました。