セッションマネージャのEC2操作ログのリアルタイム分析

## はじめに
皆さん、EC2インスタンスの操作はどのように行ってますか？

2018年9月に登場したSystemsManagerの1つの機能である**SessionManager**を使い
踏み台サーバを用意せず、EC2を操作しているインフラ管理者の方も増えてきたのではないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/5127def5-a3c5-508f-2cc8-fec6bc2f96fe.png)

**【参考】**
・ [AWS Systems Manager Session Manager][00]

## 本投稿の内容
[2020年11月17日にアップデート][01]がありました。
ストリーミングで出力されるログを**Amazon Elasticsearch Service**（以降、Amazon ES）に取り込み
Kibanaで可視化してみました！

>お客様は、セッションが終了するまで待つのではなく、セッション期間中、セッションログをCloudWatchに継続的にストリーミングできるようになりました。ログはJSONメッセージとして構造化され、セッションを開始するユーザー、インスタンスIDとセッションID、およびセッションからのコマンドと出力を識別します。セッションの期間中、構造化ログを継続的に受信して処理する機能により、ユーザーアクティビティの可視性が向上します。構造化ログを使用すると、セッションの開始や特定のコマンドの使用などの条件を簡単に検索して、セッションアクティビティの分析とトラブルシューティングに役立てることができます。

このアップデートでかなりログの完全性や信頼性が上がっているはず！！

**【参考】**
・ [Amazon CloudWatch Logs を使用してセッションデータをストリーミングする][02]

## 利用環境
| 項目 | 内容 |
|---------|---------|
| logstash (OSS版) | 7.9.3 |
| Java (Corretto) | 11.0.10+9-LTS |
| OS(EC2) | Amazon Linux2 (t3.small) |
| AMI ID | ami-0e999cbd62129e3b1 |
| Elasticsearch | 7.9 (latest) |
| Region | us-west-2 |
※投稿時点における最新版を採用しています。

**【構成図】**
・ CloudWatch Logsにリアルタイム出力されたログをLogstashがTailしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/9c3f9a77-f01b-bd43-2450-efdeb92da73a.png)

**【補足】**
・ Amazon ESへのログ格納にはElastic社のETLツールである**Logstash**を利用します。
・ Amazon ESはOSS版のため、LogstashもOSS版とし、バージョンも合わせています。
・ Amazon ESは**パブリックアクセス**とし、IPアドレス制御でセキュリティを確保しています。

**【参考】**
・ [Logstashとは][03]

## 実施内容
1. IAM Roleの作成
2. ロググループの作成
3. セッションアクティビティログの出力
4. SSM Agentバージョンアップ
5. Amazon ESのドメイン作成
6. Logstashの構築
7. スキーマ定義とデータ取り込み
8. ダッシュボードの作成

### 1. IAM Roleの作成
- EC2として構築するLogstashに割り当てるIAM Roleを作成します。
- `RoleForLogstash`を作成し、以下の2つのIAM Policyを割り当てます。

```json:CloudWatchLogsReadOnlyAccess
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "logs:Describe*",
                "logs:Get*",
                "logs:List*",
                "logs:StartQuery",
                "logs:StopQuery",
                "logs:TestMetricFilter",
                "logs:FilterLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```
```json:AmazonEC2RoleforSSM
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeAssociation",
                "ssm:GetDeployablePatchSnapshotForInstance",
                "ssm:GetDocument",
                "ssm:DescribeDocument",
                "ssm:GetManifest",
                "ssm:GetParameters",
                "ssm:ListAssociations",
                "ssm:ListInstanceAssociations",
                "ssm:PutInventory",
                "ssm:PutComplianceItems",
                "ssm:PutConfigurePackageResult",
                "ssm:UpdateAssociationStatus",
                "ssm:UpdateInstanceAssociationStatus",
                "ssm:UpdateInstanceInformation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2messages:AcknowledgeMessage",
                "ec2messages:DeleteMessage",
                "ec2messages:FailMessage",
                "ec2messages:GetEndpoint",
                "ec2messages:GetMessages",
                "ec2messages:SendReply"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstanceStatus"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ds:CreateComputer",
                "ds:DescribeDirectories"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketLocation",
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetEncryptionConfiguration",
                "s3:AbortMultipartUpload",
                "s3:ListMultipartUploadParts",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads"
            ],
            "Resource": "*"
        }
    ]
}
```

**【補足】**
・ 1つ目はLogstashがCloudWatch Logsのログを取得するための権限です。
・ 2つ目はSessionManager経由でLogstashを操作したり、ログ出力するための権限です。
・ ロググループを限定する場合は、Resoureceを限定するポリシーを別途作成します。

### 2. ロググループの作成
- `CloudWatch > CloudWatch Logs > Log groups`でロググループの作成をおこないます。
- ロググループ名は好きな名前をつけましょう。(今回は**SessionActivityLogs**としています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/32d6f954-1659-1aa6-0459-121c510bb656.png)

**【補足】**
・ 保持期間はデフォルト無期限ですが、必要に応じて変更してください。
・ ログの暗号化が必要な場合は、KMS鍵オプションを利用してください。

### 3. セッションアクティビティログの出力
- `Systems Manager > Session Manager > 設定`で設定画面に移動します。
- 編集ボタンを押して、設定をおこないます。
- `CloudWatch logging`を**Enable**とします。
- `Choose your preferred logging option`を**Stream session logs(デフォルト)**とします。
- `CloudWatchのロググループ`から作成したロググループ(**SessionActivityLogs**)を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/d44d4044-e595-1eb6-09e3-39e07fb35f71.png)

- 最下部の**保存ボタン**を押して設定を保存します。

**【補足】**
・ ログを暗号化している場合は、**Allow only encrypted CloudWatch log group**にチェックを入れてください。

### 4.SSM Agentバージョンアップ
- ログがCloudWatch Logsに出るか、試しに適当なEC2に接続してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/2fb50d6f-c99b-4737-9c40-e7f959f4ae89.png)

- すると以下のエラーが出て、接続に失敗します。(SSM Agentのバージョンアップが必要とのこと)

> The SSM Agent version installed on this instance doesn't support streaming logs to CloudWatch. Either update the SSM Agent to the latest version, or disable the streaming logs option in your preferences.

- 2021年2月13日時点のデフォルトのSSM Agentバージョンは**3.0.161.0**になっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/89c16390-48d2-693a-db85-675009130fb1.png)

- `Systems Manager > Run Command`からバージョンをあげます。
- **AWS-UpdateSSMAgent**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/f62ce6a2-909a-c39a-5752-ca7eb4d495f5.png)

- `インスタンスを手動で選択する`でアップデートしたいEC2インスタンスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/ea3b46ec-6076-9378-00cd-c4fe3712fdf9.png)

- 最下部の**実行ボタン**を押してバージョンアップを開始します。(数分で完了します)
- 再度接続にチャレンジします。(バージョンが**3.0.655.0**になりました)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/0271df9a-3fe5-58e2-3a3c-6d8d78830ea0.png)

- 適当に**sudo su**したり、**改行**してみたり、**ls**してみたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/de591816-5dec-66a3-c2b3-0df4addd3b57.png)

- なんと、すぐにCloudWatch Logsのロググループに打ったコマンド単位でログが出力されています！！
- 下記のログは**ls**した時のものになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/84ebe197-8eaa-bf85-9c77-ca7e31c77f53.png)

- CloudWatch Logsに出力されるセッションアクティビティログのフォーマットは以下のようになってました。

| 項目 | 値(サンプル) | 説明 |
|---------|---------|---------|
| eventVersion | 1.0 | ログイベント形式のバージョン |
| eventTime | 2021-02-13T13:23:56Z | イベントの発生日時(UTC) |
| awsRegion | us-west-2 | EC2の存在するAWSリージョン |
| target.id | i-0e111111111222xxx | 操作対象EC2のインスタンスID |
| userIdentity.arn | arn:aws:iam::AWSアカウント:user/IAMユーザ | 操作しているユーザのARN |
| runAsUser | ssm-user | EC2のOSへログインしたユーザ名 |
| sessionId | hibino-0d95217a3276b8641 | SessionManagerのセッションID |
| sessionData | "sh-4.2$ sudo su" | OSで実行したコマンドとその戻り値 |

- Amazon ESを使って、**sessionData**を全文検索することでユーザ操作の監査がかなりの精度で出来そうですね！

### 5. Amazon ESのドメイン作成
- 下記内容でAmazon ESのドメインを作成します。

|項目 | 値 |
|---------|---------|
| リージョン | us-west-2 |
| デプロイタイプ | 開発およびテスト |
| Elasticsearchのバージョン | 7.9 (latest) |
| Elasticsearchのドメイン | test-es |
| インスタンスタイプ | t3.small.elasticsearch |
| ノードの数 | 1 |
| データノードのストレージタイプ | EBS |
| EBS ボリュームタイプ | 汎用(SSD) |
| EBS ボリュームサイズ | 10 GiB |
| 自動スナップショットの開始時間 | 00:00 UTC (デフォルト) |
| ネットワークアクセス | パブリックアクセス |
| 細かいアクセスコントロールを有効化 | 無効 |
| KibanaのSAML認証 | 無効 |
| Amazon Cognito認証を有効化 | 無効 |
| ドメインアクセスポリシー | カスタムアクセスポリシー (IPv4アドレス) |
| ドメインへのすべてのトラフィックにHTTPSを要求 | 有効 |
| ノード間の暗号化 | 有効 |
| 保管時のデータの暗号化の有効化 | 有効 |
| KMSマスターキー | (デフォルト) aws/es |

- アクセスポリシーに追加するIPは、Amazon ESにアクセスする自宅IPとLogstashのIPになります。

```json:ドメインアクセスポリシー
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:us-west-2:<AWSアカウント>:domain/test-es/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "<自宅IP>/32",
            "<LogstasのEIP>/32"
          ]
        }
      }
    }
  ]
}
```

### 6. Logstashの構築
- Logstashの構築手順は、[Amazon Corretto 11で構築するLogstash][04]になります。
- 下記のパイプライン構成ファイル(`/etc/logstash/conf.d/logstash.conf`)を作成します。  
  (このタイミングではLogstashのプロセスは起動しません)

```console
$ sudo vi /etc/logstash/conf.d/logstash.conf
```

- 下記の内容を上記のパイプライン構成ファイルに記述します。

```json:logstash.conf
input {
  ## CloudWatch LogsのSessionActivityLogsのロググループから5秒間隔でログ取得
  cloudwatch_logs {
    log_group => [ "SessionActivityLogs" ]
    region => "us-west-2"
    interval => 5
  }
}

filter {
  ### JSONパーサーによる解析
  json {
    source => "message"
  }
  ### dateフィールドから@timestampを抽出
  date {
    match => [ "eventTime", "ISO8601" ]
    timezone => "UTC"
    target => "@timestamp"
  }
  ### @timstampから日本時間を抽出
  ruby {
    code => "event.set('[@metadata][local_time]',event.get('[@timestamp]').time.localtime.strftime('%Y-%m-%d'))"
  }
  ### document_idに利用する一意のIDを作成
  fingerprint {
    source => "message"
    target => "[@metadata][fingerprint]"
    method => "MURMUR3"
  }
  ### フィールドの追加と削除
  mutate {
    ### typeフィールドを追加
    add_field => { "type" => "log-aws-ssm-sessionlog" }    
    ### 不要なフィールドを削除
    remove_field => [ "eventTime", "message" ]
  }
}

output {
  ### 出力先のAmazonESのIndexを指定
  elasticsearch {
    hosts => [ "https://search-test-es-xxxxxxxxxxxxxxxxxxxxxx.us-west-2.es.amazonaws.com:443" ]
    index => "%{type}-%{[@metadata][local_time]}"
    document_id => "%{[@metadata][fingerprint]}"
    ilm_enabled => false
  }
}
```

**【参考】**
・ [cloudwatch-logs input][05]
・ [json filter][06]
・ [date filter][07]
・ [ruby filter][08]
・ [fingerprint filter][09]
・ [mutate filter][10]
・ [elasticsearch output][11]

### 7. スキーマ定義とデータ取り込み
- Amazon ESの`Kibana`のURLをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/44aaaf2c-154c-3131-2d85-02413b6dc979.png)

- Kibanaの初回アクセス時に下記の画面が表示されます。
- サンプルデータを使用しないので、**Explore on my own**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/ed1866c2-22ef-8484-729d-2f237d0c8da7.png)

- Consoleをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/c2d05fa9-9fd2-8ace-f539-0baa783d2be7.png)

- Consoleからセッションアクティビティログ用のIndex Templateを追加します。
- **"acknowledged": true**となれば、Index Templeteの登録はOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/05e7c907-5db2-c677-04ee-71bd5419cd97.png)

- 上記で張り付けたIndex Templateは以下の通りです。

```json:index_templete_log-aws-ssm-sessionlog
PUT _template/log-aws-ssm-sessionlog
{
  "index_patterns": ["log-aws-ssm-sessionlog-*"],
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas" : 1
  },
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "@version" : {
        "type" : "keyword"
      },
      "eventVersion" : {
        "type" : "keyword"
      },
      "awsRegion" : {
        "type" : "keyword"
      },
      "target.id" : {
        "type" : "keyword"
      },
      "userIdentity.arn" : {
        "type" : "keyword"
      },
      "runAsUser" : {
        "type" : "keyword"
      },
      "sessionId" : {
        "type" : "keyword"
      },
      "sessionData" : {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 8191
          }
        }
      },
      "type" : {
        "type" : "keyword"
      },
      "tags" : {
        "type" : "keyword"
      },
      "cloudwatch_logs" : {
        "properties" : {
          "event_id" : {
            "type" : "keyword"
          },
          "ingestion_time" : {
            "type" : "date"
          },
          "log_group" : {
            "type" : "keyword"
          },
          "log_stream" : {
            "type" : "keyword"
          }
        }
      }
    }
  }
}
```

**【補足】**
・ sessionDataフィールドは全文検索することが想定されるため`text型`としています。
・ Kibanaで時系列データとして扱うための時刻フィールドは`@timestamp`としています。
・ 他フィールドは完全一致検索やKibanaの可視化に利用するため`keyword型`としています。

- ここでLogstashを起動します。

```console:logstash_start
$ sudo systemctl start logstash
$ sudo systemctl status logstash
● logstash.service - logstash
   Loaded: loaded (/etc/systemd/system/logstash.service; enabled; vendor preset: disabled)
   Active: active (running) since Sat 2021-02-13 14:54:43 UTC; 1s ago
 Main PID: 32506 (java)
   CGroup: /system.slice/logstash.service
           └─32506 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djruby.compile.invok...

Feb 13 14:54:43 ip-172-31-12-56.us-west-2.compute.internal systemd[1]: Started logstash.
Feb 13 14:54:43 ip-172-31-12-56.us-west-2.compute.internal systemd[1]: Starting logstash...
Feb 13 14:54:43 ip-172-31-12-56.us-west-2.compute.internal logstash[32506]: OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a...re release.
Hint: Some lines were ellipsized, use -l to show in full.
```
- `GET _cat/indices/log-aws-ssm-sessionlog*`を実施し、インデックスが生成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/ced3e3a8-b6a9-0a33-a245-6de43b5bf5a3.png)

- [Stack Management] > [Index Patterns]で**Create index pattern**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/d6f51767-c37b-0092-0bc2-9a584c55c834.png)

- `log-aws-ssm-sessionlog-*`という名前でIndex Patternを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/3ad861fc-dd30-c4c8-84ea-e594715d2771.png)

- `@timestamp`を指定し、**Create index pattern**をクリックします。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/968ee859-aba8-4e9e-c330-8641a3cc365e.png)

- [Discover]を開き、Index Patternに`log-aws-ssm-sessionlog-*`を指定します。
- デフォルトでは直近15分間のログが表示されます。15分で表示されない場合はTodayとかにしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/1f40ef02-1008-2fa6-fcd4-2039ce6b834a.png)

- 取り込んだログは以下のような感じです。

```json
{
  "_index": "log-aws-ssm-sessionlog-2021-02-13",
  "_type": "_doc",
  "_id": "2962024441",
  "_version": 1,
  "_score": null,
  "_source": {
    "runAsUser": "ssm-user",
    "cloudwatch_logs": {
      "ingestion_time": "2021-02-13T15:15:50.046Z",
      "log_group": "SessionActivityLogs",
      "log_stream": "hibino-07ffa10afb273b008",
      "event_id": "35976216682055508680804654953801519308351663213472448512"
    },
    "eventVersion": "1.0",
    "@version": "1",
    "type": "log-aws-ssm-sessionlog",
    "sessionData": [
      "\u001b]0;root@ip-172-31-12-56:/usr/bin\u0007[root@ip-172-31-12-56 bin]# ",
      "\u001b]0;root@ip-172-31-12-56:/usr/bin\u0007[root@ip-172-31-12-56 bin]# "
    ],
    "target": {
      "id": "i-0e111111111222xxx"
    },
    "sessionId": "hibino-07ffa10afb273b008",
    "awsRegion": "us-west-2",
    "@timestamp": "2021-02-13T15:15:50.000Z",
    "userIdentity": {
      "arn": "arn:aws:iam::123456789012:user/hibino"
    }
  },
  "fields": {
    "@timestamp": [
      "2021-02-13T15:15:50.000Z"
    ],
    "cloudwatch_logs.ingestion_time": [
      "2021-02-13T15:15:50.046Z"
    ]
  },
  "sort": [
    1613229350000
  ]
}
```

### 8. ダッシュボードの作成
- まず、[Discover]で下記のフィールドを**Add**をします。
- `awsRegion`、`runAsUser`、`sessionId`、`target.id`、`userIdentity.arn`が**Selected fields**にあることを確認します。
- 以下のようにDiscoverで表示されるログの表示項目が変わったことが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/5117b9e4-ee5e-dac5-dd1c-fbd2a1ca17d7.png)

- 画面上部の**Saveボタン**でこの検索条件を保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/b6eadce1-8db6-5d97-cd9e-cc23c385f271.png)

- 好きな名前(今回は**sessionlog_search**)をつけて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/0caca843-82ab-68be-d714-6e64e4fd7da1.png)

- 次は、[Visualize]を開き、**Create new visualization**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/5148ce1b-b1b1-1cce-434c-3536fa05a558.png)

- グラフの中から**棒グラフ(Vertical Bar)**を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/19852b83-4847-b735-67df-0caafe610cbc.png)

- `log-aws-ssm-sessionlog-*`を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/4997549d-f479-cba0-017a-fb8fb994b299.png)

- `Custom label`に**ログ件数**と入力します。(Y軸の名前)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/8ed8ea6d-2164-0379-b47d-2d53f9b97bbc.png)

- `Buckets`のAddをクリックし、**X-axis**を選択します。(X軸を設定します)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/57d1c0d8-c308-ce6f-359e-e6369ccaf8f9.png)

- 順に選択し、**Updateボタン**をクリックします。(X軸を`@timestamp`の値を時単位で設定)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/5544daf6-8079-f5bc-8773-23caa5b3b280.png)

- 適当に**Last 24 hours**を指定し、棒グラフの見栄えを整えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/bb7eec78-0778-2ed2-f28a-c974a07f13df.png)

- 上部の**Saveボタン**をクリックし、適当な名前をつけて棒グラフを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/1c89bb28-1516-d1f9-da6e-49ae9300cd1d.png)

- 次は、同じ要領で**表グラフ(Data Table)**を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/3f588b4b-8297-7f4b-daa5-0400e50c9eb5.png)

- `Custom label`に**ログ件数**と入力します。(表のカラム名)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/7d88a5fa-4b8d-6c63-4bfc-37a3c041e9ff.png)

- `Buckets`のAddをクリックし、**Split rows**を選択します。(特定のフィールドでグループ化する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/a60d0801-ec1d-424f-78e2-03cd5946b171.png)

- 順に選択し、**Updateボタン**をクリックします。(awsRegionフィールド値の上位10位を表示)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/97a2f442-1c49-fe84-26d4-ce57359c5892.png)

- AWSリージョンごとの表グラフになったことを確認し、**Saveボタン**をクリックして保存します。(適当な名前をつける)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/97101399-44a7-2888-e4f5-19bdd09b1fac.png)

- `Field`と`Custom label`を変更し、**Updateボタン**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/a46939a0-4b04-c67f-5394-d0d09e50536d.png)

- `Save as new visualization`のチェックをオンにし、別名をつけて表グラフを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/57df7734-9c6b-d625-e65f-e86b4295eed6.png)

- 上記と同様に`sessionId`、`target.id`、`userIdentity.arn`で表グラフを作成し、別名で保存します。

- 次は、同じ要領で**円グラフ(Pie)**を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/0b2bd9b8-35da-0965-77a5-6e1a06762348.png)

- `Custom label`に**ログ件数**と入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/2cac0140-32bd-0b66-cfb2-7866ec7eb384.png)

- `Buckets`のAddをクリックし、**Split rows**を選択します。(特定のフィールドでグループ化する)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/866e7d66-00c2-22b4-126f-a3d5d350c5d3.png)

- 順に選択し、**Updateボタン**をクリックします。(awsRegionフィールド値の上位10位を表示)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/2c9abfd5-72ff-e39e-607f-fd81dfa7bd9d.png)

- AWSリージョンごとの円グラフになったことを確認し、Saveボタンをクリックして保存します。(適当な名前をつける)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/626b9cb7-2d1e-ac7b-ea03-919ccf974ad1.png)

- 同様に`runAsUser`、`sessionId`、`target.id`、`userIdentity.arn`で表グラフを作成し、別名で保存します。

- 最後に、[Dashboard]を開き、**Create new dashboard**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/e7395584-a5f5-65cc-18a3-1f4b682d96e2.png)

- **Add an existing**をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/5ecad6c5-d9f8-0b05-c7a1-2841aaf0ba1e.png)

- これまで作成した検索条件とグラフを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/de06abf7-79da-5c94-d318-c3444d82ec43.png)

- 上部に棒グラフ、次に円グラフ、その下に表グラフ、最下部に検索条件を配置し、**Saveボタン**で保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/6ef4ce45-be60-4935-949d-9cfef67caceb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/e1a7c3fa-6c20-9358-b0cb-f95da803e8c3.png)

- 適当な名前をつけて、ダッシュボードを保存します。
- **Store time with dashboard**をオンにすると指定していた時間の範囲も合わせて保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/fd0cb98c-d812-c691-1acf-f49596f1c6a5.png)

## まとめ
とてつもなく長い投稿になってしまいましたが、いかがでしたでしょうか？

私がKibanaでよく利用するグラフは、棒グラフ、表グラフ、円グラフです。
それ以外は、ログ監査ではあまり利用していないのが実態です。

このダッシュボードの作りだと、各フィールドの値でフィルタリング(+または-)することが出来ます。
フィルタリングすることで再検索がかかり、見つけたいデータや情報を絞り込んでいくことが可能です。

これは使える！！と思われた方、ぜひLGTMを^^v


[00]:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html "AWS Systems Manager Session Manager"
[01]:https://aws.amazon.com/jp/about-aws/whats-new/2020/11/aws-customize-the-idle-session-timeout-and-stream-session-logs-t/ "2020年11月17日のアップデート内容"
[02]:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-logging.html#session-manager-logging-cwl-streaming "Amazon CloudWatch Logs を使用してセッションデータをストリーミングする"
[03]:https://www.elastic.co/jp/logstash "Logstashとは"
[04]:https://qiita.com/hssh2_bin/items/cbc9408f03fd81b1863a "Amazon Corretto 11で構築するLogstash"
[05]:https://github.com/lukewaite/logstash-input-cloudwatch-logs "cloudwatch-logs input"
[06]:https://www.elastic.co/guide/en/logstash/7.9/plugins-filters-json.html "json filter"
[07]:https://www.elastic.co/guide/en/logstash/7.9/plugins-filters-date.html "date filter"
[08]:https://www.elastic.co/guide/en/logstash/7.9/plugins-filters-ruby.html "ruby filter"
[09]:https://www.elastic.co/guide/en/logstash/7.9/plugins-filters-fingerprint.html "fingerprint filter"
[10]:https://www.elastic.co/guide/en/logstash/7.9/plugins-filters-mutate.html "mutate filter"
[11]:https://www.elastic.co/guide/en/logstash/7.9/plugins-outputs-elasticsearch.html "elasticsearch output"