プロキシ (Squid) 経由で SSM を使えるようにする

記事タイトルとURLをコピーする

こんにちは、やまぐちです。

概要

Proxy (Squid) 経由で SSM を使用できるようするまでを書きます。

構成図は以下のような形です。
パブリックサブネットに NAT Gateway を配置する代わりに EC2 (Squid) を設置する形です。
今回は、検証用ですので Squid の認証設定などは行いません。


Proxy 経由で EC2 のログを CloudWatch Logs へログを出力させる記事は以下になりますので、ご参考までに(前半はほぼ同じ内容です) blog.serverworks.co.jp

流れ

  1. EC2 インスタンスの作成

  2. パブリックサブネットの EC2 インスタンスに Squid をインストール・設定

  3. プライベートサブネットの EC2 インスタンス内の SSM の設定ファイルを編集

  4. フリートマネージャーで確認

やってみる

1. EC2 インスタンスの作成

プライベートサブネットとパブリックサブネットにそれぞれ EC2 を作成します。

以下キャプチャの赤枠で囲っている部分です。

今回は検証用ですので、インスタンスタイプは t3.micro としました。
ちなみに OS は Amazon Linux 2023 にしました。

その他の設定値について

アタッチする IAMロール

  • Squid インスタンス:付与してもしなくてもよい

  • 対象インスタンス:AmazonSSMManagedInstanceCore がアタッチされた IAMロール

アタッチするセキュリティグループ

  • Squid インスタンス:以下のインバウンドルールを含めたセキュリティグループ
タイプ プロトコル ポート範囲 ソース
SSH TCP 22 ログイン元のIPアドレス
カスタム TCP TCP 3128 対象インスタンスのIPアドレス or 対象インスタンスにアタッチされているセキュリティグループ


  • 対象インスタンス:以下のインバウンドルールを含めたセキュリティグループ
タイプ プロトコル ポート範囲 ソース
SSH TCP 22 Squid インスタンスのIPアドレス or Squid インスタンスにアタッチされているセキュリティグループ
(Squidインスタンスからポートフォワードする場合)

2. パブリックサブネットの EC2 インスタンスに Squid をインストール・設定

パブリックサブネットに作成した Squid 用インスタンスにログインし、Squid をインストールします。(dnf ではなく yum でも OK)

$ sudo dnf install  squid -y

インストールが完了したら Squid の設定ファイルの/etc/squid/squid.conf を編集します。

$ sudo vim /etc/squid/squid.conf

http_access allow localhostが記載されている箇所の上に、http_access allow localnetを追記します。

http_access allow localnet
http_access allow localhost

アクセスを追記したlocalnet/etc/squid/squid.conf内の最初の方に書かれているプライベートIPアドレスのことを指します。

acl localnet src 0.0.0.1-0.255.255.255  # RFC 1122 "this" network (LAN)
acl localnet src 10.0.0.0/8             # RFC 1918 local private network (LAN)
acl localnet src 100.64.0.0/10          # RFC 6598 shared address space (CGN)
acl localnet src 169.254.0.0/16         # RFC 3927 link-local (directly plugged) machines
acl localnet src 172.16.0.0/12          # RFC 1918 local private network (LAN)
acl localnet src 192.168.0.0/16         # RFC 1918 local private network (LAN)
acl localnet src fc00::/7               # RFC 4193 local private network range
acl localnet src fe80::/10              # RFC 4291 link-local (directly plugged) machines

設定を読み込ませます。

$ sudo systemctl restart squid

ここまで完了したら、Squid の設定は完了です。
本来であれば/etc/squid/squid.conf内をいじってアクセス元やアクセス先の制限を行ったりしますが、今回は検証用なのでそこまでは行いません。

3. プライベートサブネットの EC2 インスタンス内の SSM の設定ファイルを編集

では次は、プライベートサブネットに作成した SSM の利用対象のインスタンスにログインします。
ログイン方法については詳しく言及しませんが、今回はパブリックサブネットの Squid サーバからポートフォワードでログインしました。

また、設定手順は以下のドキュメントを参考にしてます。
Upstart のケースも書かれています

docs.aws.amazon.com

ログインが完了したら、SSM Agent がインストールされているかを確認します。

$ sudo systemctl status amazon-ssm-agent

冒頭でお伝えしました通り、今回は Amazon Linux 2023 で作成しましたのでデフォルトで SSM Agent はインストールされている状態です。
一部 OS では SSM Agent 自体がデフォルトでインストールされていない場合があるのでその場合はインストールを行います(インストール方法については割愛します)

Proxy を使用するように SSM Agent を設定する

Proxy を使用するように設定を記載します。

$ sudo systemctl edit amazon-ssm-agent

記載する内容は以下です。(vim か nano で記載します)

[Service]
Environment="http_proxy=http://Squid用インスタンスのプライベート IP DNS 名:3128"
Environment="https_proxy=http://Squid用インスタンスのプライベート IP DNS 名:3128"
Environment="no_proxy=169.254.169.254"

記載が完了したら設定を読み込ませて、再起動させます。

$ sudo systemctl daemon-reload && sudo systemctl restart amazon-ssm-agent

ステータスを確認し、起動していることを確認します。

$ sudo systemctl status amazon-ssm-agent

Proxy が正しく指定されていることを確認する

$ sudo cat /etc/systemd/system/amazon-ssm-agent.service.d/override.conf

4. フリートマネージャーから確認

対象インスタンスがフリートマネージャーに表れ、Ping ステータス が「オンライン」になっていれば設定完了です。

繋がらない時は

もし、うまくつながらない時は以下のログを確認して手がかりを探しましょう。

  • Squidインスタンス:/var/log/squid/access.log

  • 対象インスタンス:/var/log/amazon/ssm/amazon-ssm-agent.log, /var/log/amazon/ssm/errors.log

最後に

インターネット経由で SSM へ接続したくないという場合は、以下の3つのエンドポイント経由でアクセスさせることもできますのでご参考までに
むしろ、Proxy 経由よりもエンドポイント経由で接続させるパターンの方が多いのかなとは感じてます。

  • ssm.region.amazonaws.com

  • ssmmessages.region.amazonaws.com

  • ec2messages.region.amazonaws.com

やまぐち まさる (記事一覧)

CS部・CS2課

AWS の構築・運用をやってます

3度の飯より野球が好き

2023 Japan AWS All Certifications Engineers