AWS CloudTrailログからAmazon Transcribeの利用状況を調べてみる

2018.07.07

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

Amazonが提供する文字起こしサービス Amazon Transcribe が AWS CloudTrail に対応しました。 これにより、Amazon Transcribe の API の呼び出しが記録され、ログファイル送信されるようになりました。

このブログでは CloudTrail に出力される Amazon Transcribe の API ログフォーマットを確認し、さらに Amazon Athena を使って、どのような音源が文字起こしされているか簡単な集計を行ってみます。

CloudTrail で Amazon Transcribe の API ログを確認

Event history から API ログを確認します。

Amazon Transcribe の EventSource"transcribe.amazonaws.com" です。 この EventSource により Amazon Transcribe の API 一覧をフィルターできます。

Amazon Transcribe の API のなかで主要な次の 3 API の出力を実際に確認します。

  • ListTranscriptionJobs : Lists transcription jobs with the specified status.
  • GetTranscriptionJob : Returns information about a transcription job
  • StartTranscriptionJob : Starts an asynchronous job to transcribe speech to text.

Event history のフィルター条件において、 eventName にこれら API 名を指定することでフィルターできます。

ListTranscriptionJobs API

フォーマット

不明

出力例

管理コンソールからジョブ一覧を確認したときの出力例です。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "XXX",
        "arn": "arn:aws:iam::123456789012:user/john-smith",
        "accountId": "123456789012",
        "accessKeyId": "YYY",
        "userName": "john-smith",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "true",
                "creationDate": "2018-07-05T12:33:20Z"
            }
        },
        "invokedBy": "signin.amazonaws.com"
    },
    "eventTime": "2018-07-05T21:43:03Z",
    "eventSource": "transcribe.amazonaws.com",
    "eventName": "ListTranscriptionJobs",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "1.2.3.4",
    "userAgent": "signin.amazonaws.com",
    "requestParameters": {
        "maxResults": 20
    },
    "responseElements": {
        "transcriptionJobSummaries": [
            {
                "languageCode": "en-US",
                "failureReason": "Invalid data in input media file",
                "transcriptionJobStatus": "FAILED",
                "creationTime": "Jul 5, 2018 3:58:24 PM",
                "transcriptionJobName": "invalid-format-b5745868-bfeb-49e6-958d-7e9cc605dcd1aaa"
            },
            {
                "languageCode": "en-US",
                "transcriptionJobStatus": "COMPLETED",
                "creationTime": "Jul 5, 2018 9:08:54 AM",
                "transcriptionJobName": "649a05434b3a475f99de6a3f3a8f6074",
                "completionTime": "Jul 5, 2018 9:13:36 AM"
            },
            ...
        ],
        "nextToken": "XXX"
    },
    "requestID": "651f8cf2-809c-11e8-b64d-5b5715dde42d",
    "eventID": "e2c9a1af-d376-45d2-bee9-71367139704f",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}

GetTranscriptionJob API

フォーマット

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole | FederatedUser | IAMUser | Root | SAMLUser | WebIdentityUser",
        "principalId": "principal ID",
        "arn": "ARN",
        "accountId": "account ID",
        "accessKeyId": "access key",
        "userName": "user name"
    },
    "eventTime": "timestamp",
    "eventSource": "transcribe.amazonaws.com",
    "eventName": "GetTranscriptionJob",
    "awsRegion": "region",
    "sourceIPAddress": "source IP address",
    "userAgent": "user agent",
    "requestParameters": {
        "transcriptionJobName": "unique job name"
    },
    "responseElements": {
        "transcriptionJob": {
            "settings": {

            },
            "transcriptionJobStatus": "COMPLETED | FAILED | IN_PROGRESS",
            "mediaFormat": "flac | mp3 | mp4 | wav",
            "creationTime": "timestamp",
            "transcriptionJobName": "unique job name",
            "languageCode": "en-US | es-US",
            "media": {
                "mediaFileUri": ""
            },
            "transcript": {
                "transcriptFileUri": ""
            }
        }
    },
    "requestID": "request ID",
    "eventID": "event ID",
    "eventType": "AwsApiCall",
    "recipientAccountId": "account id"
}

出力例

管理コンソールからジョブの詳細を確認したときの出力例です。

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "XXX",
        "arn": "arn:aws:iam::123456789012:user/john-smith",
        "accountId": "123456789012",
        "accessKeyId": "YYY",
        "userName": "john-smith",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "true",
                "creationDate": "2018-07-05T12:33:20Z"
            }
        },
        "invokedBy": "signin.amazonaws.com"
    },
    "eventTime": "2018-07-05T15:58:09Z",
    "eventSource": "transcribe.amazonaws.com",
    "eventName": "GetTranscriptionJob",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "1.2.3.4",
    "userAgent": "signin.amazonaws.com",
    "requestParameters": {
        "transcriptionJobName": "0fbe57a7-7728-4ddf-beff-7cd81f7e5bc4"
    },
    "responseElements": {
        "transcriptionJob": {
            "failureReason": "Invalid data in input media file",
            "settings": {},
            "transcriptionJobStatus": "FAILED",
            "mediaFormat": "mp3",
            "creationTime": "Jul 5, 2018 1:53:32 PM",
            "transcriptionJobName": "0fbe57a7-7728-4ddf-beff-7cd81f7e5bc4",
            "languageCode": "en-US",
            "media": {
                "mediaFileUri": ""
            },
            "transcript": {
                "transcriptFileUri": ""
            }
        }
    },
    "requestID": "369185ba-806c-11e8-b64d-5b5715dde42d",
    "eventID": "4ab7b142-8ae1-43db-a080-b553ca634d9b",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}

StartTranscriptionJob API

フォーマット

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole | FederatedUser | IAMUser | Root | SAMLUser | WebIdentityUser",
        "principalId": "principal ID",
        "arn": "ARN",
        "accountId": "account ID",
        "accessKeyId": "access key",
        "userName": "user name"
    },
    "eventTime": "timestamp",
    "eventSource": "transcribe.amazonaws.com",
    "eventName": "StartTranscriptionJob",
    "awsRegion": "region",
    "sourceIPAddress": "source IP address",
    "userAgent": "user agent",
    "requestParameters": {
        "mediaFormat": "flac | mp3 | mp4 | wav",
        "languageCode": "en-US | es-US",
        "transcriptionJobName": "unique job name",
        "media": {
            "mediaFileUri": ""
        }
    },
    "responseElements": {
        "transcriptionJob": {
            "transcriptionJobStatus": "IN_PROGRESS",
            "mediaFormat": "flac | mp3 | mp4 | wav",
            "creationTime": "timestamp",
            "transcriptionJobName": "unique job name",
            "languageCode": "en-US | es-US",
            "media": {
                "mediaFileUri": ""
            }
        }
    },
    "requestID": "request ID",
    "eventID": "event ID",
    "eventType": "AwsApiCall",
    "recipientAccountId": "account id"
}

出力例

Lambda 関数経由で StartTranscriptionJob API が呼び出されたときの実際の出力例です

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "ABCDE:lambda-function-name",
        "arn": "arn:aws:sts::123456789012:assumed-role/lambda_transcribe_execution/lambda-function-name",
        "accountId": "123456789012",
        "accessKeyId": "AAA",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2018-07-05T09:07:49Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "ABCDE",
                "arn": "arn:aws:iam::123456789012:role/lambda_transcribe_execution",
                "accountId": "123456789012",
                "userName": "lambda_transcribe_execution"
            }
        }
    },
    "eventTime": "2018-07-05T09:08:54Z",
    "eventSource": "transcribe.amazonaws.com",
    "eventName": "StartTranscriptionJob",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "1.2.3.4",
    "userAgent": "Boto3/1.7.30 Python/3.6.1 Linux/4.9.93-41.60.amzn1.x86_64 exec-env/AWS_Lambda_python3.6 Botocore/1.10.30",
    "requestParameters": {
        "mediaFormat": "mp3",
        "languageCode": "en-US",
        "transcriptionJobName": "649a05434b3a475f99de6a3f3a8f6074",
        "media": {
            "mediaFileUri": ""
        }
    },
    "responseElements": {
        "transcriptionJob": {
            "transcriptionJobStatus": "IN_PROGRESS",
            "mediaFormat": "mp3",
            "creationTime": "Jul 5, 2018 9:08:54 AM",
            "transcriptionJobName": "649a05434b3a475f99de6a3f3a8f6074",
            "languageCode": "en-US",
            "media": {
                "mediaFileUri": ""
            }
        }
    },
    "requestID": "0ab0dadc-8033-11e8-9622-95cbef352b7b",
    "eventID": "f02b7b6a-6716-409f-823b-3ac1ca672a5c",
    "eventType": "AwsApiCall",
    "recipientAccountId": "123456789012"
}

Athena で Transcribe の CloudTrail ログを検索

最後に Amazon Athena を使い、Transcribe の CloudTrail ログに対してクエリーを実行します。

準備

Athena と CloudTrail を連携する際、以前は手動でデータの定義が必要でした。 現在は、次のブログで紹介しているように、簡単な操作により、自動的にテーブルが作成されます。

[新機能]ワンクリックでAmazon AthenaのAWS CloudTrail用テーブルが作成できるようになりました

SQL 例

サービスの利用状況を調べる

CloudTrail にある StartTranscriptionJob API ログをもとに、文字起こしされている

  • メディアフォーマット
  • 言語

の組み合わせ件数を日別に出力したい場合、以下のような SQL を実行します。

SELECT substr(eventTime, 1, 10) AS date,
       cast(json_extract(responseElements, '$.transcriptionJob.mediaFormat') AS VARCHAR) AS mediaFormat,
       cast(json_extract(responseElements, '$.transcriptionJob.languageCode') AS VARCHAR) AS languageCode,
       count(*) AS cnt
  FROM cloudtrail_logs_cloudtrail_us_east_1_123456789012
 WHERE eventsource = 'transcribe.amazonaws.com'
   AND eventname = 'StartTranscriptionJob'
 GROUP BY 1, 2, 3
 ORDER BY 1 ,2, 3

responseElements

"responseElements": {
    "transcriptionJob": {
        "transcriptionJobStatus": "IN_PROGRESS",
        "mediaFormat": "flac | mp3 | mp4 | wav",
        "creationTime": "timestamp",
        "transcriptionJobName": "unique job name",
        "languageCode": "en-US | es-US",
        "media": {
            "mediaFileUri": ""
        }
    }
},

という形をしているため、json_extract 関数を使い JSONPath 書式でエレメントを抽出します。

json_extract 関数の戻り値(JSON のSTRING型)を VARCHAR 型に CAST しているのは、JSON 型は順序関係が定まっておらず ORDER BY できない問題を回避するためです。

SQL 実行結果例

date mediaFormat languageCode cnt
2018-07-05 mp3 en-US 15
2018-07-05 mp4 en-US 1
2018-07-06 mp3 en-US 18
2018-07-06 mp3 es-US 2

従来であれば StartTranscriptionJob API 呼び出し時に CloudWatch カスタムメトリクスを利用するなどして、利用状況のトラッキングが必要でしたが、今後は CloudTrail のログから利用状況を復元できるようになりました。

参照