概要
- こんにちわ、今回は担当案件でオンプレミスとAWS 環境を接続する構成がありまして、オンプレミスのサーバーからAWS のリソースへアクセスを行います。事前に検証した知見を記事にまとめますね。
- 今回の記事では、オンプレミスのLinuxサーバーのメトリクスをAWS環境のCloudWatch に出力する方法を記載します。なお、クレデンシャルはアクセスキーを使用せず、 AWS Systems Manager のハイブリッドアクティベーションで管理しています。
前提条件
- AWS Systems Manager のハイブリッドアクティベーションを作成し、ハイブリッドアクティベーションに設定されているIAMロールにCloudWatch にメトリクス出力が可能な権限を設定します。
- 詳細は、以下の記事を参照ください。
オンプレミスを AWS Systems Manager で管理する
ハイブリッドアクティベーションのクレデンシャル
- ハイブリッドアクティベーションは、IAM ユーザーのアクセスキーではなく、IAM STS の一時的な認証情報を使用するため、安全にAWS 環境の認証を提供します。
- ハイブリッドアクティベーションで管理されるマネージドノードは、Linux の場合、“/root/.aws/credentials” に認証情報が格納されます。この認証情報は、SSM Agent によって、30分間隔で更新されます。
オンプレ Linux のCloudWatch Agent設定方法
- amazon-cloudwatch-agent をインストールします。yumなどのOSパッケージ管理コマンドを使用するか、Systems ManagerのRun Command を使用します。
- 以下は、amazon-cloudwatch-agent をインストールするyumコマンドです。
- rpm ファイルをダウンロードする場合は、こちらのドキュメントにダウンロードリンクが記載されています。
- Systems ManagerのRun Command を使用してインストールする場合、コマンドドキュメントに「AWS-ConfigureAWSPackage」を使用し、Actionに「Install」、Nameに「AmazonCloudWatchAgent」を指定します。
$ sudo yum install amazon-cloudwatch-agent $ yum list installed amazon-cloudwatch-agent Loaded plugins: extras_suggestions, langpacks, priorities, update-motd 65 packages excluded due to repository priority protections Installed Packages amazon-cloudwatch-agent.x86_64 1.300043.0b781-1 installed
- /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml を編集します。
- 「shared_credential_profile」、「shared_credential_file」を以下の様に設定します。
[credentials]
shared_credential_profile = “default”
shared_credential_file = “/root/.aws/credentials”
$ sudo vi /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
$ cat /opt/aws/amazon-cloudwatch-agent/etc/common-config.toml
# This common-config is used to configure items used for both ssm and cloudwatch access
## Configuration for shared credential.
## Default credential strategy will be used if it is absent here:
## Instance role is used for EC2 case by default.
## AmazonCloudWatchAgent profile is used for onPremise case by default.
# [credentials]
# shared_credential_profile = "{profile_name}"
# shared_credential_file = "{file_name}"
[credentials]
shared_credential_profile = "default"
shared_credential_file = "/root/.aws/credentials"
## Configuration for proxy.
## System-wide environment-variable will be read if it is absent here.
## i.e. HTTP_PROXY/http_proxy; HTTPS_PROXY/https_proxy; NO_PROXY/no_proxy
## Note: system-wide environment-variable is not accessible when using ssm run-command.
## Absent in both here and environment-variable means no proxy will be used.
# [proxy]
# http_proxy = "{http_url}"
# https_proxy = "{https_url}"
# no_proxy = "{domain}"
# [ssl]
# ca_bundle_path = "{ca_bundle_file_path}"
#
# [imds]
# imds_retries = 1
- /root/.aws/config にregion を設定します。
$ sudo vi /root/.aws/config $ sudo cat /root/.aws/config [default] region = "ap-northeast-1"
- CloudWatch Agent の設定を /opt/aws/amazon-cloudwatch-agent/etc に配置します。検証に使用したjsonは、以下参照ください。
- agent にrun_as_user を設定し、root を指定します。その他、metric の設定は、要件に応じて行ってください。
$ sudo vi /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
$ ls -l /opt/aws/amazon-cloudwatch-agent/etc
total 20
drwxr-xr-x 2 root root 21 Jul 2 22:49 amazon-cloudwatch-agent.d
-rw-r--r-- 1 root root 656 Aug 25 08:34 amazon-cloudwatch-agent.json
-rw-r--r-- 1 root root 1070 Aug 25 08:30 common-config.toml
$ cat /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json
{
"agent": {
"metrics_collection_interval": 60,
"run_as_user": "root"
},
"metrics": {
"metrics_collected": {
"collectd": {
"metrics_aggregation_interval": 60
},
"cpu": {
"measurement": [
"cpu_usage_idle",
"cpu_usage_iowait",
"cpu_usage_user",
"cpu_usage_system"
],
"metrics_collection_interval": 60,
"resources": [
"*"
],
"totalcpu": false
}
}
}
}
- こちら発見が難しいのですが、OSにcollectd がインストールされていなければエラーとなります。collectd のインストールを行います。
- Amazon Linux の場合は、amazon-linux-extras コマンドを使用します。
$ sudo amazon-linux-extras install collectd
$ sudo systemctl enable collectd
$ sudo systemctl start collectd
$ sudo systemctl status collectd
● collectd.service - Collectd statistics daemon
Loaded: loaded (/usr/lib/systemd/system/collectd.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2024-08-25 08:56:39 UTC; 8s ago
Docs: man:collectd(1)
man:collectd.conf(5)
Main PID: 26058 (collectd)
Memory: 1.6M
CGroup: /system.slice/collectd.service
mq26058 /usr/sbin/collectd
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux collectd[26058]: Available write targets: ...
Aug 25 08:56:39 niikawa-test-linux systemd[1]: Started Collectd statistics d....
Hint: Some lines were ellipsized, use -l to show in full.
- amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise コマンドを使用し、amazon-cloudwatch-agent の設定を指定してサービス起動を行います。
- 実行結果にエラーはなく、rootで実行され、Configuration validation succeeded と表示されることを確認します。
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m onPremise -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s
****** processing amazon-cloudwatch-agent ******
Got Home directory: /root I! Set home dir Linux: /root I! SDKRegionWithCredsMap region: ap-northeast-1 Successfully fetched the config and saved in /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_amazon-cloudwatch-agent.json.tmp
Start configuration validation...
2024/08/25 08:57:09 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_amazon-cloudwatch-agent.json.tmp ...
2024/08/25 08:57:09 I! Valid Json input schema.
2024/08/25 08:57:09 Configuration validation first phase succeeded
I! Detecting run_as_user...
Got Home directory: /root
I! Set home dir Linux: /root
I! SDKRegionWithCredsMap region: ap-northeast-1
/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -schematest -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml
Configuration validation second phase succeeded
Configuration validation succeeded
amazon-cloudwatch-agent has already been stopped
Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-cloudwatch-agent.service to /etc/systemd/system/amazon-cloudwatch-agent.service.
$ systemctl status amazon-cloudwatch-agent -l
● amazon-cloudwatch-agent.service - Amazon CloudWatch Agent
Loaded: loaded (/etc/systemd/system/amazon-cloudwatch-agent.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2024-08-25 08:57:11 UTC; 27s ago
Main PID: 26281 (amazon-cloudwat)
Memory: 91.0M
CGroup: /system.slice/amazon-cloudwatch-agent.service
mq26281 /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent -config /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.toml -envconfig /opt/aws/amazon-cloudwatch-agent/etc/env-config.json -otelconfig /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.yaml -pidfile /opt/aws/amazon-cloudwatch-agent/var/amazon-cloudwatch-agent.pid
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: I! imds retry client will retry 1 timesI! Detected the instance is EC2
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: 2024/08/25 08:57:12 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json ...
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: 2024/08/25 08:57:12 Reading json config file path: /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.d/file_amazon-cloudwatch-agent.json ...
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: 2024/08/25 08:57:12 I! Valid Json input schema.
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: I! Detecting run_as_user...
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: Got Home directory: /root
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: I! Set home dir Linux: /root
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: I! SDKRegionWithCredsMap region: ap-northeast-1
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: 2024/08/25 08:57:12 Configuration validation first phase succeeded
Aug 25 08:57:12 niikawa-test-linux start-amazon-cloudwatch-agent[26281]: I! Detecting run_as_user...
CloudWatch メトリクス確認
- CloudWatch メトリクスを確認します。
- メトリクスが出力される名前空間は、「CWAgent」になります。

- オンプレミスのLinux からメトリクス出力が確認できました。

参考資料
- 前提となるハイブリッドアクティベーションの設定は、以下の記事を参照ください。
- Linux の一般的なCloudWatch Agent の設定は、以下の記事を参照ください。