📡

TerraformでAWS Chatbotを作るメモ(Cloud Control API)

2023/09/08に公開

概要

TerraformのAWS ProviderではResourceとしてAWS Chatbotが存在しませんが、Cloud Control APIを利用することで作成できます。
https://docs.aws.amazon.com/ja_jp/cloudcontrolapi/latest/userguide/what-is-cloudcontrolapi.html

AWS ProviderからCloud Control APIを使う方法と、全てがCloud Control APIで操作するようになっているAWS Cloud Control Providerを使う方法があるのでどちらでも試してみます。

事前準備

AWS ChatbotとSlackワークスペースの連携は先にブラウザで実施します。
またChatbot用のIAM Role、ガードレールポリシー、SNSトピックは別途定義しておきます。

Slackチャンネル定義

まとめてチャンネル連携を行いたいのでlocalsで定義します。

locals {
  slack = {
    workspace = {
      workspace_id = "ABCD12345"
      channels = {
        critical = {
          channel_id    = "0ABCD123456"
          sns_topic_arn = aws_sns_topic.critical.arn
        }
        warning = {
          channel_id    = "1ABCD123456"
          sns_topic_arn = aws_sns_topic.warning.arn
        }
        error = {
          channel_id    = "2ABCD123456"
          sns_topic_arn = aws_sns_topic.error.arn
        }
      }
    }
  }
}

AWS Provider

AWS Providerの aws_cloudcontrolapi_resource を使う例です。

cloudcontrolapi
resource "aws_cloudcontrolapi_resource" "chatbot" {
  for_each = local.slack.workspace.channels

  type_name = "AWS::Chatbot::SlackChannelConfiguration"
  desired_state = jsonencode({
    ConfigurationName = "${local.name_prefix}-${each.key}"
    IamRoleArn        = aws_iam_role.chatbot.arn
    SlackWorkspaceId  = local.slack.workspace.workspace_id
    SlackChannelId    = each.value.channel_id
    GuardrailPolicies = [aws_iam_policy.guardrail.arn]
    SnsTopicArns      = [each.value.sns_topic_arn]
  })
}

AWS Cloud Control Provider

AWS Cloud Control Providerの awscc_chatbot_slack_channel_configuration を使う例です。

awscc
resource "awscc_chatbot_slack_channel_configuration" "chatbot" {
  for_each = local.slack.workspace.channels

  configuration_name = "${local.name_prefix}-${each.key}"
  iam_role_arn       = aws_iam_role.chatbot.arn
  slack_workspace_id = local.slack.workspace.workspace_id
  slack_channel_id   = each.value.channel_id
  guardrail_policies = [aws_iam_policy.guardrail.arn]
  sns_topic_arns     = [each.value.sns_topic_arn]
}

Discussion