この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
前回「Amazon EventBridgeでセキュリティグループの変更を検知してみる」を書きました。あってはならないことですが、ルートテーブルも変更されていることがあります。
ルートテーブルなどネットワークに関わる設定は、場合によって重大なインシデントを引き起こします。
今回の記事では、Amazon EventBridgeを使って、ルートテーブルの作成・変更・削除を検知する仕組みを紹介します。
Amazon EventBridgeでルートテーブルの変更を検知
構築の流れは以下の通りです。
- Amazon SNSトピック作成
- Amazon EventBridgeルール作成
■Amazon SNSトピック作成
検知した際に通知してくれるAmazon SNSトピックを作成します。
↓Amazon SNSコンソール画面に行きます。
↓左のコンソール画面から[トピック] 、[トピックの作成]をクリックします。
↓[タイプ]を[スタンダード]を選択し、[名前]・[表示名]を入力します。
項目 | 設定値 |
---|---|
名前 | saitou-test-topic |
表示名 | ルートテーブル変更検知 |
↓[トピックの作成] をクリックします。
↓トピックの一覧から、作成したトピックを選択します。[サブスクリプション]タブから[サブスクリプションの作成] をクリックしてください。
↓[プロトコル]で、[Eメール]を選択します。[エンドポイント]で、通知を受け取るEメールアドレスを入力し、[サブスクリプションの作成]を押してください。
↓入力したメールアドレスに確認メールが来るので、メール本文にある[Confirm subscription]をクリックします。
↓
Amazon SNSトピックの作成は以上です。
■Amazon EventBridgeルール作成
ルートテーブルが作成・変更・削除される際のAPIコールをトリガーにAmazon SNSに通知を送信するためのAmazon EventBridgeルールを作成します。
↓Amazon EventBridgeコンソール画面にいきます。
↓左のナビゲーションペインから[ルール]をクリックし、[ルールを作成]を押します。
↓ルールの [名前]を入力します。[説明]は任意で入力します。[イベントパス]はdefault、[ルールタイプ]は[イベントパターンを持つルール]を選択し、[次へ]をクリックします。
項目 | 設定値 |
---|---|
名前 | saitou-test-rule-routetable-change |
説明 | 任意 |
↓[イベントソース]を[AWS イベントまたは EventBridge パートナーイベント]を選択します。
↓[作成のメソッド]で[パターンフォームを使用する]を選択します。
↓[イベントソース]で、[AWSサービス]を選択し、[AWSのサービス]で、[EC2]を選択します。
↓[イベントタイプ]で、[AWS API Call via CloudTrail] を選択します。
↓[特定のオペレーション]を選択し、以下のAPIコールを一つずつ追加していきます。
- CreateRoute:ルートテーブルにルートを作成
- DeleteRoute:ルートテーブルから指定されたルートを削除
- CreateRouteTable:ルートテーブルを作成
- DeleteRouteTable:ルートテーブルを削除
- AssociateRouteTable:ルートテーブルをサブネットに関連付け
- DisassociateRouteTable:ルートテーブルをサブネットから関連付けを解除
↓入力が完了したら、[次へ]をクリックします。
↓[ターゲットタイプ]で[AWSのサービス]を選択し、[ターゲットを選択]で[SNSトピック]を選択、[トピック]で作成したトピックを選択します。
↓[追加設定]で[ターゲット入力を設定]から[入力トランスフォーマー]を選択し、[入力トランスフォーマーを設定]をクリックします。
↓[ターゲット入力トランスフォーマー]の[入力パス]で以下を入力します。
{
"requestParameters": "$.detail.requestParameters",
"userName": "$.detail.userIdentity.userName",
"eventID": "$.detail.eventID",
"eventName1": "$.detail.eventName",
"eventName2": "$.detail.userIdentity.eventName",
"eventTime": "$.detail.eventTime",
"accountId": "$.account",
"routeTableId1": "$.detail.responseElements.routeTable.routeTableId",
"routeTableId2": "$.detail.requestParameters.routeTableId",
"awsRegion": "$.region"
}
↓[テンプレート]で以下を入力します。
"ルートテーブルで以下のイベントが発生しました。"
"イベント名 : <eventName1> <eventName2> "
"イベントID : <eventID> "
"ルートテーブルID : <routeTableId1> <routeTableId2> "
"発生アカウントID : <accountId> "
"発生時間 : <eventTime> UTC "
"発生リージョン : <awsRegion> "
"ユーザーID : <userName> "
"変更内容 : <requestParameters> "
"※作成・削除の場合、変更内容は空白です。"
↓入力が完了したら、[確認]します。
↓[次へ]をクリックします。
↓[タグ]は任意で設定し、[次へ]をクリックします。
↓問題なければ、[ルールの作成]をクリックします。
構築は以上です。
■動作確認
動作確認をしていきます。今回トリガーになるAPIコールは以下の通りです。作成・変更・削除作業を行い、通知が来るのか試してみましょう。
- CreateRoute:ルートテーブルにルートを作成
- DeleteRoute:ルートテーブルから指定されたルートを削除
- CreateRouteTable:ルートテーブルを作成
- DeleteRouteTable:ルートテーブルを削除
- AssociateRouteTable:ルートテーブルをサブネットに関連付け
- DisassociateRouteTable:ルートテーブルをサブネットから関連付けを解除
1,ルートテーブル作成
まずはルートテーブルを作成します。
項目 | 設定値 |
---|---|
ルートテーブル名 | saitou-test-change-notification-rtb |
作成しましたら、メールボックスを見てみましょう。
来てますね。
2,ルートテーブルにルートを作成
作成したルートテーブルにルートを作成します。
作成しましたら、メールボックスを見てみましょう。
3,ルートを削除
作成したルートテーブルから指定されたルートを削除します。
↓
4,サブネット関連付け
作成したルートテーブルをサブネットに関連付けしてみます。
↓
↓
5,サブネット関連解除
作成したルートテーブルをサブネットから関連付けを解除してみます。
↓
↓
7,ルートテーブル削除
さいごに、ルートテーブルを削除します。
↓
確認は以上です。
■おまけ
AWSTemplateFormatVersion: "2010-09-09"
Description:
Create SNS,EventBridge
Parameters:
myMailAddress:
Type: String
Resources:
mySNSTopic:
Type: AWS::SNS::Topic
Properties:
TopicName: !Sub ${AWS::StackName}-topic
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-topic
mySubscription:
Type: AWS::SNS::Subscription
Properties:
Endpoint: !Ref myMailAddress
Protocol: email
TopicArn: !Ref mySNSTopic
myEventRule:
Type: AWS::Events::Rule
Properties:
Name: !Sub ${AWS::StackName}-rule
Description: "EventRule"
EventPattern: |
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["ec2.amazonaws.com"],
"eventName": ["CreateRoute", "DeleteRoute", "CreateRouteTable", "DeleteRouteTable", "AssociateRouteTable", "DisassociateRouteTable"]
}
}
Targets:
-
Arn:
Ref: "mySNSTopic"
Id: "myTopic001"
InputTransformer:
InputPathsMap:
"requestParameters": "$.detail.requestParameters",
"userName": "$.detail.userIdentity.userName",
"eventID": "$.detail.eventID",
"eventName1": "$.detail.eventName",
"eventName2": "$.detail.userIdentity.eventName",
"eventTime": "$.detail.eventTime",
"accountId": "$.account",
"routeTableId1": "$.detail.responseElements.routeTable.routeTableId",
"routeTableId2": "$.detail.requestParameters.routeTableId",
"awsRegion": "$.region"
InputTemplate: |
"ルートテーブルで以下のイベントが発生しました。"
"イベント名 : <eventName1> <eventName2> "
"イベントID : <eventID> "
"ルートテーブルID : <routeTableId1> <routeTableId2> "
"発生アカウントID : <accountId> "
"発生時間 : <eventTime> UTC "
"発生リージョン : <awsRegion> "
"ユーザーID : <userName> "
"変更内容 : <requestParameters> "
"※作成・削除の場合、変更内容は空白です。"
EventTopicPolicy:
Type: 'AWS::SNS::TopicPolicy'
Properties:
PolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: events.amazonaws.com
Action: 'sns:Publish'
Resource: '*'
Topics:
- !Ref mySNSTopic
Outputs:
myEventRuleArn:
Value: !GetAtt myEventRule.Arn
Export:
Name: !Sub ${AWS::StackName}-rule
mySNSTopicArn:
Value: !GetAtt mySNSTopic.TopicArn
Export:
Name: !Sub ${AWS::StackName}-topic
まとめ:Amazon EventBridgeでルートテーブルの変更を検知してみる
ルートテーブルはネットワークトラフィックの送信先を制御する役割を担っています。
ルートテーブルの変更は意図しない通信を招き、最悪システムが動作しなくなるかもしれません。もしルートテーブルが変更されたら、即対応できるようにしておきたいですよね。
TransitGatewayルートテーブルの変更検知にも応用できますので、次回の記事で紹介します。
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーもAmazon EventBridgeに関する記事を公開しています。ぜひ参考にしてみてください。
■EventBridgeとLambdaを使用してRDS自動停止を作成する(watanabe)
https://cloud5.jp/autostop-rds/
■APIGateway + Lambda + DynamoDB を利用したサーバレス構築ハンズオン(INAMURA)
https://cloud5.jp/apigateway-lambda-dynamodb-serverless/
■『タグなしポイ捨てリソース、ダメ絶対!!』Config非準拠判定でSNSメール通知構築ハンズオン(INAMURA)
https://cloud5.jp/sns-notification-at-config/