S3オブジェクトレベルのログ記録+監視方法


こんにちは。みやがわです。

こちらは Fusic Advent Calendar 2019 - Qiita 4日目の記事です。
昨日の記事は、@gorogoroyasu による リアルタイムで顔にモザイクをかける - Fusic Tech Blog でした。
機械学習に興味アリの方、是非ごらんあれ。

さて、本日はタイトルの通り「AWS S3に対するログ記録+監視方法」について書いてみました。

(自分のようなAWS触りたてホヤホヤな方向けです。)

本記事で出来るようになること

S3の操作ログを、オブジェクト単位で記録することができます。
どのIAMユーザーどのオブジェクトどう操作したのかを記録して、一覧画面で確認できます。

使うサービス

  • IAM (アカウント管理)
  • S3 (ストレージ)
  • CloudTrail (リソースのモニタリング)
  • Amazon Athena (ログ分析)

ログ記録

まずは、S3への操作イベントに対してログファイルが自動生成されるよう設定していきましょう。

S3

- ログファイル用バケット

今回の監視対象バケットを miyagawa-testとします。
このバケットのログを保存するための新しくバケットをmiyagawa-test-logとして用意しています。

- オブジェクトレベルログ記録

監視したいバケット(miyagawa-test)のプロパティを開きます。

ここにオブジェクトレベルログ記録という設定があるので、有効化されてない場合は有効化します。

CloudTrail

[証跡の作成] より「証跡」と呼ばれる監視機構を一つ作ってみましょう。

- 設定箇所

「証跡情報の作成」画面では、大きく分けて以下のような設定項目があります。

- 証跡名・リージョン
- ○○イベント
    - 管理イベント (リソースに対する、もしくはリソース内でのイベント。(例)マネジメントコンソールへのログインイベント)
    - Insightsイベント (異常なレベルの 書き込みAPI)
    - データイベント (データに対するイベント)
- ストレージの場所

今回の目的では、データイベントのみ関係があるので、その他のイベントは全てオフに設定します。
以下が私が行った設定です。

- 証跡名・リージョン
 - 証跡名:「miyagawa-test-trail」
 - 証跡情報を全てのリージョンに適用:「いいえ」

- ○○イベント
 - データイベント:
  - S3:バケット追加より「miyagawa-test」を追加、「書き込み」のみチェック
  - その他:全て「いいえ」

- ストレージの場所
 - S3バケット:「miyagawa-test-log」
 - その他:全て「いいえ」

[作成]より証跡が出来ます。

「証跡情報」一覧画面より、ステータスが緑色になっていることを確認してください。
オン時に対象S3のオブジェクトに操作があれば、ログ用バケット記録されます。

やりましたね!

※ログ記録のオン/オフは、証跡の設定画面右上にあるトグルスイッチより切り替え可能です。

- ログファイル用バケット

初回ログ生成時に、ログ用バケット内に「AWSLogs」フォルダが自動生成されます。

ログファイルはJSON形式です。
試しに miyagawa-test というIAMユーザで、hoge.pngというファイルをバケットに追加したときのログファイルを見てみましょう。

数分待つと、ファイルが生成されます。

- 出来上がったものがこちら

短時間に複数の操作を行った場合は、1ログファイルにこんなのがつらつら記述されます。

ログ監視

ログは確認できてこそのものです。
ファイル一つ一つを開いて見るわけにはいかないので、ここでAmazon Athenaというサービスをご紹介します。

こちらは、SQLを用いてログファイルの分析・一覧表示を行う優れものです。

ログデータのテーブルを作ろう

[CloudTrail] > [イベント情報] の画面を開き、下記リンクをクリックします。

表示されるSQLを横目に、無心でログ用バケットを選択し、[テーブル作成]をクリックして完了です。

Athenaの画面を開くと、こちらで作成したテーブルがサイドバーに表示されます。

SQLでデータを見よう

SQLを流してデータを見てみましょう。

SELECT
 *
FROM
 cloudtrail_logs_miyagawa_test_log

JSON形式で見たデータがそのまま一覧で出ていますね。

これを
どのIAMユーザーどのオブジェクトどう操作したのか
が分かる形式に変換しましょう。

SELECT
from_iso8601_timestamp(eventtime) AT TIME ZONE 'Asia/Tokyo' AS eventtime,
eventname,
useridentity.username,
resources[1].arn AS object
FROM
cloudtrail_logs_miyagawa_test_log
ORDER BY
eventtime DESC;

やりましたね!

料金

おわりに

もっと楽にログが見れるものかと思っていたのですが、
SQLを叩かないといけないようですね。

ちなみに、AthenaのSQLはPrestoに準拠しているのですが、完全にPrestoをサポートしているわけではないようです。
(上記のクエリでAthenaのViewを作ろうとしたらtimezone周りでエラーが出ました。)

解決策が分かり次第追記します。。!!

それでは、明日のアドベントカレンダーは @tsukabo です!
お楽しみに!