10分でできる!AWS Security Hub のアラートを見やすく整形して Slack に通知してみた(CloudFormation 利用)

10分でできる!AWS Security Hub のアラートを見やすく整形して Slack に通知してみた(CloudFormation 利用)

Security Hub のアラートを見やすく整形し、Slack に通知する仕組みを 10 分で構築します。Lambda 不要のシンプルな構成です。
2026.01.22

はじめに

クラスメソッドオペレーションズの Shimizu です。

AWS を業務利用する際、まずセキュリティ設定がベストプラクティスに沿っているかを検出するため、Security Hub を有効化してアラートメールの通知を設定するケースが多いと思います。

しかしながら送信されてくるアラートメール数が多いことに加え、内容が JSON 形式のため重要なメールを判別しにくい、というユーザー様のお声もいただきます。確かに以下のようなアラートメールが大量に来ると、対応に困ってしまいます。

img-000

そこで今回は、以下のようにアラートの内容を見やすく整形した上で Slack のチャンネルに通知できる仕組みを、CloudFormation テンプレートを利用して10分ほどで構築してみました!その手順をご紹介します。

img-010

前提条件

以下の準備ができている前提で進めます。

  • 通知用の Slack チャンネルを作成できている
  • Security Hub を有効化済みである

これから準備される方は、以下を参考にしてください。

https://slack.com/intl/ja-jp/help/articles/201402297-チャンネルを作成する

https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/securityhub-v2-enable.html

構築する内容

CloudFormation テンプレートを利用して、以下のリソースを一括で構築します。

img-001

今回のポイントとして、構成の複雑さと課金を極力避けるため、Lambda 関数は使用していません。
EventBridge の入力トランスフォーマー機能で JSON を整形して見やすくしています。下記記事を参考にさせていただきました。

https://dev.classmethod.jp/articles/security-hub-email-notifications-formatting-japanese-2025/

CloudFormation テンプレートの説明

CloudFormation のテンプレートは下記になります。
全文をコピーして、作業用PCに拡張子 .yaml のファイルとして保存してください。

テンプレートのコードはこちら
AWSTemplateFormatVersion: '2010-09-09'
Description: >
  Send AWS Security Hub findings to SNS using EventBridge
  with input transformers.

Parameters:

  # 通知送信先の E メール
  NotificationEmail:
    Type: String
    Default: ""
    Description: >
      (Optional) Email address to subscribe to the SNS topic.
      Example: security-alert@example.com
      Leave empty to skip email subscription.

  # 通知対象とする Security Hub の重要度
  SecurityHubSeverity:
    Type: String
    Default: "CRITICAL,HIGH"
    Description: >
      (Optional) Comma-separated list of Security Hub severity labels.
      Allowed values:
      CRITICAL,HIGH,MEDIUM,LOW,INFORMATIONAL
      Example: CRITICAL,HIGH

Conditions:
  HasEmailSubscription: !Not [!Equals [!Ref NotificationEmail, ""]]

Resources:

  # 通知用 SNS トピック  
  AlertSnsTopic:
    Type: AWS::SNS::Topic
    Properties:
      DisplayName: SecurityAlerts

  # SNS のサブスクリプション(Eメール)      
  AlertSnsSubscription:
    Type: AWS::SNS::Subscription
    Condition: HasEmailSubscription
    Properties:
      Protocol: email
      TopicArn: !Ref AlertSnsTopic
      Endpoint: !Ref NotificationEmail

  # EventBridge から SNS への通知を許可する IAM ロール      
  EventBridgeToSnsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: events.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: AllowPublishToSns
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: sns:Publish
                Resource: !Ref AlertSnsTopic

  # EventBridge ルール(入力トランスフォーマーによる整形付き)
  SecurityHubEventRule:
    Type: AWS::Events::Rule
    Properties:
      Description: Send Security Hub findings to SNS with transformer
      EventPattern:
        source:
          - aws.securityhub
        detail-type:
          - Security Hub Findings - Imported
        detail:
          findings:
            Severity:
              Label: !Split [",", !Ref SecurityHubSeverity]
      Targets:
        - Arn: !Ref AlertSnsTopic
          Id: SecurityHubToSns
          RoleArn: !GetAtt EventBridgeToSnsRole.Arn
          InputTransformer:
            InputPathsMap:
              account: "$.account"
              compliance: "$.detail.findings[0].Compliance.Status"
              controlid: "$.detail.findings[0].Compliance.SecurityControlId"
              description: "$.detail.findings[0].Description"
              firstObservedAt: "$.detail.findings[0].FirstObservedAt"
              id: "$.detail.findings[0].Id"
              label: "$.detail.findings[0].Severity.Label"
              lastObservedAt: "$.detail.findings[0].LastObservedAt"
              recommendationUrl: "$.detail.findings[0].Remediation.Recommendation.Url"
              recordState: "$.detail.findings[0].RecordState"
              resource: "$.detail.findings[0].Resources"
              time: "$.time"
              title: "$.detail.findings[0].Title"
              updatedAt: "$.detail.findings[0].UpdatedAt"
              workflowState: "$.detail.findings[0].WorkflowState"
            InputTemplate: |
              "タイトル: <title>"
              "対象アカウント: <account>"
              "時刻: <time>"
              "コントロール ID: <controlid>"
              "内容: <description>"
              "ワークフローステータス: <workflowState>"
              "コンプライアンス: <compliance>"
              "初回検知日時: <firstObservedAt>"
              "最終検知日時: <lastObservedAt>"
              "重要度ラベル: <label>"
              "対象リソース: <resource>"
              "レコードステータス: <recordState>"
              "更新日時: <updatedAt>"
              "参考URL: <recommendationUrl>"
              "ID: <id>"

Outputs:
  SnsTopicArn:
    Description: SNS Topic ARN for security alerts
    Value: !Ref AlertSnsTopic

■ オプション項目

  • 通知する Security Hub 検出結果の重要度
    Critical (重要)、High (高)、Medium (中)、Low (低) 、Informational (情報) の5段階から、カンマ区切りで通知対象を指定できます。

  • 通知先メールアドレス
    SNS トピックから通知を送信するメールアドレスを指定します。
    もちろん Slack チャンネルのメールアドレスだけではなく、通常のメアドも指定できます。

それでは以下に、実際に構築してみた際の手順をご紹介します!

やってみた

まず送信先の Slack チャンネルでチャンネル名をクリックして「インテグレーション > このチャンネルにメールを送信する」をクリックします。
img-002

初回は「メールアドレスを取得する」というボタンが表示されます。クリックするとメールアドレスが発行されるので、コピーしておきます。

img-003

次は AWS 側の操作です。
CloudFormation のコンソール画面で「スタックを作成 > 新しいリソースを使用」をクリックします。
次の画面で「テンプレートファイルのアップロード」を選択し、先ほどPCに保存した CloudFormation テンプレートの .yaml ファイルを選択します。

img-004

詳細画面で以下のように入力します。

  • スタック名
    分かりやすい名前でOKですが、ここは securityhub-alert-stackとします。

  • NotificationEmail
    先ほどコピーしておいた Slack チャンネルのEメールアドレスxxxx@xxxx.org.slack.com を指定します。

  • SecurityHubSeverity
    通知の重要度を選択します。ここはデフォルトのまま CRITICAL,HIGH を指定して "重要" と "高" のみを通知する設定にします。(あとから変更できます)

img-005

次の画面へ進み、IAM リソースが作成されることを承認するチェックを入れます。
※ EventBridge サービスから SNS トピックへの通知を許可する IAM ロールを作成するためです。

img-006

次の画面で内容を確認して「送信」をクリックします。

img-007

特にエラーがなければ、5分ほどで CloudFormation スタックの作成が完了します。作成されるリソースはシンプルに4つだけです。

img-008

この時点で Slack の通知先チャンネルを確認すると、SNS からサブスクライブの確認メールが届いているはずです。
通知内の「Confirm subscription」をクリックし、ポップアップ画面で「リンクを開く」をクリックすれば、サブスクライブ完了の画面が表示されます。

img-009

これで構築は完了です。
あとは Security Hub の検出結果が出るのを待っていれば Slack チャンネルに通知されます。

すぐに動作確認をしたい場合は、AWS CLI コマンドで擬似的に Security Hub の検出結果を作成してテストできます。
下記の CLI コマンドをコピーして、アカウント ID を実際のものに置き換えて、CloudShell 等から実行しましょう。(※ 架空のアカウント ID を入れるとコマンドが失敗します)

Security Hub の擬似テスト用 CLI コマンド
aws securityhub batch-import-findings --region ap-northeast-1 --findings '[
     {
       "SchemaVersion": "2018-10-08",
       "Id": "test-finding-'$(date +%s)'",
       "ProductArn": "arn:aws:securityhub:ap-northeast-1:アカウントID:product/アカウントID/default",
       "GeneratorId": "test-generator",
       "AwsAccountId": "アカウントID",
       "Types": ["Software and Configuration Checks"],
       "CreatedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
       "UpdatedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
       "FirstObservedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
       "LastObservedAt": "'$(date -u +%Y-%m-%dT%H:%M:%SZ)'",
       "Severity": {"Label": "CRITICAL"},
       "Title": "Test Finding for EventBridge Rule",
       "Description": "This is a test finding to verify EventBridge notification.",
       "Resources": [{"Type": "AwsEc2Instance", "Id": "arn:aws:ec2:ap-northeast-1:アカウントID:instance/i-test12345678"}],
       "Compliance": {
         "Status": "FAILED",
         "SecurityControlId": "EC2.99"
       },
       "RecordState": "ACTIVE",
       "Workflow": {"Status": "NEW"},
       "WorkflowState": "NEW",
       "Remediation": {
         "Recommendation": {
           "Text": "This is a test finding to verify EventBridge notification.",
           "Url": "https://docs.aws.amazon.com/console/securityhub/EC2.99/remediation"
         }
       }
     }
   ]'

CLI コマンドを実行すると Security Hub の擬似的な検出結果が作成され、Slack チャンネル上に整形されたフォーマットで通知されました!
記載されている参考URLから、この検出結果の意味や、どのような対処が必要かも確認できます。

img-010

※ 今回 CLI コマンドで出力した擬似検出結果 EC2.99 は架空のもので、参考ドキュメントには記載がありません。

今回試した内容は以上です。

さいごに

いかがでしたでしょうか。

これまで Security Hub のアラートメールをあまり活用できていなかった方も、文章を整形して Slack チャンネル一箇所にまとめて通知することで、確認がしやすくなると思います。

より高度に通知内容をカスタマイズするには Lambda 関数をはさんだり、Slack アプリケーションを作成して Webhook を利用するといった方法になると思いますが、今回はこのような手間をかけず、10分ほどで簡単に実装できる方法をご紹介しました。

この内容がお役に立てば幸いです!

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。
※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

FacebookHatena blogX

関連記事