こんにちは、プロダクト開発本部の川原です!私がブログ記事を書くのも久々。。。弊社主催のdb tech showcase で私が登壇したRDS Oracleのログファイル取得について書いていきます。
※記事の内容は執筆時(2022/01)によるものです。
Oracleの監査ログ
Oracleには標準監査と統合監査の2種類があります。RDSで取得するには以下の方法があります。
- 標準監査
- ファイルを少しずつダウンロード(RDS:DownloadCompleteLogFilePortion)
- ファイルのフルダウンロード(RDS:DownloadCompleteDBLogFile)
- CloudWatch Logsへ発行 -> サブスクリプションフィルタ
- 統合監査
- OracleにログインをしUNIFIED_AUDIT_TRAILを参照
- Database Activity Streams
今回は標準監査の取得について紹介をしていきます。統合監査の取得については次回紹介したいと思います。
RDS:DownloadDBLogfilePortion
RDS:DownloadDBLogfilePortion
こちらはAWS コンソールのビューボタンが該当します。ファイルダウンロードを上限1MBとして少しずつダウンロードができるのが特徴です。
- 公式ドキュメントに説明がある
- AWS SDKにも実装されている
と信頼性が高く思えますが、落とし穴があります。
非Ascii文字が?に置き換わる
次のSQLを実行してみます。
SELECT 名前 from 従業員 where 出身地 = 東京;
取得できるレコードは次のようになります。
<AuditRecord><Audit_Type>1</Audit_Type><Session_Id>870027</Session_Id><StatementId>1526</StatementId><EntryId>196</EntryId><Extended_Timestamp>2021-07-28T09:29:09.443831Z</Extended_Timestamp><DB_User>TEST_USER</DB_User><OS_User>os_user</OS_User><Userhost>machine</Userhost><OS_Process>9127</OS_Process><Terminal>pts/2</Terminal><Instance_Number>0</Instance_Number><Object_Schema>TEST_USER</Object_Schema><Object_Name>???</Object_Name><Action>3</Action><Returncode>0</Returncode><Scn>3310108</Scn><DBID>1594158128</DBID><Current_User>TEST_USER</Current_User>
<Sql_Text>SELECT ?? from ??? where ??? = ??; </Sql_Text>
</AuditRecord>
見事に日本語が?
に置き換わりました。。。これは全てのDBに共通するわけではなくMySQLではきちんと出力される。PostgreSQLは?
に置き換わるなど、DBによって変わってくるようです。
1MB超えた時に情報が欠如する場合がある
DownloadDBLogFilePortionはどこまでダウンロードをしたかはMarkerによって保持されます。しかしこのMarkerにも問題があります。1MBが行の終わりでない場合
<AuditRecord><Audit_Type>1</Audit_Type><Session_Id>290027</Session_Id>
<StatementId>1450</StatementId><EntryId>2900</EntryId>
<Scn>1216463</Scn><DBID>1594158128</DBID><Curr [Your log message was truncated]
このように [Your log message was truncated]
が出力されて行の残りが切り取られてしまいます。ではこのMarkerがどこから再開するかというと
<Sql_Text>update TEST set value = value where id = 26</Sql_Text></AuditRecord>
<!-- 次の行から再開している -->
次の行から再開で切り取られた情報は完全に欠如してしまいます。標準監査はXMLファイルとして使用しますが、XMLとしてのフォーマットも完全に崩れてしまいます
RDS:DownloadCompleteDBLogFile
このアクションはAWS コンソールの ダウンロード
ボタンが該当します。ファイルをフルダウンロードし、先ほど説明したデメリットが発生しません。
しかしこのアクションは次のようなデメリットがあります。
AWS SDKで実装されていない
このアクションはRDS APIと構造が違うためかAWS SDKとして実装されていません。また一時期はIAMアクションとして識別されないアクションと警告がでていて、このアクションの動向が不明慮でした。
ファイルを途中からダウンロードできない
フルダウンロードなので当然ですが、ファイルのダウンロードの開始場所を途中からという事が出来ないです。このため書き終えたファイルをダウンロードするなら問題無いのですが、ダウンロードしたファイルに更新があると再ダウンロードする必要があります。
CloudWatch Logsへ発行 -> サブスクリプションフィルタ
RDS Oracleの標準監査ログファイルはCloudWatch Logsへ発行できます。 ただしCloudWatch Logsに溜まったログを定期的に参照するにはCloudWatch Logsの制限がきついため、サブスクリプションフィルタという機能を利用します。
図ではKinesis Data Streamsを例にしていますが、lambdaやKinesis Firehoseで利用する事もできます。
この方法はファイルダウンロード時の欠点について考える必要が無いです。しかしこの方法にも欠点があります。
CloudWatch Logs、Kinesis等の値段がかかる
CloudWatch Logsの料金は以下の通りです。
- $0.76 : 取り込み GB あたり
- $0.033 : GB あたりのアーカイブ/月
またそれに加えてKinesis Data Streamsの料金がかかります。 Kinesis Data Streamsは安価ですが、Kinesis Firehoseは便利な分料金が高いです。
最後に
いかがだったでしょうか?どのログの取得の仕方にもそれぞれ一長一短がありました。ここでは説明しませんでしたが、Oracleのログファイル取得は結構大変でファイルが書き込み終了したかどうかの判別もダウンロードしないといけません。料金等を気にしないのであればサブスクリプションフィルタを使った方法が一番簡単だと思います。今回は標準監査ログの取得について説明しましたが、Oracle 21cでは標準監査が非推奨となりました。統合監査の取得については後編で話したいと思います。