【AWS】SSMを用いたシステム管理とデータ分析

# はじめに
この記事は、AWS Innovateの`[H-2] システム管理で使えるデータ分析ハンズオン：システム構成情報の収集と可視化`についての記事です。
SSMやQuickSightを利用してサーバレスなシステム管理・分析できる仕組みについてハンズオンを行います。
EC2等を新規で立ち上げる必要があるので、ハンズオン用のアカウントを取得する方がいいかもしれません。

## SSMとは
AWS Systems Managerの略です。

> AWS Systems Manager は、AWS でインフラストラクチャを表示および制御するために使用できる AWS のサービスです。Systems Manager コンソールを使用すると、複数の AWS のサービスのオペレーションデータを表示して、AWS リソース間でオペレーションタスクを自動化することができます。Systems Manager は、マネージドインスタンスをスキャンして、ポリシーの違反が検出された場合にはレポート (または是正策の措置) を行うことで、セキュリティを維持するのに役立ちます。

# ハンズオン開始
## IAMロールを作成する
EC2上でSSMのサービスを利用するためのロールを作成します。

AWSマネジメントコンソールから、IAMのページを開きます。
IAMロールを新規作成するので、`ロールの作成`をクリックします。
「ロールの作成」ページが表示されたら、`EC2`を選択し、右下の`次のステップ：アクセス権限`をクリックします。

ポリシーをアタッチする画面が表示されたら、フィルタの部分で「ssm」と検索します。
検索結果の中から、`AmazonSSMManagedInstanceCore`にチェックをつけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/6f4f8e72-1a9f-481d-0ea2-b750ab722efd.png)
チェックをつけたら、右下の`次のステップ：タグ`をクリックします。

タグの追加は、任意の項目なので、追加する必要はありませんので、右下の`次のステップ：確認`をクリックします。

ロール名には、任意の名前を指定してください。
例）`IAMRole-SSMRole-innovate2020spring`

名前の入力が完了したら、右下の`ロールの作成`をクリックします。

## EC2のSSMについて
Amazonが配布しているイメージにはSSMのエージェントが含まれているため、IAMロールを付与してパブリックネットワークで起動すれば、SSMの管理下になります。
プライベートリンクを利用する事で、完全にプライベートなインスタンスもSSMで管理する事が可能です。

今回のハンズオンではSSHやRDPでの接続は行わないため、セキュリティーグループやキーペアを利用しないインスタンスを作成します。

## EC2インスタンスの立ち上げ（Linux）
AWSマネジメントコンソールでサービスメニューからEC2を開きます。
左のメニューから、`インスタンス`を選択します。
インスタンスのページが表示されたら、`インスタンスの作成`をクリックして、インスタンスの作成を行います。

### ステップ 1: Amazon マシンイメージ (AMI)
左のメニューで`クイックスタート`を選択し、一番上の`Amazon Linux 2 AMI (HVM), SSD Volume Type`を選択します。

### ステップ 2: インスタンスタイプの選択
「t2.micro」を選択して、`次のステップ：インスタンスの詳細設定`を選択します。

### ステップ 3: インスタンスの詳細の設定
ネットワーク設定はSSMエージェントへアクセスできる必要があるため、パブリックサブネットもしくは、プライベートサブネットにプライベートリンクを設定したネットワークを指定してください。

今回は、デフォルトのネットワークを利用します。　

IAMロールの設定には、先ほど作成したIAMロールを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/970d2bd5-e407-fbd5-0e57-f100e6737bc2.png)

そのほかの設定は触りませんので、`次のステップ：ストレージの追加`をクリックします。
### ステップ 4: ストレージの追加
ここでは、何も変更しませんので、`次のステップ：タグの追加`をクリックします。
### ステップ 5: タグの追加
インスタンスの名前を指定します。
`タグの追加`を選択し、キーに`Name`、値に任意の名前を選択してください。
名前例）`innovate2020spring-linux01`

名前が指定できたら、`次のステップ：セキュリティグループの設定`をクリックします。
### ステップ 6: セキュリティグループの設定
`既存のセキュリティグループを選択する`をクリックします。
「default」というセキュリティグループが存在すると思いますので、そちらを選択します。
`確認と作成`をクリックします。
### ステップ 7: インスタンス作成の確認
IAMが正しく正しく設定されているかを確認して、`起動`ボタンをクリックします。

### 既存のキーペアを選択するか、新しいキーペアを作成します。
今回は、SSHやRDPする必要がないので、`キーペアなしで続行`を選択し、`インスタンスの作成`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/1ec35a84-2eca-8017-8f4d-3e88cff4506b.png)

## EC2インスタンスの立ち上げ（Windows）
AWSマネジメントコンソールでサービスメニューからEC2を開きます。
左のメニューから、`インスタンス`を選択します。
インスタンスのページが表示されたら、`インスタンスの作成`をクリックして、インスタンスの作成を行います。

### ステップ 1: Amazon マシンイメージ (AMI)
「クイックスタート」から、少し下の`Microsoft Windows Server 2019 Base with Containers`を選択します。

以降の手順は上記のLinuxと同様に設定します。

## 起動の確認
EC2インスタンスの確認画面で、2つのインスタンスが存在していることを確認できると思います。
インスタンスが立ち上がり次第、SSMエージェントが起動します。（ステータスチェックも完了している必要があります。）

## SSMインベントリの設定
サービスの検索で、`SSM`と入力して、System Managerを選択します。
左のメニューから`マネージドインスタンス`を選択します。

ページが開くと、先ほど起動したインスタンスが表示されている事が確認できると思います。
ここに2つ表示されていない場合は、上記の手順で起動した際に設定が上手くできていないか、インスタンスが起動していない可能性があります。

左のメニューから`インベントリ`を選択します。
ページが開いたら、`セットアップインベントリ`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/afa6878c-881f-d369-d98e-092ed43a64b3.png)

### セットアップインベントリ
**名前**
任意の名前を指定できます。
例）`Inventory-innovate2020-spring`

**ターゲット**
「このアカウントのすべてのマネージドインスタンスの選択」を選択します。

**スケジュール**
30分に指定します。

**パラメータ**
デフォルトのままにします。

**詳細設定**
今回はS3に書き込まないので、チェックは外しておきます。

**さいごに**
右下の`セットアップインベントリ`ボタンをクリックします。

## SSMインベントリの確認
SSMの左のメニューから`インベントリ`を選択します。
インベントリのダッシュボードの下に「対応するマネージドインスタンス」内のインスタンスIDを選択します。

インベントリタブを選択する事で、様々なタイプのインベントリを抽出する事が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/a72cb5f1-8e75-378c-d988-a749adc56ed8.png)

## リソースデータの同期
SSM Resource Data Syncを利用して、Inventoryの情報をS3に適宜出力します。
その後、Glue Crawlerを利用して、S3を12時間ごとにクロールして情報を集めます。

### S3バケットの作成
今回のハンズオン用に新たなバケットを作成することをおすすめします！

サービスの選択から、S3を選択します。
表示された画面で`バケットの作成`を選択します。

**バケット名**
一意のバケット名を指定してください。
他者が既に使用しているバケット名は使用できません。
例）ssm-inventory-innovate2020-spring-1234567

**リージョン**
今回は、インスタンスの作成などで作業をしてきたリージョンを選択します。

上記の設定が完了したら、`作成`を選択します。

### バケットポリシーの変更
作成したバケット名をクリックし、バケットの詳細画面を開きます。
その後、上部の`アクセス権限`ボタンを押し、`バケットポリシー`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/ac1c5ec1-81e3-28c1-5fab-c9fbecf7f549.png)

[こちらのページ](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-inventory-datasync.html)のバケットポリシー例をJSONをエディタ内に記述していきます。
下記のjson内の
`"Resource":"arn:aws:s3:::bucket-name"`
や
`"arn:aws:s3:::bucket-name/bucket-prefix/*/accountid=account-id-1/*"`
はbacket-nameやアカウントIDを変更する必要があります。

```json:記述する内容.json
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"SSMBucketPermissionsCheck",
         "Effect":"Allow",
         "Principal":{
            "Service":"ssm.amazonaws.com"
         },
         "Action":"s3:GetBucketAcl",
★★★★★    "Resource":"arn:aws:s3:::bucket-name"★★★★★
      },
      {
         "Sid":" SSMBucketDelivery",
         "Effect":"Allow",
         "Principal":{
            "Service":"ssm.amazonaws.com"
         },
         "Action":"s3:PutObject",
         "Resource":[
★★★★★       "arn:aws:s3:::bucket-name/*/accountid=account-id-1/*" ★★★★★★★★★
         ],
         "Condition":{
            "StringEquals":{
               "s3:x-amz-acl":"bucket-owner-full-control"
            }
         }
      }
   ]
}
```

Jsonの内容を修正できたら、右上の`保存`ボタンを選択します。

以上でインベントリのバケットの作成は完了です。

## SSMのリソースデータの同期設定
サービスの選択でSSMを選択し、SSMの画面を開きます。
画面が開いたら、左のメニュー画面から、`インベントリ`を選択します。
インベントリの画面が開いたら、右上の`リソースデータの同期`ボタンをおします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/b6487bc8-28aa-ba1d-0f63-ab7a3b634705.png)
リソースデータの同期の一覧画面が開いたら、右上の`リソースデータの同期の作成`をクリックします。

**同期名**
好きな名前をつける事ができます。
例）`InventoryResourceDataStnc-innovate2020spring`

**バケット名**
先ほど作成したS3のバケット名を設定します。

**バケットプレフィックス**
今回は作成していないので、指定する必要はありません。　

**バケットのリージョン**
デフォルトの設定で問題ありません。

## SSMリソースデータの同期設定の完了
リソースデータの同期一覧画面で作成が成功していることを確認してください。
データの同期を待ちます。この間に、GlueがアクセスするためのIAMロールやクローリングが実行されます。
数分経過後に完了しているかを確認します。

## 同期情報の確認
左のメニューのインベントを選択します。
`詳細ビュー`のタブを選択し、`リソースデータの同期`のプルダウンから先ほど作成したリソースデータを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/a79bd85a-d5b5-142e-a9b8-4f97a507d275.png)

同期ができているかを確認するために、「インベントリタイプ」のプルダウンから、`AWS:Application`を選択してみましょう。
10秒程度でデータが表示されれば、正常に同期できています。

## QuickSightのアカウント作成
サービスの一覧から`QuickSight`を選択します。
初めて利用する場合は、サインアップが求められるので、`Sign up for QuickSight`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/0ffc3e9e-cc79-b778-1051-5919e4e61f66.png)
その後、アカウントのエディションを選択する画面が出てくるので、`Standard`を選択し、`Confirm`をクリックします。
必要な情報を入力していきます。

**QuickSight region**
今まで作業を進めてきたリージョンを選択します。
リージョンの選択で、Tokyoを選択すると言語の設定が日本語に切り替わります。

**QuickSight アカウント名**
AWSのアカウントと紐付く全世界で一意な名前を指定する必要があります。
例）`aws-innovate2020spring-123456`

**通知の E メールアドレス**
自分のメールアドレスを設定してください。

**その他の項目について**

- **Enable autodiscovery of data and users in your Amazon Redshift, Amazon RDS, and AWS IAM services.**  
  チェックを入れます。  
  和訳→「Amazon Redshift、Amazon RDS、およびAWS IAMサービスでデータとユーザーの自動検出を有効にします。」
- **Amazon Athena**  
有効にします。
- **Amazon S3**  
チェックを入れて、先ほど作成したS3バケットを選択します。
- **Amazon S3 ストレージ分析**  
チェックなし
- **AWS IoT Analytics**  
チェックなし

以上で設定は完了ですので、`完了`ボタンをクリックしてください。
アカウントが作成されるまで少々おまちください。

## Amazon QuickSightのデータベース設定
QuickSightのページに移動したら、左上の`新しい分析`ボタンをクリックします。
そして、`新しいデータセット`をクリックします。

データソースの選択で`Athena`を選択します。
「新規Athenaデータソース」という画面が出てくるので、データソース名に任意の名前を入力して、`データソースを作成`をクリックします。
例)`ssm-inventory`

データベースの選択画面が表示されますので、先ほど作成した、データベースを選択します。
その後、テーブルの選択画面が表示されますので、`aws_application`を選択します。
そして、`選択`をクリックします。

「データセットの作成を終了する」の画面では、`データクエリを直接実行`にチェックを入れて`Visualize`ボタンをクリックします。
ここで表示されている**SPICE**とは、QuickSight上で利用できるオンメモリであり、この機能を利用する事で、画面の表示などを高速に実行する事ができます。
今回はS3のデータをその都度取得するため、必要ありません。

## QuickSightを用いた可視化
### 円グラフを用いた可視化
今回は、Applicationのデータを円グラフで可視化してみましょう。
左下のビジュアルタイプから円グラフを選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/73123920-2028-7b47-a94b-9a2fe3958471.png)

「グループ/色」の部分に`architecture`をドラッグ&ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/4de86c18-90a8-0151-525c-f075f950286b.png)

この円グラフは全てのインスタンス（今回は2台）のアーキテクチャの比率を表しています。

### 表を用いた可視化
特定パッケージのどのバージョンがインストールされているのかの表を作成します。

QuickSightの左上の`追加`ボタンから、`ビジュアルを追加`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/29726046-b8be-2711-954a-5be6f683526d.png)

そして、左下のビジュアルタイプから`テーブル`を選択します。
「グループ化の条件」に`name`と`version`をドラッグ&ドロップします。
「値」に`name`をドラッグ&ドロップします。（ドラッグ&ドロップすると、name(カウント)となり、個数を表示する事ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/57701c0b-60b1-9b85-207b-fa8ec1a8771b.png)

今回は、WindowsとLinuxが1台づつなので、全ての個数が1になりますが、台数が多くなった際に、どのバージョンがいくつ導入されているのかを把握する事が可能です。
これに、フィルタを追加する事で、特定のアプリケーションのみの個数を表示する事が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401878/1ed00020-c6b3-8ccb-6980-976da11218e1.png)


# まとめ
簡単にシステムログの収集管理のダッシュボードを構築する事ができました。
QuickSightの使い心地がとても良さそうなので、システムログ管理以外の情報分析に利用してみたいなと思いました(*^_^*)