概要

  • こんにちわ、今回は担当案件でオンプレミスと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 からメトリクス出力が確認できました。

 

参考資料