EventBridgeを使用してCloudTrail経由でAWS APIコールのログを記録してみた。
概要
この記事では、EventBridgeを使用してCloudTrail経由でAWS APIコールのログを記録してみました。ここでは、EC2インスタンスの状態が変化したときにLambda関数を呼び出すEventBridgeルールを作成しました。Lambda関数は、イベントをCloudWatch Logsに記録します。
作成するリソース:
- S3バケット
- CloudTrail trail
- Lambda 関数
- EventBridge ルール
- EC2インスタンス
やってみた
S3バケットの作成
- 次の設定でS3バケットを作成しておきます。
- バケット名 : バケット名を入力します。
- AWS リージョン : us-east-1
- 他の設定はデフォルトのままにします。
CloudTrail trailの作成
- CloudTrailのコンソールで、[Create trail]をクリックしておきます。
- Trail nameを入力して、以前に作成したS3バケットをStorage locationとして選択しておきます。
- [Log file SSE-KMS encryption]を無効にして、他の設定はデフォルトのままにして、Trailを作成しておきます。
- コンソールで、Trailが作成されていることを確認できます。
Lambda 関数の作成
- 関数名を入力して、Runtimeで Node.js 16.x を選択して、Lambda 関数を作成しておきます。
- 既存のLambdaコードを次のコードに置き換えます。
exports.handler = (event, context, callback){ console.log('LogAPICalls'); console.log('Received event:', JSON.stringify(event, null, 2)); callback(null, 'Finished'); };
EventBridge ルールの作成
- EventBridge コンソールのナビゲーションペインで [Rules] を選択しておきます。
- [Create rule]をクリックしておきます。
- ルール名を入力し、[Rule with an event pattern]としてルールタイプを選択しておきます。
- イベントソースとして[AWS events or EventBridge partner events]を選択しておきます。
- 次の設定でイベントパターンを定義しておきます。
- Event source : AWS services
- AWS service : EC2
- Event type : AWS API Call via CloudTrail
- [Any operation]を選択しておきます。
- ターゲットの詳細を入力しておきます。
- Target types: AWS service
- Target : Lambda Function
- Function: 以前に作成したLambda関数を選択しておきます。
テストする
- この設定で EC2インスタンスを作成しておきます。
- AMI : Amazon Linux 2 AMI
- インスタンスタイプ : t2.micro
- サブネット:パブリックサブネット
- EC2インスタンスの状態[Start, Stop, Terminate, Reboot]を変更すると、Lambda関数はイベントをログに記録します。
- CloudWatch Logsで、イベントがログに記録されていることを確認できます。
- イベントはJSON形式でログに記録されます。
[StartInstances] Event Log
event: { "version": "0", "id": "...........", "detail-type": "AWS API Call via CloudTrail", "source": "aws.ec2", "account": "xxxxxxxxxxx", "time": "2022-07-29T05:36:59Z", "region": "us-east-1", "resources": [], "detail": {........... }, "eventTime": "2022-07-29T05:36:59Z", "eventSource": "ec2.amazonaws.com", "eventName": "StartInstances", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "instancesSet": { "items": [ { "instanceId": "i-000000000000" } ] } }, "responseElements": { "requestId": "...........", "instancesSet": { "items": [ { "instanceId": "i-00000000000000", "currentState": { "code": 0, "name": "pending" }, "previousState": { "code": 80, "name": "stopped" } } ] } },......... }
[StopInstances] Event Log
event: { "version": "0", "id": "...........", "detail-type": "AWS API Call via CloudTrail", "source": "aws.ec2", "account": "xxxxxxxxxxx", "time": "2022-07-29T05:36:59Z", "region": "us-east-1", "resources": [], "detail": {........... }, "eventTime": "2022-07-29T05:36:59Z", "eventSource": "ec2.amazonaws.com", "eventName": "StopInstances", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "instancesSet": { "items": [ { "instanceId": "i-000000000000" } ] } }, "responseElements": { "requestId": "...........", "instancesSet": { "items": [ { "instanceId": "i-00000000000000", "currentState": { "code": 0, "name": "stopping" }, "previousState": { "code": 80, "name": "running" } } ] } },......... }
[TerminateInstances] Event Log
event: { "version": "0", "id": "...........", "detail-type": "AWS API Call via CloudTrail", "source": "aws.ec2", "account": "xxxxxxxxxxx", "time": "2022-07-29T05:36:59Z", "region": "us-east-1", "resources": [], "detail": {........... }, "eventTime": "2022-07-29T05:36:59Z", "eventSource": "ec2.amazonaws.com", "eventName": "TerminateInstances", "awsRegion": "us-east-1", "sourceIPAddress": "AWS Internal", "userAgent": "AWS Internal", "requestParameters": { "instancesSet": { "items": [ { "instanceId": "i-000000000000" } ] } }, "responseElements": { "requestId": "...........", "instancesSet": { "items": [ { "instanceId": "i-00000000000000", "currentState": { "code": 0, "name": "shutting-down" }, "previousState": { "code": 80, "name": "running" } } ] } },......... }
まとめ
EventBridgeを使用してCloudTrail経由でAWS APIコールのログを記録してみました。特定の API コールのみをログに記録するように EventBridge ルールを作成することもできます。
Reference :