kakakakakku blog

Weekly Tech Blog: Keep Learning!

DuckDB で CloudTrail 証跡をクエリする

AWS CloudTrail 証跡をアドホックにサクッと分析したいな〜という場面があって DuckDB を使ってみた🦆

もちろん AWS CloudTrail LakeAmazon Athena を使う選択肢もあるけど,せっかく Amazon S3 にデータ (.json.gz) があるんだし,もっと気軽にクエリできても良いのでは❗️と思って DuckDB を選んだ.

$ duckdb --version
v1.3.2 (Ossivalis) 0b83e5d2f6

シークレットを登録する

まずは DuckDB を起動して,CREATE SECRET コマンド(もしくは CREATE OR REPLACE SECRET コマンド)で Amazon S3 にアクセスするためのシークレットを登録しておく.

⚫◗ CREATE OR REPLACE SECRET secret (
    TYPE s3,
    PROVIDER credential_chain,
    CHAIN config,
    PROFILE 'xxxxx'
);
┌─────────┐
│ Success │
│ boolean │
├─────────┤
│ true    │
└─────────┘

duckdb.org

テーブルを作る

次に CREATE TABLE AS SELECT (CTAS) コマンドで AWS CloudTrail 証跡テーブル events を作る.今回はプレフィックスで範囲を限定して「2025年7月」のみにした📅 取得するフィールドはドキュメントを参考に代表的なものを選んだ.

docs.aws.amazon.com

docs.aws.amazon.com

⚫◗ CREATE TABLE events AS
    SELECT
        record.eventTime::TIMESTAMP AS eventTime,
        record.eventSource,
        record.eventName,
        record.awsRegion,
        record.userIdentity,
        record.eventType,
        record.requestParameters
    FROM (
        SELECT unnest(Records) as record
        FROM read_json('s3://aws-cloudtrail-logs-000000000000-xxxxxxxx/AWSLogs/000000000000/CloudTrail/ap-northeast-1/2025/07/*/000000000000_CloudTrail_ap-northeast-1_*.json.gz', ignore_errors=true)
    );

duckdb.org

クエリを実行する

あとは自由にクエリを実行する❗️

eventSource 別カウント

ちょうど7月に ECS Blue/Green デプロイの検証ecspresso x ECS Blue/Green デプロイの検証 をしていて elasticloadbalancing.amazonaws.comecs.amazonaws.com のカウントが増えている📈

⚫◗ SELECT eventSource, awsRegion, COUNT(*) AS COUNT
    FROM events
    GROUP BY eventSource, awsRegion
    ORDER BY COUNT DESC;
┌──────────────────────────────────────────┬────────────────┬───────┐
│               eventSource                │   awsRegion    │ COUNT │
│                 varcharvarchar     │ int64 │
├──────────────────────────────────────────┼────────────────┼───────┤
│ kms.amazonaws.com                        │ ap-northeast-114847 │
│ elasticloadbalancing.amazonaws.com       │ ap-northeast-111297 │
│ ecs.amazonaws.com                        │ ap-northeast-15109 │
│ ec2.amazonaws.com                        │ ap-northeast-13013 │
│ sts.amazonaws.com                        │ ap-northeast-12559 │
│ arc-zonal-shift.amazonaws.com            │ ap-northeast-12398 │
│ s3.amazonaws.com                         │ ap-northeast-12235 │
│ lambda.amazonaws.com                     │ ap-northeast-11488 │
│ autoscaling.amazonaws.com                │ ap-northeast-1407 │
│ cloudformation.amazonaws.com             │ ap-northeast-1396 │
│ logs.amazonaws.com                       │ ap-northeast-1382 │
│ notifications.amazonaws.com              │ ap-northeast-1279 │
│ tagging.amazonaws.com                    │ ap-northeast-1154 │
│ apigateway.amazonaws.com                 │ ap-northeast-159 │
│ schemas.amazonaws.com                    │ ap-northeast-133 │
│ iotsecuredtunneling.amazonaws.com        │ ap-northeast-124 │
│ cloudtrail.amazonaws.com                 │ ap-northeast-118 │
│ servicecatalog-appregistry.amazonaws.com │ ap-northeast-116 │
│ monitoring.amazonaws.com                 │ ap-northeast-116 │
│ sns.amazonaws.com                        │ ap-northeast-112 │
│ ecr.amazonaws.com                        │ ap-northeast-112 │
│ securityhub.amazonaws.com                │ ap-northeast-111 │
│ resource-explorer-2.amazonaws.com        │ ap-northeast-110 │
│ events.amazonaws.com                     │ ap-northeast-19 │
│ servicediscovery.amazonaws.com           │ ap-northeast-17 │
│ compute-optimizer.amazonaws.com          │ ap-northeast-16 │
│ bedrock.amazonaws.com                    │ ap-northeast-16 │
│ codepipeline.amazonaws.com               │ ap-northeast-15 │
│ acm.amazonaws.com                        │ ap-northeast-15 │
│ config.amazonaws.com                     │ ap-northeast-15 │
│ signin.amazonaws.com                     │ ap-northeast-14 │
│ acm-pca.amazonaws.com                    │ ap-northeast-12 │
│ sqs.amazonaws.com                        │ ap-northeast-12 │
│ access-analyzer.amazonaws.com            │ ap-northeast-11 │
│ route53resolver.amazonaws.com            │ ap-northeast-11 │
├──────────────────────────────────────────┴────────────────┴───────┤
│ 35 rows                                                 3 columns │
└───────────────────────────────────────────────────────────────────┘

Amazon ECS 関連の eventName 別カウント

eventSourceecs.amazonaws.com に限定した eventName のカウントも確認できた📈

⚫◗ SELECT eventName, awsRegion, COUNT(*) AS COUNT
    FROM events
    WHERE eventSource = 'ecs.amazonaws.com'
    GROUP BY eventName, awsRegion
    ORDER BY COUNT DESC;
┌────────────────────────────┬────────────────┬───────┐
│         eventName          │   awsRegion    │ COUNT │
│          varcharvarchar     │ int64 │
├────────────────────────────┼────────────────┼───────┤
│ DescribeServices           │ ap-northeast-11653 │
│ DescribeClusters           │ ap-northeast-1704 │
│ DescribeServiceRevisions   │ ap-northeast-1421 │
│ ListContainerInstances     │ ap-northeast-1383 │
│ DescribeTaskDefinition     │ ap-northeast-1373 │
│ DescribeServiceDeployments │ ap-northeast-1299 │
│ ListTasks                  │ ap-northeast-1292 │
│ ListServiceDeployments     │ ap-northeast-1288 │
│ DescribeCapacityProviders  │ ap-northeast-1183 │
│ DescribeTasks              │ ap-northeast-1146 │
│ ListServices               │ ap-northeast-163 │
│ ListTaskDefinitions        │ ap-northeast-160 │
│ UpdateService              │ ap-northeast-156 │
│ ListTaskDefinitionFamilies │ ap-northeast-145 │
│ GetTaskProtection          │ ap-northeast-142 │
│ ListAccountSettings        │ ap-northeast-134 │
│ RegisterTaskDefinition     │ ap-northeast-123 │
│ ListClusters               │ ap-northeast-112 │
│ DeregisterTaskDefinition   │ ap-northeast-19 │
│ DeleteService              │ ap-northeast-19 │
│ CreateService              │ ap-northeast-16 │
│ DeleteCluster              │ ap-northeast-13 │
│ ListTagsForResource        │ ap-northeast-13 │
│ CreateCluster              │ ap-northeast-12 │
├────────────────────────────┴────────────────┴───────┤
│ 24 rows                                   3 columns │
└─────────────────────────────────────────────────────┘

Amazon S3 関連の eventName 別カウント

同じように eventSources3.amazonaws.com に限定した eventName のカウントも確認できた📈

⚫◗ SELECT eventName, awsRegion, COUNT(*) AS COUNT
    FROM events
    WHERE eventSource = 's3.amazonaws.com'
    GROUP BY eventName, awsRegion
    ORDER BY COUNT DESC;
┌──────────────────────────────────┬────────────────┬───────┐
│            eventName             │   awsRegion    │ COUNT │
│             varcharvarchar     │ int64 │
├──────────────────────────────────┼────────────────┼───────┤
│ GetBucketAcl                     │ ap-northeast-12085 │
│ ListObjectVersions               │ ap-northeast-168 │
│ HeadBucket                       │ ap-northeast-121 │
│ GetBucketVersioning              │ ap-northeast-117 │
│ ListObjects                      │ ap-northeast-111 │
│ GetBucketOwnershipControls       │ ap-northeast-17 │
│ GetBucketObjectLockConfiguration │ ap-northeast-16 │
│ GetBucketLifecycle               │ ap-northeast-14 │
│ DeleteBucketLifecycle            │ ap-northeast-12 │
│ GetBucketPublicAccessBlock       │ ap-northeast-12 │
│ GetBucketReplication             │ ap-northeast-11 │
│ GetAccelerateConfiguration       │ ap-northeast-11 │
│ GetBucketTagging                 │ ap-northeast-11 │
│ DeleteBucket                     │ ap-northeast-11 │
│ GetBucketWebsite                 │ ap-northeast-11 │
│ GetBucketEncryption              │ ap-northeast-11 │
│ GetBucketPolicy                  │ ap-northeast-11 │
│ PutBucketVersioning              │ ap-northeast-11 │
│ GetBucketCors                    │ ap-northeast-11 │
│ GetBucketLogging                 │ ap-northeast-11 │
│ DeleteBucketPublicAccessBlock    │ ap-northeast-11 │
│ GetBucketRequestPayment          │ ap-northeast-11 │
├──────────────────────────────────┴────────────────┴───────┤
│ 22 rows                                         3 columns │
└───────────────────────────────────────────────────────────┘

AWS Lambda 関連の eventName 別カウント

eventSourcelambda.amazonaws.com に限定した eventName のカウントも確認できた📈

GetFunction20150331v2GetFunctionConfiguration20150331v2 など AWS Lambda 関連の eventName には日付やバージョン表記が含まれているんだな〜という発見もあった👀

⚫◗ SELECT eventName, awsRegion, COUNT(*) AS COUNT
    FROM events
    WHERE eventSource = 'lambda.amazonaws.com'
    GROUP BY eventName, awsRegion
    ORDER BY COUNT DESC;
┌───────────────────────────────────────┬────────────────┬───────┐
│               eventName               │   awsRegion    │ COUNT │
│                varcharvarchar     │ int64 │
├───────────────────────────────────────┼────────────────┼───────┤
│ GetFunction20150331v2                 │ ap-northeast-1488 │
│ GetFunctionConfiguration20150331v2    │ ap-northeast-1157 │
│ GetAccountSettings20160819            │ ap-northeast-1145 │
│ ListEventSourceMappings20150331       │ ap-northeast-1104 │
│ ListVersionsByFunction20150331        │ ap-northeast-172 │
│ ListTags20170331                      │ ap-northeast-171 │
│ ListFunctions20150331                 │ ap-northeast-142 │
│ GetRuntimeManagementConfig            │ ap-northeast-138 │
│ GetFunctionCodeSigningConfig          │ ap-northeast-138 │
│ ListFunctionUrlConfigs                │ ap-northeast-135 │
│ ListLayers20181031                    │ ap-northeast-135 │
│ GetFunctionEventInvokeConfig          │ ap-northeast-135 │
│ GetPolicy20150331                     │ ap-northeast-135 │
│ ListAliases20150331                   │ ap-northeast-135 │
│ ListProvisionedConcurrencyConfigs     │ ap-northeast-134 │
│ GetFunctionRecursionConfig            │ ap-northeast-134 │
│ UpdateFunctionConfiguration20150331v2 │ ap-northeast-124 │
│ GetEventSourceMapping20150331         │ ap-northeast-117 │
│ DeleteFunction20150331                │ ap-northeast-113 │
│ PublishVersion20150331                │ ap-northeast-112 │
│ GetPolicy20150331v2                   │ ap-northeast-18 │
│ CreateFunction20150331                │ ap-northeast-15 │
│ UpdateFunctionCode20150331v2          │ ap-northeast-13 │
│ RemovePermission20150331v2            │ ap-northeast-12 │
│ AddPermission20150331v2               │ ap-northeast-12 │
│ GetLayerVersionByArn20181031          │ ap-northeast-12 │
│ DeleteEventSourceMapping20150331      │ ap-northeast-11 │
│ CreateEventSourceMapping20150331      │ ap-northeast-11 │
├───────────────────────────────────────┴────────────────┴───────┤
│ 28 rows                                              3 columns │
└────────────────────────────────────────────────────────────────┘

まとめ

普段から DuckDB を使う機会が多いけど,今後は AWS CloudTrail 証跡のアドホックな分析にも DuckDB を使っていこうと思う🦆

関連記事

kakakakakku.hatenablog.com