Amazon Web Services ブログ

ハイブリッド環境の運用・監視の実現 – 閉域網で AWS Systems Manager と Amazon CloudWatch を構成する

こんにちは。ソリューションアーキテクトの村田と申します。

昨今オンプレミスとクラウドを併用した環境が多く、運用・監視の仕組みを集約したいと考えたことはないでしょうか。私がソリューションアーキテクトとして仕事させて頂く中で、オンプレミスサーバを AWS の仕組みで運用・監視する場合の構成方法についてお客様からご相談頂くことがあり、オンプレミスと AWS は閉域網で接続したいというご要望を頂くことがあります。2022年7月時点でまとまった情報が公開されていないため、このブログでは閉域接続のオンプレミスサーバを AWS Systems ManagerAmazon CloudWatch で運用・監視するための構成方法ついて詳しくご紹介します。

アーキテクチャ概要

オンプレミスと AWS が閉域で接続されている前提で、以下の点を満たすようにネットワークを構成します(図 1 参照)。

  • オンプレミスサーバ上の AWS Systems Manager Agent(SSM Agent)と Amazon CloudWatch Agent が通信するサービスエンドポイントへの経路を VPC endpoint で構成
  • オンプレミスサーバ上の SSM Agent と CloudWatch Agent が VPC endpoint の DNS 名を解決できるように Amazon Route 53 Resolver を構成

このブログではオンプレミスと AWS を専用線で接続し、AWS Transit Gateway を経由させた構成ですが、仮想プライベートゲートウェイ経由など他の構成でも問題ありません。

ネットワークアーキテクチャ1-1ネットワークアーキテクチャ1-2

図 1. ネットワークアーキテクチャ

SSM Agent および CloudWatch Agent の構成に必要な IAM ロールや IAM ユーザを作成した AWS アカウントでオンプレミスサーバを運用・監視することができます。例えば、図 2 上の構成で Account A で管理することも、図 2 下の構成で VPC endpoint をAccount A (Shared Account) で管理し、オンプレミスサーバー自体の管理は Account B にて実施することも可能です。

管理アカウントの選択1管理アカウントの選択2

図 2. 管理アカウントの選択

なお、1 つのアカウントとリージョンごとに 1,000 台までは、無料でオンプレミスサーバを Systems Manager の管理対象とすることができますが、以下のいずれかのケースではアドバンストインスタンス層を有効にする必要があります。このインスタンス層にする場合、管理対象のインスタンスごとに料金がかかりますのでご注意ください(2022/7 時点)。

  • SSM Session Manager で接続する
  • Microsoft がリリースしたアプリケーションにパッチを適用する
  • 管理対象が 1 つのアカウントとリージョンごとに 1,000 台を越える

構成手順

ネットワーク

オンプレミス環境と AWS の VPC は閉域網で通信出来る状態であることを前提とします。

まず、SSM Agentと CloudWatch Agent が利用する代表的なサービスエンドポイント用の VPC endpoint を作成します(図 3 参照)。作成手順についてはこちらをご参照ください。

  • com.amazonaws.region-code.ssm
  • com.amazonaws.region-code.ssmmessages
  • com.amazonaws.region-code.ec2messages
  • com.amazonaws.region-code.kms
  • com.amazonaws.region-code.s3
  • com.amazonaws.region-code.logs
  • com.amazonaws.region-code.monitoring

作成した VPC Endpoint

図 3. 作成した VPC Endpoint

次にオンプレミスから VPC endpoint の DNS 名前解決用に Route 53 Resolver inbound endpoint を構成します(図 4 参照)。

作成した Route 53 resolver inbound endpoint

図 4. 作成した Route 53 Resolver inbound endpoint

オンプレミスサーバが接続する DNS サーバから Route 53 Resolver inbound endpoint にフォワードするによう設定し、オンプレミスサーバから VPC endpoint の DNS 名が解決が出来ることを確認します。

実行例

$ nslookup *.vpce-0ecd8fed4636d5c47-96pv5ase.s3.ap-northeast-1.vpce.amazonaws.com
Server:         192.168.20.158
Address:        192.168.20.158#53

Non-authoritative answer:
Name:   *.vpce-0ecd8fed4636d5c47-96pv5ase.s3.ap-northeast-1.vpce.amazonaws.com
Address: 192.168.20.157
Name:   *.vpce-0ecd8fed4636d5c47-96pv5ase.s3.ap-northeast-1.vpce.amazonaws.com
Address: 192.168.20.236

VPC endpoint 作成時に「プライベート DNS 名の有効化」にチェックを入れることで、各サービスのリージョンエンドポイントについても VPC endpoint のプライベート IP が返却されますが、 S3 についてはこの機能がサポートされていないため、パブリック IP が返却されます。

実行例

$ nslookup logs.ap-northeast-1.amazonaws.com
Server:         192.168.20.158
Address:        192.168.20.158#53

Non-authoritative answer:
Name:   logs.ap-northeast-1.amazonaws.com
Address: 192.168.20.221
Name:   logs.ap-northeast-1.amazonaws.com
Address: 192.168.20.141

$ nslookup s3.ap-northeast-1.amazonaws.com
Server:         192.168.20.158
Address:        192.168.20.158#53

Non-authoritative answer:
Name:   s3.ap-northeast-1.amazonaws.com
Address: 52.219.136.176

このため、こちらの手順に従って private hosted zone を設定し、「*.s3.ap-northeast-1.amazonaws.com 」の問い合わせに VPC endpoint のプライベート IP を返すようにします(図 5 参照)。

private hosted zone の設定

図 5. private hosted zone の設定

SSM Agent

オンプレミスサーバにログインし、SSM Agent を VPC Endpoint 経由で Amazon S3 からダウンロードし、インストールします。その後停止します。OS の種別やバージョン毎の詳細はマニュアルをご参照ください。また、S3 の VPC endpoint は、「*」を「bucket」に置き換えてアクセスする必要があるため、ご注意ください。

ubuntu での実行例

$ wget https://bucket.vpce-0ecd8fed4636d5c47-96pv5ase.s3.ap-northeast-1.vpce.amazonaws.com/amazon-ssm-ap-northeast-1/latest/debian_amd64/amazon-ssm-agent.deb
$ sudo dpkg -i amazon-ssm-agent.deb
$ sudo service amazon-ssm-agent stop

オンプレミスのサーバを登録したいアカウントおよびリージョンで Systems Manager の Hybrid Activations の画面で Activation を作成します(図 6 参照)。

Activation 作成画面

図6. Activation 作成の画面

Activation を作成すると画面上に Activation Code と Activation ID が表示されます(図 7 参照)。このタイミングでしか確認出来ないため、注意が必要です。

Activation 作成後に表示される Activation Code と Activation ID

図 7. Activation 作成後に表示される Activation Code と Activation ID

オンプレミスサーバにログインし、Activation Code と Activation ID、登録するリージョンを指定して Systems Manager に登録した後、SSM Agent を起動します。

実行例

$ sudo -E amazon-ssm-agent -register -code "activation-code" -id "activation-id" -region "region"
$ sudo service amazon-ssm-agent start

SSM Fleet Manager の画面を表示すると、オンプレミスサーバが Managed Node として登録されていることが確認出来ます(図 8 参照)。

Fleet Manager の画面

図 8. Fleet Manager の画面

この時点では、Activation 作成時に自動生成した IAM ロールでは権限が足りず、Performance counters の表示などが出来ません(図 9 参照)。

SSM Fleet Manager の Performance counters

図 9. SSM Fleet Manager の Performance counters

SSM RunCommand のログ出力と SSM Session Manager でのオンプレミスサーバへのアクセスのため、S3 や CloudWatch Logs および KMS Key へのアクセス権限を IAM ロールに追加します(図 10 参照)。このブログでは FullAccess のポリシーを設定していますが、本番運用では最小権限となるようご注意ください。

IAM ロールの設定

図 10. IAM ロールの設定

IAM ロールを設定すると SSM Fleet Manager の Performance counters の表示や SSM Session Manager によるオンプレミスサーバに接続ができます(図 11 参照)。

11-111-2

図 11. SSM Fleet Manager の Performance counters と SSM Session Manager によるオンプレミスサーバへの接続

これで SSM Agent の設定は完了ですが、追加機能への追随やセキュリティ観点で SSM Agent を定期的に更新することが大切です。定期的に自動更新する場合、SSM Fleet Manager の設定画面で SSM Agent の自動更新設定をします(図 12 参照)。これにより、2 週間ごとにに SSM Agent が更新されます。

SSM Fleet Manager の SSM Agent 自動更新設定

図 12. SSM Fleet Manager の SSM Agent 自動更新設定

CloudWatch Agent

はじめにユーザーガイドに記載のとおり、SSM Run Command の AWS-ConfigureAWSPackage で AmazonCloudWatchAgent を実行し、オンプレミスサーバに CloudWatch Agent をインストールします(図 13 参照)。

SSM Run Command を利用した CloudWatch Agent のインストール

図 13. SSM Run Command を利用した CloudWatch Agent のインストール

CloudWatch Agent のインストールが完了したら、オンプレミスサーバの CloudWatch Agent が利用する IAM ユーザを作成します(図 14 参照)。詳細な手順はこちらを参照ください。

CloudWatch Agent 用の IAM ユーザの作成

図 14. CloudWatch Agent 用の IAM ユーザの作成

Amazon EC2 では IAM Role を利用しますが、オンプレミスサーバでは、AmazonCloudWatchAgent プロファイルを追記/作成する必要があります。詳細はこちらをご参照ください。ここで、IAM ユーザ作成時に表示される my_access_key と my_secret_key を設定し、メトリクスとログを収集するリージョンを指定します。

AmazonCloudWatchAgent プロファイルの設定例

$ sudo vim /root/.aws/credentials
$ sudo cat /root/.aws/credentials
[default]
aws_access_key_id     = xxxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyy
aws_session_token     = zzzzzzzzzzzzzzzz

[AmazonCloudWatchAgent]
aws_access_key_id = my_access_key
aws_secret_access_key = my_secret_key

$ sudo vim /root/.aws/config
$ sudo cat /root/.aws/config
[profile AmazonCloudWatchAgent]
region = ap-northeast-1

次に、amazon-cloudwatch-agent-config-wizard を実行し、ウィザードの質問に答えて、CloudWatch Agent 設定ファイルを作成します。ここで設定したメトリクスとログの収集ができます。

CloudWatch Agent 設定ファイルをローカルで管理する例

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
・・・ ウィザードの質問に回答 ・・・
$ sudo cat /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
        "agent": {
                "metrics_collection_interval": 60,
                "run_as_user": "root"
        },
        "logs": {
                "logs_collected": {
                        "files": {
                                "collect_list": [
                                        {
                                                "file_path": "/var/log/syslog",
                                                "log_group_name": "messages",
                                                "log_stream_name": "{hostname}",
                                                "retention_in_days": 5
                                        }
                                ]
                        }
                }
        },
        "metrics": {
                "metrics_collected": {
                        "cpu": {
                                "measurement": [
                                        "cpu_usage_idle"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ],
                                "totalcpu": true
                        },
                        "disk": {
                                "measurement": [
                                        "used_percent"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "diskio": {
                                "measurement": [
                                        "write_bytes",
                                        "read_bytes",
                                        "writes",
                                        "reads"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "mem": {
                                "measurement": [
                                        "mem_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        },
                        "net": {
                                "measurement": [
                                        "bytes_sent",
                                        "bytes_recv",
                                        "packets_sent",
                                        "packets_recv"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "swap": {
                                "measurement": [
                                        "swap_used_percent"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}

設定ファイルが作成できたら、CloudWatch Agent を起動します。
実行例

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

本ブログでは /var/log/syslog を CloudWatch Logs に出力していますが、このログが CloudWatch Agent により CloudWatch Logs に送られ、図 15 のように確認出来ます。

CloudWatch Logs の画面

図 15. CloudWatch Logs の画面

また、CloudWatch では以下のように、CPU や Memory、Disk 使用率などのメトリクスを確認できます(図 16 参照)。各メトリクスは CWAgent の名前空間にカテゴライズされます。

CloudWatch のメトリクス

図 16. CloudWatch のメトリクス

これで CloudWatch Agent の設定は完了ですが、SSM Agent と同様に CloudWatch Agent の更新も大切です。
自動実行する場合、SSM State Manager を利用して、インストール時に利用した SSM Run Command の AWS-ConfigureAWSPackage を定期実行させます。

おわりに

いかがでしたしょうか。

エンタープライズシステムにおいてインターネットに接続出来ないサーバは少なからず存在します。このブログでは、AWS と閉域で繋がれたオンプレミスサーバを AWS の仕組みで運用・監視するため、オンプレミスサーバ上に Systems Manager Agent と CloudWatch Agent を構成する手順についてご紹介しました。これにより、AWS のマネジメントコンソールからオンプレミスサーバへ接続したり、メトリクスを監視したりできます。是非お試しください。

ソリューションアーキテクト 村田 京介