AWS

EventBridgeルールにマッチしたAWS ConfigデータをSNS経由でメール通知する

スポンサーリンク
EventBridgeルールにマッチしたAWS ConfigデータをSNS経由でメール通知する AWS
スポンサーリンク
スポンサーリンク

AWS Configのリソース変更履歴データの中から、EventBridgeルールにマッチしたものだけをSNS経由でメール通知する

以下のページで、AWS Configのリソース変更履歴データを、SNS経由でメールする方法をご紹介しました。

ただし上記ページの構成ですと、リソースに変更が起きる度にメールが届くことになります。

そこで今回は、EventBridgeルールを使用して、特定のイベントが発生した場合のみ、メール通知する構成を作成します。

構築する環境

Diagram of email notification via SNS of AWS Config data matching EventBridge rules

構成は冒頭にご紹介したページと概ね同様です。
唯一異なる点は、AWS ConfigとSNSの間に、EventBridgeを挟む点です。

EventBridgeルールですが、S3バケットのSSEに関する設定が無効化された際のイベントが発生した場合、メール通知するように設定します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/103

テンプレートファイルのポイント解説

基本的には冒頭でご紹介したページと同様です。

本ページでは、AWS ConfigデータをEventBridgeで受け取り、SNS経由でメール通知します。

SNSトピック

Resources:
  Topic:
    Type: AWS::SNS::Topic
    Properties:
      Subscription: 
        - Endpoint: !Ref MailAddress
          Protocol: email
      TopicName: !Ref Prefix
Code language: YAML (yaml)

SNSトピックを作成し、サブスクライバーとしてメールアドレスを指定します。

詳細につきましては、以下のページをご確認ください。

AWS Config

Resources:
  DeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties: 
      Name: !Sub "${Prefix}-DeliveryChannel"
      S3BucketName: !Ref ConfigBucket
      
  ConfigurationRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties: 
      Name: !Sub "${Prefix}-ConfigurationRecorder"
      RecordingGroup: 
        AllSupported: false
        IncludeGlobalResourceTypes: false
        ResourceTypes: 
          - AWS::S3::Bucket
      RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/${AWSServiceRoleForConfig}"
        
  AWSServiceRoleForConfig:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Delete
    Properties: 
      AWSServiceName: config.amazonaws.com
Code language: YAML (yaml)

AWS ConfigデータをEventBridgeに配信する上で、特別な設定は不要です。

AWS Configに関する基本的な事項については、以下のページをご確認ください。

今回はS3バケットに関するデータを収集するように設定します。

EventBridgeルール

Resources:
  EventsRule:
    Type: AWS::Events::Rule
    Properties: 
      EventBusName: !Ref EventBusName
      EventPattern:
        source:
          - aws.config
        detail-type:
          - Config Configuration Item Change
        detail:
          messageType:
            - ConfigurationItemChangeNotification
          configurationItem:
            resourceType:
              - AWS::S3::Bucket
          configurationItemDiff:
            changedProperties:
              SupplementaryConfiguration.ServerSideEncryptionConfiguration:
                changeType:
                  - DELETE
      Name: !Sub "${Prefix}-EventsRule"
      State: ENABLED
      Targets: 
        - Arn: !Ref TopicArn
          Id: !Ref TopicName
          InputTransformer: 
            InputPathsMap: 
              "awsRegion": "$.detail.configurationItem.awsRegion"
              "awsAccountId": "$.detail.configurationItem.awsAccountId"
              "resource_ID": "$.detail.configurationItem.resourceId"
              "configurationItemCaptureTime": "$.detail.configurationItem.configurationItemCaptureTime"
            InputTemplate: |
              "On <configurationItemCaptureTime> S3 Bucket <resource_ID> recorded a deletion of ServerSideEncryptionConfiguration in the account <awsAccountId> region <awsRegion>."
Code language: YAML (yaml)

AWS ConfigデータをEventBridgeルールで扱う場合、2つのプロパティがポイントです。

1つ目はEventPatternプロパティです。
以下のページを参考に、受け取るデータの各種パラメータを指定します。

AWS Config でリソースが作成されたときにカスタム E メール通知を受け取る
新しい AWS リソースが作成されたときにサービスイベントタイプで開始する Amazon EventBridge ルールを作成しました。ただし、レスポンスは JSON 形式です。カスタム通知を E メールで受け取るにはどうすればよいですか?

「source」、「detail-type」、「messageType」の値は、上記ページと同一です。
「configurationItemDiff」については、SSE設定が無効化された際に生成されるイベントデータを参考に設定しました。
以下に該当箇所を抜粋して記載します。

{
  "detail": {
    "recordVersion": "1.3",
    "messageType": "ConfigurationItemChangeNotification",
    "configurationItemDiff": {
      "changedProperties": {
        "SupplementaryConfiguration.ServerSideEncryptionConfiguration": {
          "previousValue": {
            "rules": [
              {
                "applyServerSideEncryptionByDefault": {
                  "sseAlgorithm": "AES256"
                },
                "bucketKeyEnabled": false
              }
            ]
          },
          "changeType": "DELETE"
        }
      },
      "changeType": "UPDATE"
    },
    ...
  }
}
Code language: JSON / JSON with Comments (json)

つまりsourceやdetail-type等に加えて、configurationItemDiff.changedProperties.SupplementaryConfiguration.ServerSideEncryptionConfiguration.changeTypeの項目が存在し、かつその値が「DELETE」の場合、条件を満たすデータであるということになります。

EventBridgeとSNSを連携させるためには、EventBridgeに対して、SNSにメッセージをパブリッシュする権限を与える必要があります。

Resources:
  TopicPolicy:
    Type: AWS::SNS::TopicPolicy
    Properties: 
      PolicyDocument:
        Statement:
          - Principal:
              Service: events.amazonaws.com
            Action: sns:Publish
            Effect: Allow
            Resource: !Ref TopicArn
      Topics: 
        - !Ref TopicArn
Code language: YAML (yaml)

EventBridgeにSNS関係のアクセス権限を与えるためには、リソースベースポリシーを利用します。

詳細に関しましては、以下のページをご確認ください。

(参考)S3バケット

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${Prefix}-encryption-enabled"
      AccessControl: Private
      BucketEncryption:
        ServerSideEncryptionConfiguration:
          - ServerSideEncryptionByDefault:
              SSEAlgorithm: AES256
Code language: YAML (yaml)

検証用リソースとしてS3バケットを用意します。
SSEを有効化します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • SNSトピック:fa-103
  • EventBridgeルール:fa-103-EventRule
  • 検証用バケット:fa-103-encryption-enabled

メールアドレスの認証

SNSトピックのサブスクライバーとしてメールアドレスを指定した場合、そのメールアドレスを認証する必要があります。
指定したメールアドレスに、以下のような認証メールが送られてきます。

Detail of SNS 1.

「Confirm subscription」を押下して、認証を進めます。

Detail of SNS 2.

上記のページが表示されて、認証が完了したことがわかります。

リソース確認

AWS Management Consoleから各リソースを確認します。
まずSNSトピックを確認します。

Detail of SNS 3.
Detail of SNS 4.
Detail of SNS 5.

正常にSNSトピックが作成されていることがわかります。

加えて、サブスクライバーとして登録したメールアドレスが登録されていることもわかります。
またこのメールアドレスのStatusの値を見ると「Confirmed」とあり、認証が完了していることもわかります。

そしてアクセスポリシーを見ると、EventBridgeから本トピックに対するメッセージのパブリッシュが許可されていることがわかります。

AWS Configの設定を確認します。

Detail of AWS Config 1.

AWS Configが正常に動作し、データの収集が開始されていることがわかります。

Delivery methodのSNSに関する項目を見ると、設定が行われていないことがわかります。
このことから、AWS ConfigとSNSが直接統合していないことがわかります。

EventBridgeを確認します。

Detail of EventBridge 1.
Detail of EventBridge 2.
Detail of EventBridge 3.
Detail of EventBridge 4.

EventBridgeルールが正常に作成されていることがわかります。

Event Patternを見ると、CloudFormationテンプレート通りにパターンが定義されていることがわかります。
つまりAWS ConfigからS3バケットのSSE設定の削除に関するイベントデータが送られた場合、条件を満たすということになります。

Targetを見ると、先ほどのSNSトピックが指定されていることがわかります。
つまり先述のパターンを満たすイベントデータが送られた場合、SNS経由でメール通知されるということです。

Input transformerを見ると、メールで送る文字列のテンプレートと、埋め込むパラメータが定義されています。

検証用S3バケットを確認します。

Detail of S3 1.

確かにSSE設定が有効化されていることがわかります。

動作確認

準備が整いましたので、実際の動作を確認します。

S3バケットのSSE設定を無効化します。

Detail of S3 2.

しばらく待つと、以下のメールが届きました。

Detail of SNS 6.

メールの本文は、確かにInput Transformerで指定した通りのテンプレートに、各種パラメータが埋め込まれた文字列です。

S3バケットにおいてSSE設定が無効化されたことを受けて、AWS Configによってイベントデータが生成されました。
このイベントデータはEventBridgeルールの条件を満たすものだったため、ターゲットであるSNSトピックにイベントデータが転送されました。
イベントデータの一部を使用してメッセージが作成され、SNSサブスクライバーであるメールアドレス宛にメッセージが送信されました。

まとめ

EventBridgeルールを使用して、特定のイベントが発生した場合のみ、メール通知する構成をご紹介しました。

タイトルとURLをコピーしました