📝

[小ネタ] AWS CLI で CloudTrail Lake を使用してみた

2025/02/01に公開

CloudTrail Lake で色々なクエリを試してみた
今回は AWS CLI でやってみました。

Run and manage CloudTrail Lake queries with the AWS CLI - AWS CloudTrail

AWS CLI の実行環境は CloudShell です。

コマンド実行フロー

  1. start-query コマンドでクエリを実行
  2. describe-query コマンドでクエリのメタデータを取得
  3. get-query-results コマンドでクエリ結果を取得

最新の記録を 1 件だけ取得

AWS CLI で取得した結果をフィルタリングしない場合、可視性が悪かったので取得件数は 1 件のみにしました。

$ aws cloudtrail start-query \
--query-statement 'SELECT * FROM {event-data-store-id} LIMIT 1;'

{
    "QueryId": "04123eab-c1e6-43ee-8fcc-c31e8938fbd3"
}
$ aws cloudtrail describe-query \
--query-id 04123eab-c1e6-43ee-8fcc-c31e8938fbd3

{
    "QueryId": "04123eab-c1e6-43ee-8fcc-c31e8938fbd3",
    "QueryString": "SELECT * FROM 59aaa722-ff93-415c-8007-62464a40fc67 LIMIT 1;",
    "QueryStatus": "FINISHED",
    "QueryStatistics": {
        "EventsMatched": 1,
        "EventsScanned": 7,
        "BytesScanned": 118750,
        "ExecutionTimeInMillis": 1485,
        "CreationTime": "2025-01-26T12:02:56.228000+00:00"
    }
}
$ aws cloudtrail get-query-results \
--query-id 04123eab-c1e6-43ee-8fcc-c31e8938fbd3
レスポンス
{
    "QueryStatus": "FINISHED",
    "QueryStatistics": {
        "ResultsCount": 1,
        "TotalResultsCount": 1,
        "BytesScanned": 118750
    },
    "QueryResultRows": [
        [
            {
                "eventVersion": "1.08"
            },
            {
                "userIdentity": "{type=AssumedRole, principalid=xxx:ConfigResourceCompositionSession, arn=arn:aws:sts::012345678901:assumed-role/AWSServiceRoleForConfig/ConfigResourceCompositionSession, accountid=012345678901, accesskeyid=xxx, username=null, sessioncontext={attributes={creationdate=2025-01-26 07:44:00.000, mfaauthenticated=false}, sessionissuer={type=Role, principalid=xx, arn=arn:aws:iam::012345678901:role/aws-service-role/config.amazonaws.com/AWSServiceRoleForConfig, accountid=012345678901, username=AWSServiceRoleForConfig}, webidfederationdata=null, sourceidentity=null, ec2roledelivery=null, ec2issuedinvpc=null, assumedroot=null}, invokedby=config.amazonaws.com, identityprovider=null, credentialid=null, onbehalfof=null, inscopeof=null}"
            },
            {
                "eventTime": "2025-01-26 07:44:00.000"
            },
            {
                "eventSource": "ses.amazonaws.com"
            },
            {
                "eventName": "ListConfigurationSets"
            },
            {
                "awsRegion": "ap-northeast-1"
            },
            {
                "sourceIPAddress": "config.amazonaws.com"
            },
            {
                "userAgent": "config.amazonaws.com"
            },
            {
                "errorCode": ""
            },
            {
                "errorMessage": ""
            },
            {
                "requestParameters": "{pageSize=1000}"
            },
            {
                "responseElements": ""
            },
            {
                "additionalEventData": ""
            },
            {
                "requestID": "53214a84-c36a-4a0a-b8b1-d7bb42d295d7"
            },
            {
                "eventID": "a5833530-f8e9-4093-8bfd-813acaf743f5"
            },
            {
                "readOnly": "true"
            },
            {
                "resources": ""
            },
            {
                "eventType": "AwsApiCall"
            },
            {
                "apiVersion": ""
            },
            {
                "managementEvent": "true"
            },
            {
                "recipientAccountId": "012345678901"
            },
            {
                "sharedEventID": ""
            },
            {
                "annotation": ""
            },
            {
                "vpcEndpointId": ""
            },
            {
                "vpcEndpointAccountId": ""
            },
            {
                "serviceEventDetails": ""
            },
            {
                "addendum": ""
            },
            {
                "edgeDeviceDetails": ""
            },
            {
                "insightDetails": ""
            },
            {
                "eventCategory": "Management"
            },
            {
                "tlsDetails": ""
            },
            {
                "sessionCredentialFromConsole": ""
            }
        ]
    ]
}

クエリ結果の情報量が多いので用途に合わせてクエリを変更するか、クエリ結果をフィルタリングした方がよさそうです。

例. sourceIPAddress のみを抽出する場合

  • クエリを変更する
$ aws cloudtrail start-query \
--query-statement 'SELECT sourceIPAddress FROM {event-data-store-id} LIMIT 1;'

{
    "QueryId": "bb2f2605-f471-4271-bde2-2a2f0870399a"
}

$ aws cloudtrail get-query-results \
--query-id bb2f2605-f471-4271-bde2-2a2f0870399a

{
    "QueryStatus": "FINISHED",
    "QueryStatistics": {
        "ResultsCount": 1,
        "TotalResultsCount": 1,
        "BytesScanned": 128631
    },
    "QueryResultRows": [
        [
            {
                "sourceIPAddress": "resource-explorer-2.amazonaws.com"
            }
        ]
    ]
}
  • クエリ結果をフィルタリングする
aws cloudtrail get-query-results \
--query-id 04123eab-c1e6-43ee-8fcc-c31e8938fbd3 | jq -r '.QueryResultRows[0][] | select(.sourceIPAddress) | .sourceIPAddress'

config.amazonaws.com

まとめ

今回は AWS CLI で CloudTrail Lake を使用してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion