たそらぼ

日頃思ったこととかメモとか。

CloudTrailの証跡配信エラーを検知する

CloudTrailの証跡配信エラーを検知する方法を調べました。

CloudTrailの証跡は配信失敗する可能性がある

AWS上で発生したイベントを記録してくれるCloudTrailは非常に便利なサービスで、証跡を作るだけでAWSで行ったログをS3などに出力することができます。
ただ、あまりに便利すぎて、安定してログを収集するための設定に考えが及ばないことがあります。
例えば、ログの配信が何かの理由で失敗してしまうとか...。
という訳で、CloudTrailの証跡の配信が失敗した時の検知方法を学んだので、共有できればと思います。

get-trail-status API

get-trail-status APIを使うと、対象のCloudTrail証跡のステータスを入手することが可能です。
docs.aws.amazon.com

例えば、cloudtrail-testという名前の証跡のステータスをAWS CLIで確認するには、下記のコマンドを使います。

aws cloudtrail get-trail-status --name cloudtrail-test

Outputとして、下記のようなJSONが返却されます。

#From https://docs.aws.amazon.com/cli/latest/reference/cloudtrail/get-trail-status.html
{
  "LatestNotificationTime": 1454022144.869,
  "LatestNotificationAttemptSucceeded": "2016-01-28T23:02:24Z",
  "LatestDeliveryAttemptTime": "2016-01-28T23:02:24Z",
  "LatestDeliveryTime": 1454022144.869,
  "TimeLoggingStarted": "2015-11-06T18:36:38Z",
  "LatestDeliveryAttemptSucceeded": "2016-01-28T23:02:24Z",
  "IsLogging": true,
  "LatestCloudWatchLogsDeliveryTime": 1454022144.918,
  "StartLoggingTime": 1446834998.695,
  "StopLoggingTime": 1446834996.933,
  "LatestNotificationAttemptTime": "2016-01-28T23:02:24Z",
  "TimeLoggingStopped": "2015-11-06T18:36:36Z"
}

加えて、配信エラーが発生すると、キーに"LatestDeliveryError"が追加されます。

LatestDeliveryError -> (string)

Displays any Amazon S3 error that CloudTrail encountered when attempting to deliver log files to the designated bucket. For more information see the topic Error Responses in the Amazon S3 API Reference.

こいつが使えそうです。

エラー発生時の挙動を確認する

今回はS3にログを送信し損ねた時の挙動に興味があるので、試して見たいと思います。

バケットポリシーが勝手に変わっているとき

誰かがミスってバケットポリシーを変えてしまうとCloudTrailが弾かれてしまうはずです。

手順:
まず、バケットポリシーを変えます。

続いて、5分ほど待ってから、get-trail-status APIを叩きます。

{
(略)
"LatestDeliveryError": "AccessDenied",
(略)
}

という訳で、Errorの内容が取得できます。

バケットポリシーが勝手に消されたとき

誰かがミスってバケットを消すことも考えられます。これはCloudTrailが困ってしまいます。

手順:
配信先のバケットを削除する。

続いて、5分ほど待ってから、get-trail-status APIを叩きます。

{
(略)
"LatestDeliveryError": "NoSuchBucket",
(略)
}

という訳で、こちらも無事Errorの内容が取得できました。

この他にもS3 APIを叩いた時のエラーは取得できるようです。

検知方法

CloudTrail statusを取得するにはAPIを叩かないといけないので、Lambdaにスクリプトを書いて定期実行するのが一番良いでしょう。
取得したJSONを標準出力しておくと、CloudWatchLogsに吐かれるので、フィルターで"LatestDeliveryError"などの文字列をメトリクス化してアラームで拾うと良いでしょう。

エラー中の証跡の行方とか、もうちょっと人間的な確認方法とか

実験すると、エラー中の証跡は、正常な配信が再開されると、対象の場所に吐き出されるようでした。

ちなみに、エラーの発生はコンソールからも確認できます。
AWS始めたばかりで、急にLambdaとかCloudWatchとかワシワシ設定するの辛い方は、とりあえずたまにコンソールを見るだけでもよさそうですね。
f:id:tasotasoso:20200227232609p:plain