CloudWatchAgentをインストールしてサーバーの監視を行う①（VPCエンドポイント作成）

案件でよくCloudWatchAgentの監視設定を行うため、Qiitaに手順をまとめておこうと思います。
下記の流れでCloudWatchAgentのインストール・監視設定を行っていきます。

## 作業の流れ
[1.VPCへCloudWatchAgentに必要なVPCエンドポイントを作成する](https://qiita.com/tonkatsu_oishi/items/7c39f81fd4e3e2fbe91e)←いまここ
[2.EC2を構築し、IAMロールをアタッチする（CloudWatchAgentとSSM権限の付与）](https://qiita.com/tonkatsu_oishi/items/1851eddb094a45f189be)
[3.EC2に対してCloudWatchAgentをインストールする](https://qiita.com/tonkatsu_oishi/items/114ab3342bcd7ec48afe)
4.CloudWatchAgentのconfigファイルを設定し、CPU・メモリ・プロセスなどのメトリクスを取得する
　　　[Linux用CloudwatchAgent設定ファイルの生成・CloudwatchAgentの起動](https://qiita.com/tonkatsu_oishi/items/ec163751cc7f644f9cae)
　　 [Windows用CloudwatchAgent設定ファイルの生成・CloudwatchAgentの起動](https://qiita.com/tonkatsu_oishi/items/7abed083f1d5f1b45a7f)
5.[SNSトピックの作成](https://qiita.com/tonkatsu_oishi/items/3fa4c6c8de52d9678c11)
6.[CloudWatchAgentで取得したメトリクスに対してCloudWatchAlarmを設定する](https://qiita.com/tonkatsu_oishi/items/3fa4c6c8de52d9678c11)

3番・4番の手順については、EC2にログインしてコマンド実行により設定を行う方法と、Session Manager（SSM）のRunCommandにより設定する方法の2つの手順で確認していきます。EC2へのログインについては、Session ManagerのSystems Managerにて行います。踏み台サーバー経由でEC2にログインしたい場合は、[別記事](https://qiita.com/tonkatsu_oishi/items/ee5d7f64a43ba7deb671)にて踏み台サーバーの構築方法をご紹介しています。
今回は準備として、CloudWatchAgentとSession Manager（SSM）に必要なVPCエンドポイントの作成を行っていこうと思います。

## 構成図確認
今回の構成を確認します。
プライベートサブネットにVPCエンドポイントを5つ作成しEC2インスタンスを構築します。
プライベートサブネット上のEC2インスタンスへのアクセスはSSMにて行います。
SSM・CloudWatchの権限を付与するため、EC2にIAMロールをアタッチします。
CloudWatchAgentにより取得したメトリクスに対してCloudWatchアラームを設定し、
SNSにてアラートメールを送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/aab38ca5-22ac-f527-49af-edce27c59ff5.png)

## 用語の確認
構築に入る前に、今回利用するAWSリソースについて簡単に確認します。

### CloudWatch
[CloudWatch](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html)は、AWS上のリソースをリアルタイムで監視するためのツールです。
Cloudwatchメトリクスにより各種リソースの負荷状況、通信量などを取得します。
取得したCloudwatchメトリクスに対してCloudwatchアラームを設定することで、リソースの負荷が一定ラインを超えた場合にメールなどで通知することが可能です。

### CloudWatchAgent
CloudWatchはデフォルトの状態で、アカウント上の各種リソースに対してメトリクスの取得を行えます。
ただし、EC2のメモリ使用率・プロセス数・ディスク使用率などを監視する場合は、EC2内に[CloudwatchAgent](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)というプログラムをインストールし、設定を行う必要があります。

### AWS Systems Manager(SSM)
[SSM](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-systems-manager.html)はAWSリソースの管理ツールです。
SSMを利用することでAWSリソースに対して起動停止、コマンド実行、OS更新や接続など様々な操作を行うことができます。

### VPCエンドポイント
今回はEC2インスタンスにCloudWatchAgentというプログラムをインストールし、CloudWatchAgent経由でAWSリソース（CloudWatchメトリクスなど）の操作を行います。
EC2上のプログラム経由でAWSのサービスを操作する場合、インターネット上に公開された[AWSサービスエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html)のURLへのアクセスが発生します。
下の図のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/4132f113-bab3-7a73-1376-c23f83ec511b.png)


しかし今回は、プライベートサブネット上のEC2内にCloudWatchAgentを起動し、CloudWatchのエンドポイントあてにデータを送信する必要があります。

こういった場合は、CloudWatchのVPCエンドポイントを利用します。なお、CloudWatch以外にも様々な[AWSサービスに対応したVPCエンドポイント](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/privatelink-access-aws-services.html)が利用できます。
VPCエンドポイントを構築すると、プライベートサブネット上のEC2インスタンスとAWSサービス同士がVPCエンドポイントによりプライベート接続にてやり取りができるようになります。
下の図のようなイメージです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/4a6812a3-1c1b-9c30-a9ee-03ad312abbc3.png)

ただし、プライベートサブネットでCloudWatchAgentを利用する場合については、VPCエンドポイント部分はNatGatewayの構築でも代用可能です。
EC2のアウトバウンド通信がインターネット上のCloudWatchエンドポイントURLに到達できれば、CPU使用率などのデータ送信が行えるためです。

この場合は下図のようなイメージになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/648cd052-1422-6426-7479-3fb7506a8896.png)

※2024.3.3追記
こちらについて、「SSMを利用してプライベートサブネット上のEC2に接続したい場合は、VPCエンドポイントは必須となります」と記載していました。しかしドキュメントを再度確認したところ、NATGatewayまたはIGWに接続してインターネットアクセスが可能な状態であれば、通信制御設定・IAMロールの設定を行うことでプライベートサブネット内のEC2にSSM接続させることが可能なようでした。検証したところ、NatGWへのデフォルトルート設定がされているプライベートサブネット上のEC2に対しSSM接続が行えることが確認できました。
参考：[Session Manager の前提条件を満たす（公式ユーザーガイド）](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-prerequisites.html)


VPCエンドポイントの利用料は[時間単位での基本料金＋データ量に応じたデータ処理料金](https://aws.amazon.com/jp/privatelink/pricing/)となります。NATGatewayの利用料金についても、[時間単位での基本料金＋データ量に応じたデータ処理料金](https://aws.amazon.com/jp/vpc/pricing/)となっています。VPCエンドポイントやNATGatewayを複数利用すると、AWS利用料が高額になってしまいます。実際の環境でVPCエンドポイントやNATGatewayを利用する際は、コスト面も注意して設計を行う必要があります。

### PrivateLink
VPCエンドポイントは、[PrivateLink接続](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/concepts.html#privatelink-connections)というAWSの機能を利用し、エンドポイント先のサービスへのプライベート接続を可能にしています。

## 作成するVPCエンドポイント
今回はまずVPCエンドポイントの作成を行います。
作成するVPCエンドポイントは下記の5つです。

■CloudWatchメトリクス取得、ログ送信に必要なエンドポイント
・com.amazonaws.region.monitoring
・com.amazonaws.region.ec2
・com.amazonaws.region.logs

■SSMによるEC2への接続に必要なエンドポイント
・ssm.region.amazonaws.com
・ssmmessages.region.amazonaws.com
・ec2messages.region.amazonaws.com

※「region」の部分は使用するリージョンに読み替えてください。
今回は東京リージョンを利用するため、「ap-northeast-1」となります。

※踏み台サーバー経由でEC2にアクセスし、CloudWatchAgentインストール・Config設定を全てサーバー内からコマンド実行にて行う場合は、「SSMによるEC2ログインに必要なエンドポイント」の方は作成不要です。

## VPC設定の確認
VPCエンドポイントを利用する際にVPC側で必要となる設定は下記二点です。

・DHCPオプションセットのドメインネームサーバーの値がAmazonProvidedDNSとなっていること
・VPCエンドポイントを作成したVPCにて[DNSホスト名]・[DNS解決策] が有効になっていること

[※参考:インターフェイス Amazon VPC エンドポイントを使用してサービスのデフォルトのドメイン名を解決するにはどうすればよいですか?](https://repost.aws/ja/knowledge-center/vpc-interface-configure-dns)

DNSホスト名・DNS名前解決については、VPCの詳細タブから確認が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/cadf7383-9fa1-8a12-27e7-296575dee956.png)

DHCPオプションセットも、VPCの詳細タブのリンクから設定を確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/47d6407f-7ca4-0948-6d02-2390acd9f7d8.png)

DHCPオプションセットの詳細画面です。
デフォルトの状態では、DHCPオプションセットのドメインネームサーバーは「AmazonProvidedDNS」となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/ec9e3c41-81ac-4e5c-a202-076faa60a422.png)



## セキュリティグループの作成
VPCエンドポイントの作成を行う前に、VPC・サブネットの作成を行う必要があります。
VPC・サブネットの作成方法は[別記事](https://qiita.com/tonkatsu_oishi/items/ee5d7f64a43ba7deb671)をご参照ください。
また、VPCエンドポイントにはセキュリティグループを割り当てる必要があります。
その為、事前にVPCエンドポイントへ割り当てるためのセキュリティグループを作成します。

EC2のトップページに移動します。
左メニューから「セキュリティグループ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/8bae6c61-5027-6e86-ca9b-62ba7da13505.png)

セキュリティグループのトップページが表示されます。
「セキュリティグループを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/1600fab4-d3f1-32ee-35d9-ea282f4c673d.png)

セキュリティグループの作成画面が表示されます。
セキュリティグループ名・説明を入力します。
プルダウンメニューから、セキュリティグループを作成するVPCを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/e1dbcf95-50b1-5594-4339-10308fff5700.png)

インバウンドルールの設定を行います。
プルダウンメニューから、通信を許可するタイプ・リソースタイプを選択します。
「ソース」のテキストボックスには、通信を許可したいIPアドレス範囲を入力します。

※今回は許可する通信のタイプを「すべてのトラフィック」として、リソースタイプに「カスタム（IPアドレスを任意に入力）」を選択しました。VPC内のインスタンスからVPCエンドポイントへアクセスをさせたいため、いんばうんどで許可するIPアドレスの範囲はVPCのIPアドレス範囲としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/01db5405-4fce-7074-0428-a1040d1a091e.png)

ただし、[AWSのサービスエンドポイント](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#endpoint-tables)への通信はHTTPS（443番）で行われます。そのため、VPCエンドポイントへ設定するSGのインバウンドルールでは、「443番」ポート宛てで任意のIPアドレス範囲からの通信を許可する形でも大丈夫です。

アウトバウンドルールはデフォルトの状態（すべてのアウトバウンド通信を許可する）から変更しません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/d7215faf-cbd6-f38f-bb8b-dc8c9489f057.png)

「タグ」セクションにてタグの設定を行えます。
全ての設定を完了したら、「セキュリティグループを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/3c40cfbb-64c0-91f7-195c-d3c2e24015f3.png)

セキュリティグループの作成が完了しと事を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/50705794-edf0-bd3f-db73-a44f19eb0004.png)

## VPCエンドポイントの作成
セキュリティグループの作成が完了したら、VPCエンドポイントを作成します。
VPCのトップページへ移動します。
左メニューから「エンドポイント」を押下し、「エンドポイントの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6f2c02b6-5cff-25d3-95c0-e1f9ea2621c6.png)

VPCエンドポイントの作成画面が表示されます。
「名前タグ」にVPCエンドポイントに設定したいNameタグを入力します。
「サービスカテゴリ」は「AWSのサービス」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/4468267c-34df-d7cd-d776-33714db79980.png)

「サービス」セクションのテキストボックスに、VPCエンドポイントを作成したいサービス名を入力します。
画像では「monitoring」を入力し、表示された「com.amazonaws.region.monitoring」のチェックボックスにチェックを入れています。

「VPC」のプルダウンメニューから、VPCエンドポイント作成先のVPCを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/35289866-fbac-028b-90bd-412ca6cf904c.png)

VPCエンドポイントを作成したいアベイラビリティゾーンを探し、チェックボックスにチェックを入れます。
「サブネットID」のプルダウンメニューから、VPCエンドポイントを作成したいサブネットを選択します。サブネットは複数選択することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/48f18dc9-cba4-5223-48e0-032bf35f5db7.png)


「セキュリティグループ」の一覧から、先ほど作成したVPCエンドポイント用のセキュリティグループを探し、チェックボックスにチェックを入れます。

「ポリシー」は今回は「フルアクセス」を選択します。
※VPCエンドポイントを設定すると、VPCエンドポイントへアクセス可能なリソースやアカウントIDなどを制限できます。詳細は[AWSの公式ユーザーガイド](https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/vpc-endpoints-access.html)をご参照ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/bfd8f00c-e453-15fb-95e5-0b248bab69f1.png)

VPCエンドポイントが作成されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/e4eeeeb7-d5c8-fea1-a97f-94401a7fbe14.png)

同じ要領で、残りの下記VPCエンドポイントを作成します。

・com.amazonaws.region.ec2
・com.amazonaws.region.logs
・ssm.region.amazonaws.com
・ssmmessages.region.amazonaws.com
・ec2messages.region.amazonaws.com

全てのVPCエンドポイントの作成が完了した状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/074da57a-7e22-da3a-4a48-e260bf383be0.png)

ここまでお読みいただきありがとうございました。
次回はCloudWatchAgent・SSMAgent用の権限を付与したIAMロールを作成し、
テスト用のEC2インスタンスにアタッチ・SSMでの接続確認を行う手順をご紹介します。