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


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

こちらは [Fusic Advent Calendar 2019 - Qiita](https://qiita.com/advent-calendar/2019/fusic) 4日目の記事です。
昨日の記事は、@gorogoroyasu による [リアルタイムで顔にモザイクをかける - Fusic Tech Blog](https://tech.fusic.co.jp/posts/2019-12-03-2019-12-03-put-mosaic-on-human-faces/) でした。
機械学習に興味アリの方、是非ごらんあれ。

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

（自分のような`AWS触りたてホヤホヤな方`向けです。）

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

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


## 使うサービス
- IAM　（アカウント管理）
- S3　（ストレージ）
- CloudTrail　（リソースのモニタリング）
- Amazon Athena　（ログ分析）

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

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

今回の監視対象バケットを `miyagawa-test`とします。
このバケットのログを保存するための新しくバケットを`miyagawa-test-log`として用意しています。
<img width="1397" alt="Screen Shot 2019-12-03 at 23.02.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/59b6bf63-fc96-cb63-259f-c4611182961d.png">


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

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

ここに`オブジェクトレベルログ記録`という設定があるので、有効化されてない場合は有効化します。
<img width="1373" alt="Screen Shot 2019-12-03 at 23.02.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/4d8f32a1-1936-d3f6-633a-7d2e89085f60.png">



### CloudTrail

[証跡の作成] より「証跡」と呼ばれる監視機構を一つ作ってみましょう。
<img width="1663" alt="Screen Shot 2019-12-03 at 23.06.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/316ed5fc-b76a-5dd5-eb81-557da02e8487.png">


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

```
- 証跡名・リージョン
- ○○イベント
	- 管理イベント　（リソースに対する、もしくはリソース内でのイベント。（例）マネジメントコンソールへのログインイベント）
	- Insightsイベント　（異常なレベルの 書き込みAPI）
	- データイベント　（データに対するイベント）
- ストレージの場所
```
<img width="1588" alt="Screen Shot 2019-12-03 at 23.31.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/e5e044d1-9a46-1b94-c9d7-ce15919a77f1.png">


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

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

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

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

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

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

やりましたね！

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


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

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

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

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

#### **- 出来上がったものがこちら**
<img width="881" alt="Screen Shot 2019-12-04 at 0.31.51 copy.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/f53a3f1a-f969-e3aa-553f-16b8b1c985df.png">


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


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

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

### ログデータのテーブルを作ろう
[CloudTrail] > [イベント情報] の画面を開き、下記リンクをクリックします。
<img width="944" alt="Screen Shot 2019-12-04 at 1.07.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/9b5912f7-6667-7f6a-9d6b-dc30291050f9.png">

表示されるSQLを横目に、無心でログ用バケットを選択し、[テーブル作成]をクリックして完了です。
<img width="950" alt="Screen Shot 2019-12-04 at 1.07.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/d6630dcd-ce74-0508-ff3e-855ae9badffe.png">

Athenaの画面を開くと、こちらで作成したテーブルがサイドバーに表示されます。
<img width="957" alt="Screen Shot 2019-12-04 at 1.17.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/f80c6351-8092-5a2c-577f-a8c5d4f782e9.png">


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

```sql
SELECT
 *
FROM
 cloudtrail_logs_miyagawa_test_log
```

<img width="827" alt="Screen Shot 2019-12-04 at 1.20.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/1fd376ee-ce85-b1a8-a56d-bb744f9025ee.png">


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

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

```sql
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;
```

![Screen Shot 2019-12-04 at 12.23.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390133/65c95814-4450-dbab-fab5-826121fdf602.png)

やりましたね！

## 料金
- [料金 - Amazon S3 ｜AWS](https://aws.amazon.com/jp/s3/pricing/)
- [料金 - AWS CloudTrail | AWS](https://aws.amazon.com/jp/cloudtrail/pricing/)
- [料金 -  Amazon Athena | AWS](https://aws.amazon.com/jp/athena/pricing/?nc=sn&loc=3)

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

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

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


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