AWS サポートによる API コールの CloudTrail ログを、Athena を使用してクエリする方法を教えてください。

所要時間3分
0

Amazon Athena クエリを実行して、使用している AWS アカウントに対して AWS サポートが行った API コールを AWS CloudTrail ログで特定したいです。

簡単な説明

AWS サポートは、問題の解決を支援する目的で、お使いの AWS リソースに関する保護された読み取り専用メタデータを収集する場合があります。AWS サポート は、メタデータの収集に AWSServiceRoleForSupport という AWS Identity and Access Management (IAM) サービスリンクロールを使用します。

AWS サポートがお客様のアカウントに対して行う API コールに関する情報を確認するには、Athena を使用して CloudTrail ログをクエリしてください。

解決策

パーティションプロジェクションを使用して CloudTrail テーブルを手動で作成する

CloudTrail テーブルをパーティション化して、クエリの実行時間を短縮した場合も、CloudTrail ログのサイズは時間の経過に伴い大きくなる場合があります。過度にパーティション化されたテーブルに対するクエリは、計画時間が長くなり、迅速に完了しません。

クエリの実行時間を短縮するには、パーティションプロジェクションを使用して手動で CloudTrail テーブルを作成します。

たとえば、次の CREATE TABLE ステートメントは、ある AWS リージョンにおいて、指定された期間内の CloudTrail ログにパーティションプロジェクションを自動的に使用します。

CREATE EXTERNAL TABLE cloudtrail_logs_pp(  
    eventversion STRING,  
    useridentity STRUCT<  
        type: STRING,  
        principalid: STRING,  
        arn: STRING,  
        accountid: STRING,  
        invokedby: STRING,  
        accesskeyid: STRING,  
        username: STRING,  
        onbehalfof: STRUCT<  
             userid: STRING,  
             identitystorearn: STRING>,  
        sessioncontext: STRUCT<  
            attributes: STRUCT<  
                mfaauthenticated: STRING,  
                creationdate: STRING>,  
            sessionissuer: STRUCT<  
                type: STRING,  
                principalid: STRING,  
                arn: STRING,  
                accountid: STRING,  
                username: STRING>,  
            ec2roledelivery:string,  
            webidfederationdata: STRUCT<  
                federatedprovider: STRING,  
                attributes: map<string,string>>  
        >  
    >,  
    eventtime STRING,  
    eventsource STRING,  
    eventname STRING,  
    awsregion STRING,  
    sourceipaddress STRING,  
    useragent STRING,  
    errorcode STRING,  
    errormessage STRING,  
    requestparameters STRING,  
    responseelements STRING,  
    additionaleventdata STRING,  
    requestid STRING,  
    eventid STRING,  
    readonly STRING,  
    resources ARRAY<STRUCT<  
        arn: STRING,  
        accountid: STRING,  
        type: STRING>>,  
    eventtype STRING,  
    apiversion STRING,  
    recipientaccountid STRING,  
    serviceeventdetails STRING,  
    sharedeventid STRING,  
    vpcendpointid STRING,  
    vpcendpointaccountid STRING,  
    eventcategory STRING,  
    addendum STRUCT<  
      reason:STRING,  
      updatedfields:STRING,  
      originalrequestid:STRING,  
      originaleventid:STRING>,  
    sessioncredentialfromconsole STRING,  
    edgedevicedetails STRING,  
    tlsdetails STRUCT<  
      tlsversion:STRING,  
      ciphersuite:STRING,  
      clientprovidedhostheader:STRING>  
  )  
PARTITIONED BY (  
   `timestamp` string)  
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'  
STORED AS INPUTFORMAT 'com.amazon.emr.cloudtrail.CloudTrailInputFormat'  
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'  
LOCATION  
  's3://example-bucket/AWSLogs/account-id/CloudTrail/aws-region'  
TBLPROPERTIES (  
  'projection.enabled'='true',   
  'projection.timestamp.format'='yyyy/MM/dd',   
  'projection.timestamp.interval'='1',   
  'projection.timestamp.interval.unit'='DAYS',   
  'projection.timestamp.range'='2020/01/01,NOW',   
  'projection.timestamp.type'='date',   
  'storage.location.template'='s3://example-bucket/AWSLogs/account-id/CloudTrail/aws-region/${timestamp}')

注: 実際のものでそれぞれ、LOCATION 句と TBLPROPERTIES 句内の example-bucket をバケット名に、account-id をアカウント ID に、aws-region をリージョン二置き換えます。projection.timestamp.range2020/01/01 は、実際の開始日に置き換えます。

上記のクエリを実行して分割された CloudTrail ログテーブルを作成するには、次の手順を実行します。

  1. Athena コンソールを開きます。
  2. [新しいクエリ] を選択してから、ダイアログボックスを選択してサンプルクエリをクリアします。
  3. 上記のクエリを入力した後、[クエリを実行] を選択します。

詳細については、「パーティションプロジェクションを使用して Athena の CloudTrail ログ用テーブルを作成する」を参照してください。

CloudTrail のログテーブルで AWS サポートの API コールを特定する

CloudTrail ログテーブルで、指定した時間範囲の AWS サポートによるコールを特定するために使用できるクエリの例を次に示します。この例では、指定する時間範囲に 2025/01/01 から 2025/01/07 を使用しています。

注: 次のクエリ例で、defaultcloudtrail_logs_pp テーブルを作成したデータベースの名前に置き換えます。

AWS サポートによる API コール数をカウントする

次のクエリは、AWS サポートがお客様のアカウントに対して行った API コールの総数をカウントします。

SELECT COUNT(*)  
  FROM "default"."cloudtrail_logs_pp"  
 WHERE timestamp <= '2025/01/07'  
       AND timestamp > '2025/01/01'  
       AND sourceipaddress = 'support.amazonaws.com'

すべての AWS サポートによる API コールを取得する

次のクエリは、AWS サポートがお客様のアカウントに対して行ったすべての API コールを表示します。

SELECT *  
  FROM "default"."cloudtrail_logs_pp"  
 WHERE timestamp <= '2025/01/07'  
       AND timestamp > '2025/01/01'  
       AND sourceipaddress = 'support.amazonaws.com'  
 LIMIT 10

AWS サポートによる API コールの回数をユーザー名とイベントソースごとにカウントする

次のクエリは、AWS サポートがお客様のアカウントに対して行った各ユーザー名とイベントソースに関する API コールの総数を表示します。

SELECT useridentity.sessioncontext.sessionissuer.username,  
       eventsource,  
       COUNT(*) AS number_of_event  
  FROM "default"."cloudtrail_logs_pp"  
 WHERE timestamp <= '2025/01/07'  
       AND timestamp > '2025/01/01'  
       AND sourceipaddress = 'support.amazonaws.com'  
 GROUP BY useridentity.sessioncontext.sessionissuer.username,  
       eventsource  
 ORDER BY number_of_event DESC

AWS サポートがアカウントに対して行った API コールの ARN を取得する

次のクエリは、AWS サポートがお客様のアカウントに対して行ったすべての API コールの ARN を表示します。

SELECT useridentity.arn  
  FROM "default"."cloudtrail_logs_pp"  
 WHERE timestamp <= '2025/01/07'  
       AND timestamp > '2025/01/01'  
       AND regexp_like(useridentity.arn, 'AWSServiceRoleForSupport')  
 LIMIT 10

AWS サポートがアカウントに対して行った API コールのプリンシパル ID を取得する

次のクエリは、AWS サポートがお客様のアカウントに対して行ったすべての API コールのプリンシパル ID を表示します。

SELECT useridentity.principalid  
  FROM "default"."cloudtrail_logs_pp"  
WHERE timestamp <= '2025/01/07'  
      AND timestamp > '2025/01/01'  
      AND regexp_like(useridentity.arn, 'AWSServiceRoleForSupport')  
LIMIT 10

関連情報

IAM ID のアクセス許可を追加、削除する

Athena における ID とアクセスの管理

パーティションプロジェクションを使用して Athena クエリ用の CloudTrail テーブルを作成する方法を教えてください

AWS公式
AWS公式更新しました 3ヶ月前