CloudTrailLogをGlue経由してQuickSightで分析するやり方その２（Glueジョブ作成後→QuickSightで分析まで）

# ごあいさつ
　AWS管理者の皆さま、こんにちは。

　前回、CloudTrailログをGlueでフラットな形にして、Athenaで読み取れるようにするところまでを実装しました。

[CloudTrailLogをGlue経由してQuickSightで分析するやり方その１（Trail証跡作成→Glueジョブ作成まで）](https://qiita.com/kimukimumumumu/items/bf2a84463e99f0907844)

　今回は、自社所有AWSアカウントの全てのCloudTrail証跡ログをQuickSightで分析してしまう最後の工程です。
　画面操作が中心ですので、どちらかというと前回よりも画像多めになります。

　ついでにQuickSightの使い方やコツなどについても書きますので少々長くなりますが、お付き合いください。

　最終的にこんなのが作れることが目標です。
![visual_iam_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/c9614e34-0c1e-1e5a-021d-3b23dd429606.png)
　しょぼいように見えますが、使い勝手はなかなかのものですよ。

#●初回設定

　実は、この初回設定ですが、アカウント一つに対して一回限りの設定になります。
　ということでスクリーンショットを取り忘れてましたので、下記の記事を参考にしてください。
　初っ端から手抜きですいません。

[Amazon QuickSight: ユーザー管理やパーミッション設定について](https://dev.classmethod.jp/cloud/aws/quicksight-about-user-and-permission/)

　なお、上記記事の後に、今回利用する**S3とAthenaにアクセスできるような権限設定**をする必要があります。
　まずは**バージニア北部**に移動して、右上のユーザーボタンをクリックし、QuickSightの管理に遷移します。
![manage_goto.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/796710a9-a548-43fd-7818-e65adfddc4e1.png)

　「セキュリティとアクセス権限」に移動して、「接続された製品とサービス」の「追加または削除する」をクリックします。
![manage_view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/406cb82b-7829-3134-13aa-bb8110d2b342.png)

　サービスの選択画面に行きますので、今回は「Athena」と「S3」にチェックが入れてください。
![manage_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/305c2b22-dfe9-38ed-4ecc-80bc439058b8.png)

　また、S3の説明にある「詳細」をクリックすると、詳細画面がスライドします。
![manage_s3_add_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/9d8c0dea-5fdf-07f5-ceff-f8b8b22364be.png)
　ここで、Athenaでクエリを投げる先のS3バケットを選択してください。
![manage_s3_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/bc9cb584-634f-924b-6030-f8ad5020fc31.png)


　具体的にはglueジョブを作成する際に「--s3_converted_target」で設定したバケットです。
　　※./scripts/sample_cloudtrail_job.pyのS3_CONVERTED_TARGETで指定したバケット。


#●無事、初回設定が終わったら

　次はデータを取り込むことになりますが、ここで一つ注意点を。

　QuickSightでは、ログインしたユーザーが作成したデータセット（分析の元になるデータ）や分析、ダッシュボードなどは**ログインユーザーのみ**にしか見えません。
　他のユーザーが編集、閲覧できるようにするためにはそれぞれのリソースに対して「共有」作業を行う必要があります。

　例えばデータセットの場合、データセットのサブメニューから「共有」を選択します。
　そして、共有したいユーザーのメールアドレスで検索すると、対象のユーザーが表示されるため、該当ユーザーを選択し「共有」ボタンを押します。
![dataset_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/337fb98e-5dfe-12ff-a2d0-e4b41d7016e3.png)
![dataset_kyoyu_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/59804fd9-04d8-3933-55ad-c0ccfb4b0d76.png)
![dataset_kyoyu_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/73dee212-1c33-a98a-1e06-2299dd4ffbb9.png)


　分析の共有については、該当の分析を開いて右上に「共有ボタン」があります。
![bunseki_kyoyu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/60f526ba-557c-204f-2173-c1babb6f4183.png)

　あとは出てくるサブ画面は同じですので、必要な相手を共有しましょう。

　ということを前提にデータの取り込みに進みます。

#●データセットの作成

　画面右上から「データの管理」に進むと、最初は何も表示されていません。
　「新しいデータセット」から新規作成しましょう。
![dataset_manage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/f289c6db-d20f-a967-1f8e-5b9ce90b70a3.png)

　データソースは「Athena」を選んでください。
![dataset_create_athena.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/c5d708cc-2014-e726-86ba-0f0002897a50.png)

　「データソース名」には、データカタログのrawデータじゃない方を使いましょう。
　※前回のglueジョブ作成時にデフォルトであれば「aws_service_logs」になります。
　「接続を検証」すれば、有効性が確認できます。
![dataset_create_datasource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/f7934da7-b7c1-5db6-37ff-630c883592b7.png)

　「データソースを作成」すると、テーブルの選択画面に遷移します。
　データベース名を選択し、取り込みたいデータソースを選びます。残念ながら一つのデータソースしか選べません。
![dataset_create_table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/b68c5cff-51e9-cb4d-0dbd-25d2177031c9.png)

　また、ここでカスタムSQLを使用すると、JSON部分を開けたりするのですが、非常に面倒なので今回はそのままです。

　まずはいったん「SPICEへインポート」しましょう。
![dataset_create_end.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/44f2d46b-3f75-490a-2227-bd06011816b4.png)

　「visualize」をクリックすると自動的に分析が開きます。
　初回もしくは一つのアカウントであればこのままこの分析を使ってください。
　しかし、複数のアカウントのTrailログを分析する予定であれば、一つの分析に複数のデータセットを取り込むことが可能になっていますので、「データの編集/プレビュー」にしておきましょう。

#●データセットの修正

　今回の目的は「AWS上で不要な変更や作成が行われていないか」を監視することです。
　ですが、全てのTrailログを取得すると、一番出力されるのは「List」や「Get」系のログになります。
　これらはほぼ安全ですし、いちいち気にしてられないので、データセットからこれらをフィルタリングしましょう。

　まず、データセットを編集します。
　「データの管理」から該当のデータセットを開くと「データの編集」があります。
![dataset_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/76eb4ea5-275a-d194-d174-5477b367e4ee.png)

　データセットを開いた後、左側のペインからフィルタを選択しましょう。
　「フィルタの追加」で「eventname」を選び、「カスタムフィルタ」で「次を含まない」にしてからテキストボックスに「List」および「Get」を入力します。それぞれフィルタを作成するため、二つのフィルタが出来上がりますが、これらは or で結ばれます。
![dataset_filter_field.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/a4df258e-8dd6-1e24-17b8-4910ee0d3a46.png)![dataset_filter_get.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/88d2fdc7-7d74-3599-78d7-d682f9109f43.png)![dataset_filter_list.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/d45083ba-ab40-5515-dddb-fabae48b9be3.png)
![dataset_filter_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/ba08b445-b5c2-1ac3-10b6-35c3765145d0.png)

**注１！　カスタムフィルタリストだとまとめて記入できますが、and条件のため上手くフィルタできません。**
**注２！　フィルタは分析にも存在しますが、そこでは「次を含まない」という条件が選択できません。**

　**最後に、画面上部にある「保存」を忘れないようにしてください。**
　「保存して視覚化」だと、不要な分析が出来上がりますので使わないようにしましょう。
![dataset_save.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/a8fa2241-6992-eacd-408e-6b646ba63e51.png)

　これらの作業を作成されたデータカタログ全てに行います。

#●分析でIAM行動を分析する

　自動的に出来上がった分析には、一つのデータセットが取り込まれています。
　まずは一つのデータセットを分析してみましょう。

##・IAM操作イベントをチェックするために全イベントを集計

　ではまず、IAMでどんな操作が行われたかを分析してみます。
　左側の「視覚化」をクリックし、フィールドリストを開きます。

　画面下部の「ビジュアルタイプ」はピボットテーブルを選択しておきます。
　ビジュアルの左側の＋に合わせて「eventname」をドラッグしましょう。すると、eventnameを軸としたテーブルができあがります。
※上手くいかない場合は画面上部のフィールドウェル部分をクリックして、行のところにeventnameをドラッグしましょう。
![visual_eventname_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/7804888d-69da-49e8-e6d5-ba493596366d.png)
　その次にフィールド上部の＋に合わせて「eventsource」をドラッグします。上手くいかない場合はフィールドウェルを開いて、列のところにドラッグしましょう。
　これで、全てのAPIイベント（List、Get除く）がイベントソース（API発行先）ごとにまとまります。
![visual_eventsource_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/40330d27-5f84-5fc4-eac4-14c462aa007c.png)
![visual_allevent.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/644729c9-af84-e443-7643-659c922fb0cf.png)



##・IAMのみを抽出する

　この中で調べたいのはIAMに関するもののみです。
　ですので、ここでフィルタを作成します。
　
　フィルタを新規作成し、
![filter_choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/58fbdb15-0786-6d2d-6504-325641900d2e.png)![filter_add_action.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/46beae76-4462-93c9-968a-15f2eefcd387.png)

　
>　上部：すべてのビジュアル　→　全てのフィールドで同じフィルタを適用します。ここであれば「このビジュアルのみ」で。
　フィルタタイプ：フィルタリスト
　値を検索：iam

　にすると、iam.amazonaws.comが表示されますので、チェックしましょう。
![filter_eventsource_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/73ccc4dd-af8b-797a-0c73-7738d5fcdced.png)
　適用後に閉じると、フィールドにはiamのイベントのみが表示されます。
![visual_event.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/44ba232e-6cb0-6dbc-7780-52ee1038d114.png)

##・日時指定コントロールを作成する

　先ほどIAMにイベントソースを絞ってしまいましたが、これだと、閲覧ユーザーは自由に他のイベントソースを調べることはできません。
　日時やイベント内容についても、取り込んでいる全ての日時や内容が表示されてしまいます。
　では、利用者に自由にフィルタリングさせるためにはどうしたらよいでしょう？
　その答えが、フィルタリングです。

　※逆に選択肢が多いと作業が煩雑になるので、固定化するのも一つのやり方です。
　　それぞれの業務に合った方法を選びましょう。

　パラメータを選択し、上部の＋から新規作成します。
![parameter_buttom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/4fc3ba4c-f5af-d021-ca58-94108971d4d3.png)

　名前は適当に決めてください。後ほど述べる理由から、データセットが想定できる名称が良いかもしれません。
　ここでは、日時を選択させるという前提で「date」にします。
　デフォルト値も自分の目的にあった適当な値にしてください。
![parameter_add_date.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/f91c7d2d-8d31-ee3c-735a-d6a5a14d2a11.png)

　ユーザーに自由に選択させる場合は「動的デフォルト値を設定」を選択します。
　※動的でなくても選択肢が少なければ単一もしくは複数の固定値を選択させることもできます。

　データセットを選択します。
![parameter_dynamic_date.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/0c50c581-f0ea-bd82-7414-72fbea57e557.png)

　ここで、その分析フィールドが使用しているデータセットを選ばないと、そのデータセットに含まれていない値は出てきません。
　例えば、CreateUserで検索しようとしても、そのAPIが発行されていないデータセットを選択していると、そもそも表示されません。
　ユーザー名列は参照したいフィールドを選択してください。
　この場合は「day」になります。
　デフォルト値の列も同様です。ここではなぜかdayが選べなかったので「eventtime」にしてあります。

　作成後にサブウインドウを閉じ、出来上がったdateパラメータの∨をクリックすると「コントロールを追加」とあります。
　これで、分析フィールドの画面上部にコントロールができあがりました。
![contorol_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/2870a8ce-e753-66ab-4bff-a8e1a0e0c6e3.png)　![contorol_add_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/e183077d-c9dc-f6d8-a7a6-7dc4d902b4d8.png)
![contorol_date.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/2dff133f-0d76-d70f-53ac-0527fe40601d.png)

##・コントロールとフィルタを結びつける

　コントロールを作っただけでは、機能しません。
　指定された日付を利用してフィルタリングすることが必要になります。

　ここで、再びフィルタに戻ります。

![filter_date_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/a42e35ea-9a32-1ede-4445-0296d596b73b.png)

>　上部：全てのビジュアル
　フィルタタイプ：期間、以降（特定の日付のみを検索したい場合は「次の間」にして、二つのパラメータにdateを選択）
　パラメータを使用：チェック
　開始日のパラメータ：作成したパラメータ（上記と同じだとdate）
　この日付を含める：チェック

　適用して閉じると、コントロールで選択した日付以降のイベントのみが表示されます。

##・APIを発行したユーザーを特定する

　さて、これで日付を絞って、いつ、どんなAPIが発行されたかが分かりました。
　ですが、肝心なのは「誰が」このAPIを発行したか、です。

　そこで、もう一つ別のパラメータを作りましょう。
　イベント名に関するパラメータです。
![parameter_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/b68ba628-ae08-0942-9092-68246b458971.png)

>　名前：eventname
　データタイプ：文字列
　値：単一の値
　動的デフォルト値を設定

![parameter_dynamic_event.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/676eb502-de2c-bbde-b7a2-78c57700c5c6.png)

>　データセット：適したものを選択
　ユーザー名列：eventname
　デフォルト値列：eventname

　さらにこれを使ってフィルタを作ります。
![filter_eventname.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/72a4e526-562f-f5ff-103c-7c028ac01f29.png)

>　フィルタ：eventname
　上部：すべてのビジュアル
　フィルタタイプ：カスタムフィルタ、次と等しい
　パラメータを使用：チェック
　パラメータ：eventname

　こうすることで、分析フィールドにイベント名コントロールが作成され、フィルタ条件と紐づきました。
![contorol_all.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/1a6fcfc3-ee00-5899-d1f0-0539984c8f40.png)

　最後に、該当APIを発行したユーザーを特定する分析項目を作成しましょう。

##・IAM操作ユーザー分析項目

　視覚化の項目に戻ります。
　eventnameを表示しているのと同じデータセットを選択するのを忘れないでください。
![bunseki_dataset_choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/b598437e-8d55-d4dd-dd3a-7b2284b75d3a.png)

　画面左上に「＋追加」とあるので、そこで「ビジュアルを追加」します。
　すると、新しいビジュアルが追加されます。
　ここに新しいフィールドを追加していきます。
![add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/d6c63820-a3ce-f281-ee55-32b02ebaeba6.png)

　画面下部のビジュアルタイプはピボットテーブルを選択します。
　まず、「json_useridentity」をビジュアル左側の＋にドラッグします。
![visual_jsonuseridentity_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/d46be5d2-441d-a9ff-690d-d44e9a6f2284.png)
![visual_iam_count.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/0c9d743f-ae95-71d4-3673-4b68637ab6ac.png)

　次に「eventname」をビジュアルの上側の＋にドラッグします。
![visual_iam_user_not_source.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/726752d9-02ab-728d-c9aa-9c9680fa99fc.png)

　最後に「eventsource」をビジュアルの左側の＋にドラッグします。
![visual_iam_user_count.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/afe03932-815e-7eb5-ffc9-bdabc13dcd60.png)


#●完成、検索

　これでIAMに関するイベントを日付単位で検索し、特定のAPIを発行したユーザーを知ることができるようになりました。
![visual_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/39eb4e8b-e804-336c-26dc-18b924c1bea5.png)
![visual_iam_user.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/61445325-2656-7963-8972-b55c40638a1e.png)

　・コントロールの日付に捜索したい日付を入力
　・イベント検索用のビジュアルから、API発行者を特定したいイベント名をコピー
　・コントロールのイベント名にコピーしたイベント名をペースト
　・連動してIAMユーザー検索用のビジュアルにAPIを発行したIAMユーザーが表示される

```json:json_useridentity
{"type": "AssumedRole", "principalId": "AxxxxxxxxxxxxxxxY:ixx-axxxxixx", "arn": "arn:aws:sts::7xxxxxxxxxx7:assumed-role/axxxxx_xxxxon-vpc-axxx-ixx/ixx-xxxxxmxx", "accountId": "7xxxxxxxxx7", "accessKeyId": "xxxxxxxxxxxxxxxxx", "sessionContext": {"attributes": {"mfaAuthenticated": "true", "creationDate": "2019-07-19T11:49:52Z"}, "sessionIssuer": {"type": "Role", "principalId": "AxxxxxxxxxxxY", "arn": "arn:aws:iam::7xxxxxxxxx7:role/axxxxx_xxxxxn-vpc-axxxx-ixx", "accountId": "7xxxxxxxxxx7", "userName": "axxxx_xxxxxn-vpc-axxxx-ixx"}}}
```

　IAMユーザー部分はJSONになっているため見難いですが、json_useridentity部分をトリプルクリックすると全選択になり、エディタにコピペすればユーザー特定はできます。
　queryでJSONをいちいち開いている時間があれば、こちらの方が断然早いです。

#●複数データセットの取り込み

　複数のアカウントを分析する場合は、一つの分析フィールドでは分析しにくいです。
　そのため、分析フィールドをタブで分けて、それぞれのアカウントを分析するようにした方が良いと思われます（まだ試行錯誤中）。
　まずは複数のデータセットを取り込んでみましょう。

　分析画面の左上にウィザード（鉛筆？）ボタンがあります。
![bunseki_dataset_add_buttom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/c531905e-7bcc-6eeb-4be7-9da168d8e559.png)

　クリックすると、データセットの追加が可能になります。（同時に、削除、置き換え、編集も可能です）
![bunseki_dataset_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/baa416c5-e8bd-2399-b6a7-d55ac934c21a.png)
![bunseki_dataset_add_choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/41419ef2-64ed-4e34-a1ec-6a94bf3434f5.png)
　その後、コンポボックスでデータセットを切替、ビジュアルフィールドの画面上部にある＋からタブを追加すれば、複数のアカウントのデータ分析が分かりやすくビジュアル化できます。
![bunseki_dataset_choice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/53423576-1751-4a62-df35-5ea88050b149.png)


#●データセットを取り扱うことに対する注意点

　データセットを取り込んでいくと、画面右上にあるSPICEが足りなくなってきます。
　これは、オレゴンリージョンに遷移して管理画面を開けば、新たに購入することができます。
　GBあたり$0.38/月ですので、必要な容量を購入してください。
![spice_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/3fd8f2f3-d204-eebe-684f-6b8e28f0690e.png)
![spice_buy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/c31a0f71-ad3e-6c6e-e3e8-92165bbd10a3.png)

　データセットはそのままだと更新されません。
　データセットのアイコンをクリックすると、「更新スケジュール」を決めることができます。
![dataset_menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/139d2349-2d60-bd88-4d76-abba91051851.png)
![dataset_schedule_make.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/f48db238-1f9f-1947-f45e-ade00634dadd.png)
![dataset_schedule_detail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/7eeee0cc-e3aa-5947-7818-786a1a1346ab.png)

　Glueジョブの更新頻度とは別に、QuickSightに取り込むための頻度になりますので、ジョブの頻度と合わせて考慮してください。
　当然、取り込んでいけばいくほど費用がかかります。

#●ダッシュボードの共有

　最後に、作成した分析は閲覧のみユーザーと共有することができます。
　分析の上部にある「共有」から「ダッシュボードの共有」をクリックすると、ユーザーを招待し、そのダッシュボードに限った閲覧を許可することも可能です。
![bunseki_kyoyu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66713/43fe4e2b-4fd9-0936-5535-14eb64f3e21f.png)


#●QuickSightは慣れないと大変、でも慣れると……

　最初は大変だなぁと思っていたQuickSightですが、使い始めてしばらく経つと「あ、こっちの方が見やすいな」「こうやった方が分析がしやすいな」など、様々なアイデアが思い浮かんできます。
　先ほどのコントロールも、eventsourceで検索できるようにすれば、IAMだけでなく全てのイベントを検索することが可能になります。
　また、他の項目を組み合わせることで、より管理が簡便になることでしょう。
　皆さんもぜひ、自分なりのTrail管理法を見つけてみましょう。