[小ネタ] CloudWatch Agentのプロキシ設定について

小ネタです。

エンタープライズな世界ではインターネットへのアクセスをプロキシ経由に制限してる環境がそれなりにあるかと思います。
CloudWatch AgentやSSM AgentといったAWSで使われるエージェントプログラムはインターネットへのアクセスを必要とし、プロキシ等によりインターネットへ直接アクセスできない環境では別途設定が必要になります。

単純にインターネットに抜けることなくCloudWatch AgentやSSM Agentを使うということであればVPCエンドポイントを設けAWSとしてプライベートなルートを用意する方法があり、多くの場合はこちらの対応をすると思います。
本記事ではVPCエンドポイントを用意しない(またはできない)環境を想定したCloudWatch Agentのプロキシ設定方法を説明します。

CloudWatch Agentのプロキシ設定

CloudWatch Agentのプロキシ設定方法はドキュメントにきっちり記載されています。

CloudWatch Agentの設定ファイルはcommon-config.tomlであり、環境に応じてそれぞれ、

# Windowsの場合
C:\ProgramData\Amazon\AmazonCloudWatchAgent\common-config.toml

# Linux
/opt/aws/amazon-cloudwatch-agent/etc/common-config.toml

に存在しています。
このファイルの中でプロキシにかかわる設定は[proxy]セクションにあり、既定ではすべてコメントアウトされています。

## 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}"

CloudWatch Agentでプロキシを設定するには、これを、

[proxy]
  http_proxy = "http://xxx.xxx.xxx.xxx:8080"
  https_proxy = "http://xxx.xxx.xxx.xxx:8080"
  no_proxy = "169.254.169.254"

の様にコメントアウトを解除して環境に応じたプロキシサーバーの指定をすればOKです。

設定後エージェントの再起動をすれば設定が反映されます。
エージェントの起動は先述のドキュメントに記載されている様にSSM Run Commandかamazon-cloudwatch-agent-ctlおよびamazon-cloudwatch-agent-ctl.ps1コマンドを使ってください。

# amazon-cloudwatch-agent-ctl を使った起動例
# 詳細は https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-first-instance.html#CloudWatch-Agent-profile-instance-first 参照

# Windows
./amazon-cloudwatch-agent-ctl.ps1 -a fetch-config -m ec2 -c ssm:configuration-parameter-store-name -s

# Linux
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:configuration-parameter-store-name -s

amazon-cloudwatch-agent-config-wizard について

本記事を書こうと思ったきっかけでもあるのですが、CloudWatchのエージェント設定ファイルを作るためのウィザードであるamazon-cloudwatch-agent-config-wizard(.exe)は上記common-config.tomlではプロキシ設定できず、プロキシ環境下では通信エラーとなってしまうことがあります。

このウィザードについてはHTTP_PROXYHTTPS_PROXYNO_PROXY環境変数でプロキシ設定をしてやると良いらしい...のですが、私が試した環境だとうまくいきませんでした。

amazon-cloudwatch-agent-config-wizardは設定ファイルを生成するだけのものですので、これだけは別途インターネットへの直接アクセスが可能な環境で実施してしまう方が楽に対処できるかと思います。

補足 : SSM Agentのプロキシ設定

主にWindows環境向けなのですが、CloudWatch Agentが登場する以前の環境でSSM AgentのCloudWatch Pluginを利用している環境もあるかと思います。

この環境ではCloudWatchの通信のためにSSM Agentのプロキシ設定を設定する必要があります。
もちろん単純にSSM Agentの通信のためにも必要です。

設定方法は以下のドキュメントに記載されています。

本記事ではWindowsの設定方法だけ紹介しますが、WindowsのSSM Agentはレジストリに設定を施し、AmazonSSMAgentサービスを再起動することで反映されます。

上記ドキュメントに記載されているPowerShellコマンドをほんの少しだけ修正したものを以下に記載しておきます。

$serviceKey = "HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent"
$keyInfo = (Get-Item -Path $serviceKey).GetValue("Environment")
# 環境に応じてプロキシサーバーを記載する
$proxyVariables = @("http_proxy=xxx.xxx.xxx.xxx:8080", "no_proxy=169.254.169.254")
# $nullの-eq比較はヨーダ記法の方が安全
If($null -eq $keyInfo) { 
    New-ItemProperty -Path $serviceKey -Name Environment -Value $proxyVariables -PropertyType MultiString -Force
} else {
    Set-ItemProperty -Path $serviceKey -Name Environment -Value $proxyVariables
}
# サービス再起動
Restart-Service AmazonSSMAgent