kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Terraform の AWS Cloud Control Provider (awscc) で AWS Chatbot を構築しよう

Terraform で AWS Chatbot を構築したくても AWS SDK for Go との関係によって AWS Provider でサポートされていないという課題がある🔥以下のような関連する issue もある💨

github.com github.com

ちなみに AWS CloudFormation では AWS::Chatbot::SlackChannelConfiguration としてサポートされている👌

docs.aws.amazon.com

よくある対応策としては大きく2種類あると思う.

  • AWS Chatbot のみ「マネジメントコンソール」で構築する
  • AWS Chatbot のみ「AWS CloudFormation」で構築する

さらに Terraform の aws_cloudformation_stack リソースを使って Terraform と AWS CloudFormation を連携するというある意味魔法のような (?) ソリューションもあったりする🧙

AWS Cloud Control Provider を使おう

実は Terraform には AWS の AWS Cloud Control API を操作する AWS Cloud Control Provider (awscc) があって,AWS Cloud Control API は AWS Chatbot をサポートしているため,結果的に Terraform で簡単に AWS Chatbot を構築できてしまう❗️AWS Cloud Control Provider は HashiCorp 社によってメンテナンスされてるけど,現時点では Technical Preview という注意点はある👀

github.com

AWS Cloud Control API に関しては以下のドキュメント参照📝

docs.aws.amazon.com

Terraform コード

以下のように AWS Provider と AWS Cloud Control Provider (awscc) を組み合わせて,Amazon SNS トピックと AWS Chatbot で Slack に通知をする構成を Terraform で書いた👌

AWS Cloud Control Provider (awscc) の awscc_chatbot_slack_channel_configuration リソースで Amazon SNS トピックと AWS Chatbot を紐付けつつ,必要なら AWS Chatbot の guardrail_policies なども設定できる.また slack_workspace_idslack_channel_id は別途取得しておく❗️

これは便利〜 \( 'ω')/

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.19.0"
    }
    awscc = {
      source  = "hashicorp/awscc"
      version = "~> 0.61.0"
    }
  }
  required_version = "~> 1.5"
}

resource "aws_sns_topic" "chatbot" {
  name = "chatbot"
}

resource "awscc_chatbot_slack_channel_configuration" "chatbot" {
  configuration_name = "slack-channel-chatbot"
  iam_role_arn       = aws_iam_role.chatbot.arn
  slack_workspace_id = "XXXXXXXXX"
  slack_channel_id   = "XXXXXXXXX"
  sns_topic_arns     = [aws_sns_topic.chatbot.arn]
}

resource "aws_iam_role" "chatbot" {
  name                = "chatbot-role"
  assume_role_policy  = data.aws_iam_policy_document.assume_chatbot.json
  managed_policy_arns = ["arn:aws:iam::aws:policy/CloudWatchReadOnlyAccess"]
}

data "aws_iam_policy_document" "assume_chatbot" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type        = "Service"
      identifiers = ["chatbot.amazonaws.com"]
    }
  }
}

AWS Chatbot に設定する IAM ポリシーは以下のドキュメントなどを参考にすれば OK👌

docs.aws.amazon.com

動作確認

動作確認のために Amazon SNS トピックから以下の JSON を送信する📤

{
    "version": "1.0",
    "source": "custom",
    "content": {
        "description": ":warning: EC2 auto scaling refresh failed for ASG *OrderProcessorServiceASG*! \ncc: @SRE-Team"
    }
}

すると期待通り Slack に通知された👏

JSON は以下のドキュメントに載ってる Minimalist custom notification を使った.

docs.aws.amazon.com

ちなみに Amazon SNS トピックから AWS Chatbot にカスタム通知を送信できるようになったのは2023年9月のリリース❗️

これは待望の機能だ〜 \( 'ω')/

aws.amazon.com

関連情報

AWS Cloud Control API でサポートされているサービスの操作 (CRUD) は以下のドキュメントにまとまっている💡

更新頻度的に English を見ておくと良いかと〜

  • AWS::Chatbot::MicrosoftTeamsChannelConfiguration
  • AWS::Chatbot::SlackChannelConfiguration

docs.aws.amazon.com