AWS/Terraform

【Terraform】ChatbotからSlackへの通知構成を構築してみた

今回はTerraformを用いて、Chatbotの通知構成(GuardDutyの検知をSlackチャンネルに通知する構成)を構築する方法をご紹介します。

構成図

今回構築する構成は以下です。
Terraformで構築する対象は、GuardDuty、EventBridge、SNS、Chatbotです。
※サービス連携に必要なIAMリソースを含みます。

前提

Terraformで構築を進めていく上での前提は以下です。

Terraformのバージョン

筆者が使用したTerraformのバージョン情報は次のとおりです。

Terraformのバージョン  1.1.7
AWSプロバイダのバージョン 4.2.0

手動でしておく作業

Slackチャンネルの作成
Slackにて、GuardDutyの検知結果を通知するためのSlackチャンネルを作成しておきます。※チャンネル名は任意。

ChatbotへSlackワークスペースIDの連携
AWSマネジメントコンソールにて、ChatbotとSlackワークスペースの連携を実施しておきます。
手順は以下です。

  • Chatbotの画面で「新しいクライアントを設定」をクリックします。
  • 「Slack」を選択して「設定」をクリックします。
  • Slackにて、「アプリを追加する」をクリックし、検索ボックスで、「aws」と入力します。
    「AWS Chatbot」が自動で追加されていることを確認します。
  • AWSマネジメントコンソールに戻り、Chatbotの画面を確認します。
    Slackワークスペースが連携され、ワークスペースIDが取得されていることを確認します。

構築手順

Terraformのコード準備

  • Terraform作業環境にて、以下のGitHubリポジトリをクローンします(コピーでも可)。
    https://github.com/dogharasu/terraform-chatbot-guardduty
  • 「terraform/terraform-config.tf」にて、Terraformのバックエンド用S3バケット名およびDynamoDBテーブル名に書き換えます。
    ############################################################################
    # バックエンド設定
    ############################################################################
    terraform {
      backend "s3" {
        bucket         = "<バックエンド用S3バケット名>"
        key            = "state/terraform.tfstate"
        encrypt        = true
        region         = "ap-northeast-1"
        dynamodb_table = "<バックエンド用DynamonDBテーブル名>"
      }
    }​

    ※S3バケット・DynamonDBが未構築の場合は、以下記事をご参照ください。

【Terraform】tfstateファイルをAWSのS3・DynamoDBで管理する今回は、Terraformのtfstateファイル(以下stateファイル)をAWSのS3・DynamoDBで管理する方法をご紹介します...
  • 「terraform/main.tf」を開き、ファイル最下部のChatbot定義にて、SlackのチャンネルID、ワークスペースIDを入力します。
    ############################################################################
    # Chatbot
    ############################################################################
    # https://github.com/waveaccounting/terraform-aws-chatbot-slack-configuration
    module "chatbot_slack_configuration_example" {
      source  = "waveaccounting/chatbot-slack-configuration/aws"
      version = "1.1.0"
    
      configuration_name = "chatbot-guardduty"
      guardrail_policies = ["arn:aws:iam::aws:policy/ReadOnlyAccess"]
      iam_role_arn       = aws_iam_role.example.arn
      logging_level      = "ERROR"
      slack_channel_id   = "<SlackチャンネルID>"
      slack_workspace_id = "<SlackワークスペースID>"
      sns_topic_arns     = [aws_sns_topic.example.arn]
      user_role_required = false
      tags = {}
    }​

    ※チャンネルIDは、Slackを開き、該当チャンネル名を右クリックして「チャンネル詳細を表示する」をクリックすると表示されます。
    ※ワークスペースIDは手動でしておく作業の最後の手順で確認したIDです。

  • 「terraform/policy/sns.json」を開き、リソースを構築するAWSアカウント番号を記入します。
    {
        "Version": "2008-10-17",
        "Id": "__default_policy_ID",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "AWS": "*"
            },
            "Action": [
              "SNS:GetTopicAttributes",
              "SNS:SetTopicAttributes",
              "SNS:AddPermission",
              "SNS:RemovePermission",
              "SNS:DeleteTopic",
              "SNS:Subscribe",
              "SNS:ListSubscriptionsByTopic",
              "SNS:Publish"
            ],
            "Resource": "arn:aws:sns:ap-northeast-1:<AWSアカウント番号>:sns-topic-chatbot-guardduty",
            "Condition": {
              "StringEquals": {
                "AWS:SourceOwner": "<AWSアカウント番号>"
              }
            }
          },
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "events.amazonaws.com"
            },
            "Action": "sns:Publish",
            "Resource": "arn:aws:sns:ap-northeast-1:<AWSアカウント番号>:sns-topic-chatbot-guardduty"
          }
        ]
    }​

Terraformの初期設定

「terraform」ディレクトリにてterraform initを実行します。
Chatbotの構築にモジュールを用いているため、以前にterraform initを実行している場合でもコマンド実行が必要です。
※ChatbotはTerraformで直接構築できないため、Terraform→CloudFormation→Chatbotの流れで構築するためのモジュールを利用します。

Terraformでデプロイ

「terraform」ディレクトリにてterraform applyを実行して、構成図のリソースをデプロイします。

動作確認

  • Terraformで構築されたEventBridgeルールを開き、「編集」をクリックします。
  • サンプルイベントから「GuardDuty Finding」を選択して、「コピー」をクリックします。
  • Terraformで構築されたSNSトピックを開き、「メッセージの発行」をクリックします。
  • メッセージ本文にEventBridgeでコピーしていた内容をそのままペーストします。
    メッセージ属性は「削除」をクリックして、「メッセージの発行」をクリックします。
  • Terraformで構築したChatbotによって、指定したSlackチャンネルに通知がきていることを確認します。

まとめ

今回は、TerraformでChatbotの通知構成を構築する方法をご紹介しました。
Chatbotについては一般公開されているモジュールを使用することで、Terraformで構築することができます。
筆者が参考にした記事(後述の参考情報)では、Chatbotの設定値について分かりやすくまとめられていました。

この記事を通して、少しでもTerraform利用のお役に立てれば幸いです。

参考情報