EC2インスタンスでプロキシを設定する際は必ずインスタンスメタデータのIPアドレスをバイパスさせよう
なんだかSSMセッションマネージャーでEC2インスタンスに接続できないぞ
こんにちは、のんピ(@non____97)です。
皆さんは「なんだかSSMセッションマネージャーで接続できないぞ」という現象に遭遇したことはありますか? 私はあります。
その原因はもしかしたらプロキシ設定が原因かもしれません。
私が遭遇したプロキシ設定の地味な落とし穴についてまとめてみます。
いきなりまとめ
- プロキシのバイパスにインスタンスメタデータのIPアドレスが設定されていないと、インスタンスメタデータにアクセスできず、SSMやS3などにアクセスするのに必要な認証情報を取得できない
- Windows ServerのEC2インスタンスのSSMエージェントはOSのプロキシ設定を参照する
- LinuxのEC2インスタンスの場合はSSMエージェントがプロキシを参照するために設定SSMエージェントの
Upstart
またはsystemd
の設定を変更する必要がある - サービスによってどこで設定されたプロキシ情報を参照するのかは異なる
SSMエージェントがプロキシサーバーを経由して通信をするための設定
Windows Serverの場合
今回私がつまづいたSSMエージェントを例に、サービスがプロキシサーバーを経由して通信をするための設定を整理してみます。
まず、Windows ServerのSSMエージェントの設定方法を確認します。
AWS公式ドキュメントを確認すると、PowerShellで以下コマンドを実行して設定するようです。
$serviceKey = "HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent" $keyInfo = (Get-Item -Path $serviceKey).GetValue("Environment") $proxyVariables = @("http_proxy=hostname:port", "no_proxy=169.254.169.254") If($keyInfo -eq $null) { New-ItemProperty -Path $serviceKey -Name Environment -Value $proxyVariables -PropertyType MultiString -Force } else { Set-ItemProperty -Path $serviceKey -Name Environment -Value $proxyVariables } Restart-Service AmazonSSMAgent
内容としてはSSMエージェントのレジストリでプロキシ設定を追加して、SSMエージェントのサービスを再起動しているようですね。
上述したコマンド内の、no_proxy=169.254.169.254
はインスタンスメタデータのIPアドレスです。このIPアドレスをバイパスしないと、インスタンスメタデータにアクセスできずSSMに必要な認証情報を取得できません。結果として、SSMセッションマネージャーやSSM Run Commandといったサービスを使用することができません。
私がSSMセッションマネージャーでEC2インスタンスで接続できなかった原因はこれによるものです。しかし、実はこの事象に遭遇した際、SSMエージェントのレジストリでプロキシ設定はしていませんでした。
私がしてやられたのは、SSMエージェントはレジストリ以外のプロキシ設定も参照するという点です。具体的にはSSMエージェントのプロキシ設定は上述のレジストリ設定をしなくても、以下のように優先順位に従ってプロキシ設定を参照します。
- SSMエージェントのレジストリ設定 (
HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent
) - システム環境変数 (
http_proxy
、https_proxy
、no_proxy
) - LocalSystem ユーザーアカウントの環境変数 (
http_proxy
、https_proxy、no_proxy
) - WinHTTP プロキシの設定
- Internet Explorer の設定
ここが一番の落とし穴です。
私は当時、Inspectorエージェントがプロキシを経由して通信をするために、WinHTTPプロキシを設定しました。その際のWinHTTPプロキシは、以下のようにインスタンスメタデータのIPアドレスをバイパスさせる設定が入っていませんでした。
> netsh winhttp set proxy proxy-server="<プロキシサーバーのIPアドレス>:<プロキシサーバーのポート>" bypass-list="169.254.169.254" 現在の WinHTTP プロキシ設定: プロキシ サーバー: <プロキシサーバーのIPアドレス>:<プロキシサーバーのポート> バイパス一覧 : (なし)
これにより、SSMエージェントは優先順位に従い、WinHTTPプロキシに設定された「インスタンスメタデータのIPアドレスをバイパスしないプロキシ設定」を参照しており、SSMエージェントの起動に失敗していました。
この状態だと、SSMエージェントを再起動しようとしても、Agent failed to assume any identity
となり、起動に失敗します。
# SSMエージェントの再起動 > Restart-Service AmazonSSMAgent 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の停止を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の停止を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の停止を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の開始を待っています... Restart-Service : サービス 'Amazon SSM Agent (AmazonSSMAgent)' を開始できませんでした。 発生場所 行:1 文字:1 + Restart-Service AmazonSSMAgent + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OpenError: (System.ServiceProcess.ServiceController:ServiceController) [Restart-Service], ServiceCommandException + FullyQualifiedErrorId : StartServiceFailed,Microsoft.PowerShell.Commands.RestartServiceCommand # SSMエージェントのログの確認 > Get-Content -path C:\ProgramData\Amazon\SSM\Logs\amazon-ssm-agent.log -tail 50 2021-10-11 02:15:18 INFO [amazon-ssm-agent] amazon-ssm-agent - v3.1.282.0 2021-10-11 02:15:18 INFO [amazon-ssm-agent] OS: windows, Arch: amd64 2021-10-11 02:15:18 INFO [amazon-ssm-agent] surveyor listener started on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination 2021-10-11 02:15:19 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker is not running, starting worker process 2021-10-11 02:15:23 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker (pid:4052) started 2021-10-11 02:15:23 INFO [amazon-ssm-agent] Agent subsystem has started, notifying windows service manager 2021-10-11 02:15:23 INFO [amazon-ssm-agent] Windows service manager notified that agent service has started 2021-10-11 02:15:23 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Monitor long running worker health every 60 seconds 2021-10-11 02:48:03 INFO [amazon-ssm-agent] Service received stop ChangeRequest 2021-10-11 02:48:03 INFO [amazon-ssm-agent] Stopping Core Agent 2021-10-11 02:48:03 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Receiving stop signal, stop worker monitor 2021-10-11 02:48:04 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Received worker termination result, &{SchemaVersion:1 Topic:GetWorkerHealthResult Payload: [123 34 83 99 104 101 109 97 86 101 114 115 105 111 110 34 58 49 44 34 78 97 109 101 34 58 34 115 115 109 45 97 103 101 110 116 45 119 111 114 107 101 114 34 44 34 87 111 114 107 101 114 84 121 112 101 34 58 34 76 111 110 103 82 117 110 110 105 110 103 34 44 34 80 105 100 34 58 52 48 53 50 44 34 73 115 84 101 114 109 105 110 97 116 105 110 103 34 58 116 114 117 101 125]} 2021-10-11 02:48:04 INFO [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health requested close 2021-10-11 02:48:04 INFO [amazon-ssm-agent] Closed the file watcher listener thread 2021-10-11 02:48:04 INFO [amazon-ssm-agent] surveyor listener stopped on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health 2021-10-11 02:48:04 WARN [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health closed 2021-10-11 02:48:04 INFO [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination requested close 2021-10-11 02:48:04 INFO [amazon-ssm-agent] Closed the file watcher listener thread 2021-10-11 02:48:04 INFO [amazon-ssm-agent] surveyor listener stopped on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination 2021-10-11 02:48:04 WARN [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination closed 2021-10-11 02:48:10 INFO [amazon-ssm-agent] Bye. 2021-10-11 02:48:10 INFO main function returning 2021-10-11 02:48:10 INFO Starting up windows agent 2021-10-11 02:48:10 INFO Waiting for system state 2021-10-11 02:48:10 INFO System is ready 2021-10-11 02:48:10 INFO Starting up agent subsystem 2021-10-11 02:48:10 INFO Getting IE proxy configuration for current user: The operation completed successfully. 2021-10-11 02:48:10 INFO Getting WinHTTP proxy default configuration: The operation completed successfully. 2021-10-11 02:48:10 INFO Proxy environment variables: 2021-10-11 02:48:10 INFO https_proxy: 2021-10-11 02:48:10 INFO http_proxy: http://10.0.0.18:8080 2021-10-11 02:48:10 INFO no_proxy: 2021-10-11 02:48:17 ERROR Agent failed to assume any identity 2021-10-11 02:48:17 ERROR failed to find identity, retrying: failed to find agent identity 2021-10-11 02:48:23 ERROR Agent failed to assume any identity 2021-10-11 02:48:23 ERROR failed to find identity, retrying: failed to find agent identity 2021-10-11 02:48:30 ERROR Agent failed to assume any identity 2021-10-11 02:48:30 ERROR failed to get identity: failed to find agent identity 2021-10-11 02:48:30 ERROR Failed to start agent. failed to get identity: failed to find agent identity 2021-10-11 02:48:30 INFO main function returning 2021-10-11 02:49:00 INFO Starting up windows agent 2021-10-11 02:49:00 INFO Waiting for system state 2021-10-11 02:49:00 INFO System is ready 2021-10-11 02:49:00 INFO Starting up agent subsystem 2021-10-11 02:49:00 INFO Getting IE proxy configuration for current user: The operation completed successfully. 2021-10-11 02:49:00 INFO Getting WinHTTP proxy default configuration: The operation completed successfully. 2021-10-11 02:49:00 INFO Proxy environment variables: 2021-10-11 02:49:00 INFO no_proxy: 2021-10-11 02:49:00 INFO https_proxy: 2021-10-11 02:49:00 INFO http_proxy: http://10.0.0.18:8080 # SSMエージェントのサービスの起動状態の確認 > Get-Service AmazonSSMAgent Status Name DisplayName ------ ---- ----------- Stopped AmazonSSMAgent Amazon SSM Agent
ちなみに、プロキシ設定でインスタンスメタデータのIPアドレスをバイパスしている場合は、以下のようなログが出力されます。
# WinHTTPプロキシの設定 > netsh winhttp set proxy proxy-server="10.0.0.18:8080" bypass-list="169.254.169.254" 現在の WinHTTP プロキシ設定: プロキシ サーバー: 10.0.0.18:8080 バイパス一覧 : 169.254.169.254 # SSMエージェントの再起動 > Restart-Service AmazonSSMAgent 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の停止を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の停止を待っています... 警告: サービス 'Amazon SSM Agent (AmazonSSMAgent)' の停止を待っています... # SSMエージェントのサービスの起動状態の確認 > Get-Service AmazonSSMAgent Status Name DisplayName ------ ---- ----------- Running AmazonSSMAgent Amazon SSM Agent # SSMエージェントのログの確認 > Get-Content -path C:\ProgramData\Amazon\SSM\Logs\amazon-ssm-agent.log -tail 50 2021-10-11 02:50:38 INFO [amazon-ssm-agent] using file channel for IPC 2021-10-11 02:50:38 INFO [amazon-ssm-agent] channel: termination not found, creating a new file channel... 2021-10-11 02:50:38 INFO [amazon-ssm-agent] surveyor listener started on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health 2021-10-11 02:50:38 INFO [amazon-ssm-agent] amazon-ssm-agent - v3.1.282.0 2021-10-11 02:50:38 INFO [amazon-ssm-agent] OS: windows, Arch: amd64 2021-10-11 02:50:38 INFO [amazon-ssm-agent] surveyor listener started on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination 2021-10-11 02:50:39 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker is not running, starting worker process 2021-10-11 02:50:39 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker (pid:400) started 2021-10-11 02:50:39 INFO [amazon-ssm-agent] Agent subsystem has started, notifying windows service manager 2021-10-11 02:50:39 INFO [amazon-ssm-agent] Windows service manager notified that agent service has started 2021-10-11 02:50:39 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Monitor long running worker health every 60 seconds 2021-10-11 02:51:20 INFO [amazon-ssm-agent] Service received stop ChangeRequest 2021-10-11 02:51:20 INFO [amazon-ssm-agent] Stopping Core Agent 2021-10-11 02:51:20 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Receiving stop signal, stop worker monitor 2021-10-11 02:51:21 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Received worker termination result, &{SchemaVersion:1 Topic:GetWorkerHealthResult Payload: [123 34 83 99 104 101 109 97 86 101 114 115 105 111 110 34 58 49 44 34 78 97 109 101 34 58 34 115 115 109 45 97 103 101 110 116 45 119 111 114 107 101 114 34 44 34 87 111 114 107 101 114 84 121 112 101 34 58 34 76 111 110 103 82 117 110 110 105 110 103 34 44 34 80 105 100 34 58 52 48 48 44 34 73 115 84 101 114 109 105 110 97 116 105 110 103 34 58 116 114 117 101 125]} 2021-10-11 02:51:21 INFO [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health requested close 2021-10-11 02:51:21 INFO [amazon-ssm-agent] Closed the file watcher listener thread 2021-10-11 02:51:21 INFO [amazon-ssm-agent] surveyor listener stopped on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health 2021-10-11 02:51:21 WARN [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health closed 2021-10-11 02:51:21 INFO [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination requested close 2021-10-11 02:51:21 INFO [amazon-ssm-agent] Closed the file watcher listener thread 2021-10-11 02:51:21 INFO [amazon-ssm-agent] surveyor listener stopped on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination 2021-10-11 02:51:21 WARN [amazon-ssm-agent] channel C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination closed 2021-10-11 02:51:27 INFO [amazon-ssm-agent] Bye. 2021-10-11 02:51:27 INFO main function returning 2021-10-11 02:51:28 INFO Starting up windows agent 2021-10-11 02:51:28 INFO Waiting for system state 2021-10-11 02:51:28 INFO System is ready 2021-10-11 02:51:28 INFO Starting up agent subsystem 2021-10-11 02:51:28 INFO Getting IE proxy configuration for current user: The operation completed successfully. 2021-10-11 02:51:28 INFO Getting WinHTTP proxy default configuration: The operation completed successfully. 2021-10-11 02:51:28 INFO Proxy environment variables: 2021-10-11 02:51:28 INFO no_proxy: 169.254.169.254 2021-10-11 02:51:28 INFO https_proxy: 2021-10-11 02:51:28 INFO http_proxy: http://10.0.0.18:8080 2021-10-11 02:51:28 INFO Agent will take identity from EC2 2021-10-11 02:51:28 INFO [amazon-ssm-agent] Not using named pipe on windows 2021-10-11 02:51:28 INFO [amazon-ssm-agent] using file channel for IPC 2021-10-11 02:51:28 INFO [amazon-ssm-agent] channel: health not found, creating a new file channel... 2021-10-11 02:51:28 INFO [amazon-ssm-agent] using file channel for IPC 2021-10-11 02:51:28 INFO [amazon-ssm-agent] channel: termination not found, creating a new file channel... 2021-10-11 02:51:28 INFO [amazon-ssm-agent] surveyor listener started on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\health 2021-10-11 02:51:28 INFO [amazon-ssm-agent] amazon-ssm-agent - v3.1.282.0 2021-10-11 02:51:28 INFO [amazon-ssm-agent] OS: windows, Arch: amd64 2021-10-11 02:51:28 INFO [amazon-ssm-agent] surveyor listener started on path: C:\ProgramData\Amazon\SSM\InstanceData\i-0a50e25e80d78e668\channels\termination 2021-10-11 02:51:29 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker is not running, starting worker process 2021-10-11 02:51:29 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] [WorkerProvider] Worker ssm-agent-worker (pid:60) started 2021-10-11 02:51:29 INFO [amazon-ssm-agent] Agent subsystem has started, notifying windows service manager 2021-10-11 02:51:29 INFO [amazon-ssm-agent] Windows service manager notified that agent service has started 2021-10-11 02:51:29 INFO [amazon-ssm-agent] [LongRunningWorkerContainer] Monitor long running worker health every 60 seconds
Linuxの場合
Windows Serverの場合は、複数のプロキシ設定を優先順位に応じて参照するようになっていましたが、Linuxの場合はどうでしょうか。
AWS公式ドキュメントを確認すると、Upstart
またはsystemd
の設定を変更する必要があるようです。
# /etc/init/amazon-ssm-agent.override でHTTPSプロキシサーバーの指定を行う $ sudo tee /etc/init/amazon-ssm-agent.override -a <<"EOF" >/dev/null env http_proxy=http://hostname:port env https_proxy=https://hostname:port env no_proxy=169.254.169.254 EOF # SSMエージェントの停止、起動 sudo stop amazon-ssm-agent sudo start amazon-ssm-agent
# SSMエージェントのunitファイルに反映させたい内容を入力する ---------- [Service] Environment="http_proxy=http://hostname:port" Environment="https_proxy=https://hostname:port" Environment="no_proxy=169.254.169.254" ---------- $ sudo systemctl edit amazon-ssm-agent # 入力した情報が override.conf として保存されていることを確認する $ls -l /etc/systemd/system/amazon-ssm-agent.service.d/ total 4 -rw-r--r-- 1 root root 133 Oct 11 02:22 override.conf $ cat /etc/systemd/system/amazon-ssm-agent.service.d/override.conf [Service] Environment="http_proxy=http://hostname:port" Environment="https_proxy=https://hostname:port" Environment="no_proxy=169.254.169.254" # systemdのリロードとSSMエージェントの再起動 $ sudo systemctl daemon-reload && sudo systemctl restart amazon-ssm-agent
その他のサービスのプロキシ設定も確認してみた
ついでに、その他のサービスのプロキシ設定も確認してみました。サービスによって設定箇所はまちまちですね。
CloudWatchエージェント
common-config.toml
で設定します。
ECS Containerエージェント
以下のように、OS及び発生する通信によってプロキシ設定を行う箇所が異なります。
- Linux
- ECS エージェントがインターネットへ接続する場合
/etc/ecs/ecs.config
(Amazon Linux 2 および Amazon Linux AMI)
ecs-init
がインターネットへ接続する場合/etc/systemd/system/ecs.service.d/http-proxy.conf
(Amazon Linux 2 のみ)/etc/init/ecs.override
(Amazon Linux AMI のみ)
- Dockerデーモンがインターネットへ接続する場合
/etc/systemd/system/docker.service.d/http-proxy.conf
(Amazon Linux 2 のみ)/etc/sysconfig/docker
(Amazon Linux AMI および Amazon Linux 2 のみ)
- ECS エージェントがインターネットへ接続する場合
- Windows Server
- 環境変数(
HTTP_PROXY
,NO_PROXY
)
- 環境変数(
Kinesis Agent for Windows
%Program Files%\Amazon\KinesisTap\AWSKinesisTap.exe.config
で設定します。
CodeDeployエージェント
Linuxはcodedeployagent.yml
、Windows Serverはconf.yml
の:proxy_uri:
で設定します。
X-Ray Daemon
環境変数(HTTPS_PROXY
)やコマンドラインオプション(--proxy-address
or-p
)、設定ファイル(xray-daemon.yaml
)で設定します。
AWS CLI
環境変数(HTTPS_PROXY
, HTTPS_PROXY
)で設定します。
AWS Tools for PowerShell
Set-AWSProxy
コマンドレットで設定します。
プロキシ設定の影響範囲は意外と広い
EC2インスタンスでプロキシ設定をする際に、インスタンスメタデータのIPアドレスをバイパスさせる必要性を調べてみました。
特に、環境変数やWinHTTPプロキシ、IEのプロキシ設定を変更する場合は、その影響範囲を確認する必要があると感じました。「プロキシ設定を変更したら、意図しないサービスが正常に動作しなくなった」ということも起こり得るので、該当のEC2インスタンスでどのようなサービスが起動していて、どのような通信が発生するのかを整理することが重要だと考えます。
この記事が誰かの助けになれば幸いです。
以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!