のぴぴのメモ

自分用のLinuxとかの技術メモ

terraformでSlackチャンネルを作成するための手順

概要

terraformからpablovarela/slackプロバイダーを利用し、slackのchannelを作成するための手順です。

slackを外部のアプリケーションから操作するためには、slackでアプリケーション(App)を作成する必要があります。作成したAppに必要な権限を付与し、App操作のためのTOKENを利用しterrafomから実行します。今回利用したpablovarela/slackプロバイダーは、環境変数SLACK_TOKENでTOKENをterraformに渡せますのでその方式を利用します。(セキュリティーの面からコードへのTOKEN埋め込みは避けたいため)

あとはterraformでコーディングして実行して、Slackのチャンネルを作成します。

f:id:nopipi:20210921001409p:plain

手順

SlackのApp作成

terraformで操作を行うため、SlackのApp(ポット)を作成します。

f:id:nopipi:20210920224224p:plain:w400

  • Create an appFrom scratchを選択

f:id:nopipi:20210920224833p:plain:w400

  • Appの名前とワークスペースを選択する
    • App Name : 今回はexecute-terraformという名称を設定
    • Pick a workspace to develop your app in: Appをインストールしたいワークスペースを指定する

f:id:nopipi:20210920225258p:plain:w400

  • Appのボット用TOKENに権限を付与する
    • 左のバーからOAuth & Permissionsを選択する
    • Scopesで、 Bot Token ScopesAdd an OAuth Scopeから必要な権限を追加する
    • 権限は以下の6つを追加する
      • terraformのResourceslack_conversation用権限
        • channels:manage
        • channels:read
        • groups:write
        • groups:read
      • terraformのData sourceslack_user用権限
        • users:read
        • users:read.email

f:id:nopipi:20210920230936p:plain:w400

f:id:nopipi:20210920231856p:plain:w400

f:id:nopipi:20210920231950p:plain:w400

  • ワークスペースへのAppインストール
    • 同じ画面上部のOAuth Tokens for Your Workspaceに移動し、Install to Workspace>を実行
    • 選択先の画面で許可を行う
  • TOKENの取得
    • Bot User OAuth Tokenに表示されているトークンを取得する

f:id:nopipi:20210920233403p:plain

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

実行時の注意点

  • terraform destroyなどでチャンネルを削除しても、チャンネルはアーカイブされるだけで削除はされない
    • そのため再度チャンネルを作成しようとすると、エラー(name_taken: A channel cannot be created with the given name)が発生する
    • 再作成する場合は、事前にチャンネル管理者によりアーカイブされた該当チャンネルを削除する必要がある