EventBridgeを使用してCloudTrail経由でAWS APIコールのログを記録してみた。

2022.07.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

概要

この記事では、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 :

Log AWS API calls using EventBridge