EC2インスタンスでプロキシを設定する際は必ずインスタンスメタデータのIPアドレスをバイパスさせよう

EC2インスタンスでプロキシ設定をする場合は、必ずインスタンスメタデータのIPアドレスをバイパスするように設定する必要があります。この設定がない場合、インスタンスメタデータにアクセスできないため、IAMロールをEC2インスタンスにアタッチしていてもSSMやS3などの操作を行うことができません。
2021.10.11

なんだか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エージェントのプロキシ設定は上述のレジストリ設定をしなくても、以下のように優先順位に従ってプロキシ設定を参照します。

  1. SSMエージェントのレジストリ設定 (HKLM:\SYSTEM\CurrentControlSet\Services\AmazonSSMAgent)
  2. システム環境変数 (http_proxyhttps_proxyno_proxy)
  3. LocalSystem ユーザーアカウントの環境変数 (http_proxyhttps_proxy、no_proxy)
  4. WinHTTP プロキシの設定
  5. 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の設定を変更する必要があるようです。

Upstartの場合

# /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

systemdの場合

# 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 のみ)
  • 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-addressor-p)、設定ファイル(xray-daemon.yaml)で設定します。

AWS CLI

環境変数(HTTPS_PROXY, HTTPS_PROXY)で設定します。

AWS Tools for PowerShell

Set-AWSProxyコマンドレットで設定します。

プロキシ設定の影響範囲は意外と広い

EC2インスタンスでプロキシ設定をする際に、インスタンスメタデータのIPアドレスをバイパスさせる必要性を調べてみました。

特に、環境変数やWinHTTPプロキシ、IEのプロキシ設定を変更する場合は、その影響範囲を確認する必要があると感じました。「プロキシ設定を変更したら、意図しないサービスが正常に動作しなくなった」ということも起こり得るので、該当のEC2インスタンスでどのようなサービスが起動していて、どのような通信が発生するのかを整理することが重要だと考えます。

このブログが誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!