概要
terraformからpablovarela/slackプロバイダーを利用し、slackのchannelを作成するための手順です。
slackを外部のアプリケーションから操作するためには、slackでアプリケーション(App)
を作成する必要があります。作成したAppに必要な権限を付与し、App操作のためのTOKENを利用しterrafomから実行します。今回利用したpablovarela/slackプロバイダーは、環境変数SLACK_TOKEN
でTOKENをterraformに渡せますのでその方式を利用します。(セキュリティーの面からコードへのTOKEN埋め込みは避けたいため)
あとはterraformでコーディングして実行して、Slackのチャンネルを作成します。
手順
SlackのApp作成
terraformで操作を行うため、SlackのApp(ポット)を作成します。
- Appを作成したいSlackユーザでブラウザからサインインする
- App作成のため「Slack API: Applications | Slack」に移動し、
Create an App
をクリックする
Create an app
でFrom scratchを選択
- Appの名前とワークスペースを選択する
App Name
: 今回はexecute-terraform
という名称を設定Pick a workspace to develop your app in
: Appをインストールしたいワークスペースを指定する
- Appのボット用TOKENに権限を付与する
- 左のバーから
OAuth & Permissions
を選択する Scopes
で、Bot Token Scopes
のAdd an OAuth Scope
から必要な権限を追加する- 権限は以下の6つを追加する
- terraformのResource
slack_conversation
用権限- channels:manage
- channels:read
- groups:write
- groups:read
- terraformのData source
slack_user
用権限- users:read
- users:read.email
- terraformのResource
- 左のバーから
- ワークスペースへのAppインストール
- 同じ画面上部の
OAuth Tokens for Your Workspace
に移動し、Install to Workspace>
を実行 - 選択先の画面で許可を行う
- 同じ画面上部の
- TOKENの取得
Bot User OAuth Token
に表示されているトークンを取得する
terrafomのコード
terrafomのセットアップは、こちらを参照ください。
SlackのTOKEN設定
terrafomでSlackを操作するSlack Providerには、環境変数を利用しTOKENを渡します。
export SLACK_TOKEN="<Appで生成したtoken>"
terrafomでのSlackチャンネル作成のサンプルコード
Slack チャンネル作成用のサンプルです。
terraformの実用的な実装を考慮しmodule構成にはしていますが、blogでの視認性の観点からファイル分割や環境毎のディレクトリ分割はしていません。
. ├── main.tf └── modules └── slack_channel └── module_main.tf
./main.tf
: プロバイダー設定 & モジュールの呼び出し
#---------------------------- # slack provider #---------------------------- terraform { required_providers { slack = { source = "pablovarela/slack" version = "~> 1.0" } } required_version = ">= 0.13" } provider "slack" {} #---------------------------- # main #---------------------------- module "slack_channelt" { source = "./modules/slack_channel" name = "sample-channel" topic = "This is sample channel for terrafom demo." slack_users_mail = ["clausvalca813@gmail.com", "n.fujita74@gmail.com"] }
./modules/slack_channel/module_main.tf
: 最小モジュールのサンプル
#--------------------------- # Variable設定 #--------------------------- variable "name" { type = string } variable "topic" { type = string } variable "slack_users_mail" { type = list(string) } #--------------------------- # Provider設定 #--------------------------- terraform { required_providers { slack = { source = "pablovarela/slack" version = "~> 1.0" } } required_version = ">= 0.13" } #--------------------------- # channel設定 #--------------------------- # 追加するユーザのメール情報からユーザIDの配列を生成 data "slack_user" "users" { for_each = toset(var.slack_users_mail) email = each.key } locals { users_list = [for i in data.slack_user.users : i.id] } # Create a Slack channel resource "slack_conversation" "individual_alert_channel" { name = var.name topic = var.topic permanent_members = local.users_list is_archived = false is_private = false }
ポイントは以下の通りです。
- provider設定
- 今回利用したプロバイダーは、
required_providers
を設定しないと動作しないので要設定 - module側でも同じ設定が必要
- 設定内容は、こちらのドキュメントを参照
- 今回利用したプロバイダーは、
- チャンネルに参加させるユーザ
slack_user
でメールアドレスからSlackユーザを特定し、localsでユーザIDを配列にする
terraformの実行
terraform init terraform apply