AWS Configのリソース変更履歴データの中から、EventBridgeルールにマッチしたものだけをSNS経由でメール通知する
以下のページで、AWS Configのリソース変更履歴データを、SNS経由でメールする方法をご紹介しました。
ただし上記ページの構成ですと、リソースに変更が起きる度にメールが届くことになります。
そこで今回は、EventBridgeルールを使用して、特定のイベントが発生した場合のみ、メール通知する構成を作成します。
構築する環境
構成は冒頭にご紹介したページと概ね同様です。
唯一異なる点は、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プロパティです。
以下のページを参考に、受け取るデータの各種パラメータを指定します。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/config-email-resource-created/
「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トピックのサブスクライバーとしてメールアドレスを指定した場合、そのメールアドレスを認証する必要があります。
指定したメールアドレスに、以下のような認証メールが送られてきます。
「Confirm subscription」を押下して、認証を進めます。
上記のページが表示されて、認証が完了したことがわかります。
リソース確認
AWS Management Consoleから各リソースを確認します。
まずSNSトピックを確認します。
正常にSNSトピックが作成されていることがわかります。
加えて、サブスクライバーとして登録したメールアドレスが登録されていることもわかります。
またこのメールアドレスのStatusの値を見ると「Confirmed」とあり、認証が完了していることもわかります。
そしてアクセスポリシーを見ると、EventBridgeから本トピックに対するメッセージのパブリッシュが許可されていることがわかります。
AWS Configの設定を確認します。
AWS Configが正常に動作し、データの収集が開始されていることがわかります。
Delivery methodのSNSに関する項目を見ると、設定が行われていないことがわかります。
このことから、AWS ConfigとSNSが直接統合していないことがわかります。
EventBridgeを確認します。
EventBridgeルールが正常に作成されていることがわかります。
Event Patternを見ると、CloudFormationテンプレート通りにパターンが定義されていることがわかります。
つまりAWS ConfigからS3バケットのSSE設定の削除に関するイベントデータが送られた場合、条件を満たすということになります。
Targetを見ると、先ほどのSNSトピックが指定されていることがわかります。
つまり先述のパターンを満たすイベントデータが送られた場合、SNS経由でメール通知されるということです。
Input transformerを見ると、メールで送る文字列のテンプレートと、埋め込むパラメータが定義されています。
検証用S3バケットを確認します。
確かにSSE設定が有効化されていることがわかります。
動作確認
準備が整いましたので、実際の動作を確認します。
S3バケットのSSE設定を無効化します。
しばらく待つと、以下のメールが届きました。
メールの本文は、確かにInput Transformerで指定した通りのテンプレートに、各種パラメータが埋め込まれた文字列です。
S3バケットにおいてSSE設定が無効化されたことを受けて、AWS Configによってイベントデータが生成されました。
このイベントデータはEventBridgeルールの条件を満たすものだったため、ターゲットであるSNSトピックにイベントデータが転送されました。
イベントデータの一部を使用してメッセージが作成され、SNSサブスクライバーであるメールアドレス宛にメッセージが送信されました。
まとめ
EventBridgeルールを使用して、特定のイベントが発生した場合のみ、メール通知する構成をご紹介しました。