今回は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/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利用のお役に立てれば幸いです。