让我们尝试使用Terraform来管理Slack应用程序

大家有在使用Slack App吗?在Slack上能够完成各种业务非常方便。我也将其作为CI/CD和业务效率化工具的一部分使用。

虽然 Slack 应用非常方便,但由于我之前一直手动管理,所以在新建应用时遇到了很多困难。

    • 設定項目ぽちぽちするのが面倒

 

    Slack App 以外のリソース (AWS Lambdaなど) を別途用意する必要があり面倒

我在这次的项目中,为了解决这些问题,尝试使用 Terraform 来管理 Slack App,现在向大家介绍一下。

使用的是以下的机制。

    • Slack App Manifest

 

    Terraform null_resource

我们将依次解释并总结步骤。

Slack应用清单

Slack App 可以用 JSON 或 YAML 格式来定义。有以下两种使用方法。

    • WebのUIから利用する

API をcurlなどで直接叩いて利用する

由于我们希望通过 Terraform 进行使用,所以这次我们将使用 API。
可以在此页面上查看用于定义的清单模式。

使用Terraform的null_resource

这是一个无操作的Terraform资源。由于与其他Terraform资源具有相同的生命周期管理,在想要执行某些操作以创建任何资源时非常方便。

通过同时使用 null_resource 和 local-exec Provisioner,可以实现执行Shell脚本的功能。本次我们将利用这个机制来调用Manifest API,创建一个Slack App。

操作步骤

1. 获取访问令牌

首先,获取用于使用Manifest API的访问令牌。
您可以从此页面获取访问令牌。
(※由于访问令牌的有效期为12小时,请在相同页面上进行令牌的更新(刷新))

2. 制作Manifest

在应用程序的设置中,我们将创建一个名为 Manifest 的文件。
这次是创建一个带有斜杠命令功能的 Slack 应用程序的例子。
其他可定义的值请参考官方页面。

{
  "manifest": {
    "display_information": {
      "name": "${app_name}",
      "description": "${description}",
    },
    "features": {
      "bot_user": {
        "display_name": "${bot_name}"
      },
      "slash_commands": ${jsonencode(slash_commands)}
    },
    "oauth_config": {
      "scopes": {
        "bot": ${jsonencode(bot_scopes)}
      },
    }
  }
}

3. Terraform设置的一方。

我们将定义适用于Slack App的Terraform资源。
重要的部分是在null_resource中使用local-exec Provisioner来执行curl命令。
为了避免在步骤1中不小心提交访问令牌,建议通过环境变量(如TF_VAR_access_token)传递。

variable app_name {
  type = string
}

variable bot_name {
  type = string
}

variable description {
  type = string
}

variable bot_scopes {
  type = list(string)
}

variable slash_commands {
  type = list(map(string))
}

// access_token は TF_VAR_access_token の環境変数経由とかで渡してください
variable access_token {
  type      = string
  sensitive = true
}

locals {
  template = templatefile(
    "templates/app_manifest.json.tftpl",
    {
      app_name       = var.app_name
      bot_name       = var.bot_name
      description    = var.description
      slash_commands = var.slash_commands
      bot_scopes     = var.bot_scopes
    }
  )
}

## メインのリソース.curl を叩いててリクエストボディに app_manifest.json を渡している
resource "null_resource" "slack_app" {
  provisioner "local-exec" {
    command = "curl -XPOST -H \"Authorization: Bearer ${var.access_token}\" -H \"Content-type: application/json\" -d '${local.template}' https://slack.com/api/apps.manifest.create"
  }
}
    tfvarsをよしなに定義
app_name    = "test_app"
bot_name    = "test_app_user"
description = "test app"
bot_scopes  = [
  "channels:read",
  "chat:write",
  "chat:write.public",
  "commands"
]
slash_commands = [
  {
    "command" : "/hoge",
    "description" : "hoge",
    "usage_hint" : "/hoge echo hoge",
    "url" : "https://example.com/api/hoge"
  }
]

4. 执行地球形态化

用bash或其他方式执行”terraform apply -var-file main.tfvars”。

结束

我已经解释了如何使用Terraform来管理Slack应用程序。通过使用Terraform进行管理,能够一并创建周边资源,非常方便。这样一来,在创建类似配置的应用程序时,工作量将大大减少。

然而,由于访问令牌每12小时更换一次,与Github Actions等CICD工具的组合是困难的。
此外,这次我们介绍了从null_resource执行bash的简便方法,但无法进行更新或删除操作…
如果自己创建Slack App的provider,则可以实现这一点,但还需另外的机会。

祝你在Slack上享受美好的应用体验!

广告
将在 10 秒后关闭
bannerAds