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