CloudWatch Logs InsightsとFlowLogs＋Athenaでログ分析（準備編）

##CloudWatch
- 目的
    - 監視
    - ログ取得
- 用途
    - ホストに入らずログを確認できる
    - ログを保存期間を定めて、その期間ログの消失を防ぐ
    - 障害発生時、起動しないEC2のログをS3に保存する設定をしておくことで確認できる
    - ログを改ざんに気づける
    - ログローテーションされてもログを見るられる

##SystemsManager（SSM)
- SystemsManagerとは
    - AWSのインフラストラクチャを可視化し、制御する
    - AWSサービスの運用データを確認でき、運用タスクを自動化できる
- 自動化ツール
    - インベントリ
    - オートメーション
    - ランコマンド
    - パッチマネージャー
    - メンテナンスウィンドウ
    - ステートマネージャー
    - パラメータストア

###Run Command
- 対象
    - Windows/Linux
- 用途
    - ログインせずにコマンド実行
    - 実行をCloudTrailで追跡可能
    - タイムアウトやリトライ回数制御
    - 実行対象はタグ、インスランス指定
    - 実行内容はドキュメントとしてJSONで定義
- デフォルトで用意されているドキュメント
    - SSMAgentアップデート
    - EC2Configアップデート
    - コマンド実行（Shell/powershell）
    - Dockerアクション
    - AD参加
    - Windowsアップデート
    - msiインストール
    - など...
- 備考
    - 実行結果が2500文字までしか見れない（それ以上全てみる場合はS3に保存する）
    

###パラメータストア
- 用途
    - 値の一元管理
    - パスワード、ライセンスキー等を管理
    - 文字列またはリストを指定可能
    - 暗号化も可能
    - {{ssm変数名}}


###SSMからパラメータストアを作成し、保存する
- 作成手順
    - 左ペインの最下部に移動して[パラメータストア]を選択
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/be1e6215-0315-af20-ca29-e3d308d552c1.png width=50%>

    - オレンジ色の[パラメータの作成]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/4f24004d-0e10-aa5b-58e9-f1c94fdecd3d.png)
    - [名前]と[値]を入力し、オレンジ色の[パラメータの作成]をクリック
    - ※値の入力例は画像以下の「パラメータの値」を参考にしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/0d181d91-55e4-31e4-52ef-7664de6d957e.png)

- パラメータの値

```
{
    "logs": {
        "logs_collected": {
            "files": {
                "collect_list": [
                    {
                        "file_path": "/var/log/httpd/*-access_log",
                        "log_group_name": "isftest.ml",
                        "log_stream_name": "{instance_id}-access_log",
                        "timezone": "Local",
                        "timestamp_format": "%b %d %H:%M:%S"
                    },
                    {
                        "file_path": "/var/log/httpd/*-error_log",
                        "log_group_name": "isftest.ml",
                        "log_stream_name": "{instance_id}-error_log",
                        "timezone": "Local",
                        "timestamp_format": "%b %d %H:%M:%S"
                    },
                    {
                        "file_path": "/var/log/messages",
                        "log_group_name": "/var/log/messages",
                        "timezone": "Local",
                        "timestamp_format": "%b %d %H:%M:%S"
                    },
                    {
                        "file_path": "/var/log/secure",
                        "log_group_name": "/var/log/secure",
                        "timezone": "Local",
                        "timestamp_format": "%b %d %H:%M:%S"
                    }
                ]
            }
        }
    }
}
```


###EC2にCloudWatchエージェントをインストール
- 
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance-fleet.html


###CloudWatch Logs Insights クエリ構文

- https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html



##Amazon Athena
- AmazonAthenaとは
    - 標準SQLを使用してアドホッククエリの実行を開始できる
    - サーバーレスであり、インフラストラクチャの設定管理は不要
    - 実行したクエリのみに課金される
    - 自動的にスケールするため大規模なデータセットや複雑なクエリでも結果が早い
- 用途
    - S3に保存された非構造化・構造化データを分析できる
    - CSV 形式、JSON 形式、列データ形式に対応
    - AthenaはAmazonQuickSightと統合しているため、データを簡単に可視化できる
    - DBCやODBCを介してBIツールやSQLクライアントに接続し、レポート生成・データ探索を行う
    - AthenaはAWSGlueデータカタログを統合することで永続的なメタデータストアを提供
- アクセス
    - AWS マネジメントコンソール (JDBC または ODBC 接続経由)
    - Athena API 
    - Athena CLI
- テーブル、データベース、およびデータカタログの理解
    - テーブルのメタデータはS３内のデータ保存先と列名、データ型、テーブル名のデータ構造を指定
    - クエリ対象のデータセットごとに基となるテーブルが必要
    - テーブルに取得したクエリの結果が返される
    - 事前にAthenaにテーブルを登録しておく必要があり、手動か自動で行う

###テーブルの手動作成方法
- Athena コンソールを使用してテーブル作成ウィザードを実行します。
- Athena コンソールを使用して Hive DDL ステートメントをクエリエディタに書き込みます。
- Athena API または CLI で DDL ステートメントを使用して SQL クエリ文字列を実行します。
- Athena JDBC または ODBC ドライバーを使用します。

- ドキュメント
    - https://docs.aws.amazon.com/ja_jp/athena/latest/ug/what-is.html
    - https://docs.aws.amazon.com/ja_jp/athena/latest/ug/vpc-flow-logs.html

###VPCFlowLogsのS3に保存したものを基にAthenaでテーブル作成
- 手順
    - S3バケットを作成する(作成手順は省略）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/4bae50c9-00d5-6698-1533-768020a77527.png)

    - 任意のVPCをクリックし、[アクション]>[フローログの作成]をクリックする。    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/52a32e6d-1838-ecc9-7b5c-5ee83b5465b7.png)

    - 送信先を[S3バケットへの送信]に変更し、[S3バケットARN]を入力し、[作成]をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/6426198c-4148-2ef2-7377-2c7925e30ab3.png)

    - 指定したS3バケット内にファイルがされることを確認
    - サービス名[Athena]を選択
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/32700c26-d09d-642d-f4aa-7fd332ddf1cb.png)

- [新しいクエリ]に以下のDLLステートメントをコピーし、一部各自環境に併せて修正する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/2daa3fe3-0c61-bcb3-50b9-ed925923a7c1.png)

```
CREATE EXTERNAL TABLE IF NOT EXISTS vpc_flow_logs (
  version int,
  account string,
  interfaceid string,
  sourceaddress string,
  destinationaddress string,
  sourceport int,
  destinationport int,
  protocol int,
  numpackets int,
  numbytes bigint,
  starttime int,
  endtime int,
  action string,
  logstatus string
)  
PARTITIONED BY (dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
LOCATION 's3://your_log_bucket/prefix/AWSLogs/{subscribe_account_id}/vpcflowlogs/{region_code}/'
TBLPROPERTIES ("skip.header.line.count"="1");
```
- [prefix]と[{subscribe_account_id}]、[{region_code}]の情報は以下の写真を参照
　　<img width="1370" alt="スクリーンショット 2019-05-30 11.04.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/5af543f4-5ca2-0882-b941-2d0b1eb93538.png">

-  S3の[location]を変更し、[新しいクエリ]にコピーして実行する
```
ALTER TABLE vpc_flow_logs
ADD PARTITION (dt='YYYY-MM-dd')
location 's3://your_log_bucket/prefix/AWSLogs/{account_id}/vpcflowlogs/{region_code}/YYYY/MM/dd';
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304415/57b30634-3586-4fe0-0c2d-72e0fe40e71d.png)


- ドキュメント
    - フローログについて
        - https://qiita.com/okochang/items/4c032ffe296baafa06e7


#用語
- ビジネスインテリジェンスツール（BIツール）
    - 企業に蓄積された大量のデータを集めて分析し、迅速な意思決定を助けるツール
- アドホッククエリ
    - Facebookが公開した新しい分散処理基盤，Presto
    - 超大規模なデータセットに対してインタラクティブに結果を返せるようにと開発
    - 中間データをメモリが持つことで高速化しているため、メモリキャパシティエラーの原因
    - 一回のクエリ内で，複数のデータソースからデータを参照できる
        - 複数データソース（HBase, Cassandra, MySQL, etc...）
- ODBC　（Open Database Connectivity)
    - 関係データベース管理システム (RDBMS) にアクセスするための共通インタフェース (API)
- JDBC　（Java Database Connectivity）
    - Javaアプリケーションからデータベースを操作するAPI
    - JDKのコアAPIとしてjava.sqlパッケージに実装されています