TerraformでAWS ChatBotとSlackを連携させる手順

# はじめに
TerraformでAWS ChatBotを作成し、Slackと連携させるための手順をまとめる。

# テスト用のチャンネルを作成

Slackからテスト用のチャンネルを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/845328c4-ccf4-be49-8954-6be4ae57a2d0.png)

chatbot-testという名前にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/3bfd8814-d960-aa2d-ecf1-073f87eb0637.png)

今回はパブリックチャンネルにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/5c0dbbbd-c5df-8917-8722-0c486777f84e.png)


# SlackワークスペースIDを取得

AWS ChatBotのコンソール画面からチャットクライアントにSlackを設定します。
※ ここの設定をTerraformからは行えないため、事前にブラウザから行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/f3f9ad2c-0064-77a8-0618-4f931d7e8875.png)

ChatBotからワークスペースへのアクセスを許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/a9fce5ac-a1b3-81d7-cf5a-4c2f11e0db39.png)


許可をすると、設定済みクライアントにワークスペースとの連携が追加されます
「ワークスペースの詳細」にワークスペースIDが表示されるので、こちらを後々利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/5b252a50-5f32-45e7-20ed-96b5234c70e4.png)




# Terraformでリソース作成

main.tf
```terraform
terraform {
  backend "local" {
    path = "./terraform.tfstate"
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

# AWS ChatbotのSlackチャンネル設定を作成するリソース
resource "awscc_chatbot_slack_channel_configuration" "this" {
  # Slackチャンネル設定の名前
  configuration_name = "terraform-slack-channel-config"

  # Chatbotが使用するIAMロールのARN
  iam_role_arn = awscc_iam_role.this.arn

  # 通知を送るSlackのチャンネルID
  slack_channel_id = "C06CRP8EYHH"

  # SlackのワークスペースID (AWS Chatbotのコンソール画面で事前に設定が必要)
  slack_workspace_id = "T052RBT95S5"

  # 通知を送るSNSトピックのARNのリスト
  sns_topic_arns = [aws_sns_topic.this.arn]
}

# Chatbotが使用するIAMロールを作成するリソース
resource "awscc_iam_role" "this" {
  # IAMロールの名前
  role_name = "Terraform-ChatBot-Channel-Role"

  # このポリシーはChatbotサービスがこのロールを引き受けることを許可する
  assume_role_policy_document = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "chatbot.amazonaws.com"
        }
      },
    ]
  })

  # このロールにアタッチする管理ポリシーのARN
  managed_policy_arns = ["arn:aws:iam::aws:policy/AWSResourceExplorerReadOnlyAccess"]
}

# AWSの通知を送るSNSトピックを作成するリソース
resource "aws_sns_topic" "this" {
  # SNSトピックの名前
  name = "terraform-sns-topic"
}


```

TerraformでAWSリソースを作成する場合、AWS Providerを利用することが多いですが、AWS Chatbotには対応していません。かわりにawsccという、AWS Cloud Control APIを使用したリソースを使います。

https://registry.terraform.io/providers/hashicorp/awscc/latest


slack_channel_id の取得方法は[こちら](https://qiita.com/akis1215/items/cb68b2de6542a742da0a)を参照してください。

slack_workspace_id はChatbotコンソールの設定済みクライアントの画面から取得できます。


# デプロイ
terraform init → terraform plan → terraform apply を順番に実行します。

terraform applyに成功すると、設定済みチャネルに指定したチャンネルが追加されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/5a91bb9d-3852-a8aa-9dca-f82ae635869f.png)

また、SNSトピックと、Chatbotへのサブスクリプションが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/ff0e9bca-3b38-4034-6384-22d91bfd04e3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/24b97538-dfbc-a8cc-c2a4-d9ced69d97c6.png)


# テスト送信

Chatbotコンソールの「テストメッセージを送信」からテストメッセージを送信してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/d19c6bde-3d78-dd3b-8ca6-706e5489c218.png)


下記のメッセージがSlackに届きました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2703223/efbfba1b-05a9-89d3-69c8-984141e2f300.png)



# 参考資料

https://zenn.dev/pampus/articles/00cdc87b5289f0