こんにちは。福岡オフィスのtakadaです。
今回は、
「AWS上で従量制料金で利用しているRedHat Linuxのパッケージアップデートは、AWSのインターネットゲートウェイ経由でしかアップデートができない」
ということをネタに書こうと思っていましたが、
実はインターネットに抜けることができれば、オンプレミス側のネットワーク側からでもアップデートができるようになっていました。
。。。ということで、書くことがなくなってしまいました。
方針転換して、プライベートサブネット内のLinuxのオンラインパッケージアップデートのやり方について書くことにしました。
想定する環境
以下のような環境を想定します。
-
パブリックサブネット
Internet Gatewayにルーティングを持ち、これを利用して、インターネット側と通信ができるサブネットです。
このサブネットには、EIPでグローバルIPアドレスが付与されたLinuxのEC2インスタンス(Instance-public)が配置されています。
-
プライベートサブネット
インターネット側との通信ができないサブネットです。
パブリックサブネットとはルーティングが存在するため、疎通可能です。
このサブネットには、プライベートIPアドレスのみ付与されたLinuxのEC2インスタンス(Instance-private)が配置されています。
このような構成とき、Instance-privateのパッケージアップデートをオンラインで行うためには、どうしたらよいでしょうか?
考えられる方法
方法として、以下の2つが考えられます。
-
NATを利用する方法
パブリックサブネット上に、 NATインスタンスまたはNATゲートウェイを構築し、プライベートサブネットのルートテーブルでデフォルトゲートウェイ(0.0.0.0/0)を、 NATインスタンスまたはNATゲートウェイに設定します。一旦、構築と設定を行うと、それ以降は特別な操作をすることなく、インターネット経由でパッケージアップデートができそうです。
ただし、NATインスタンス、NATゲートウェイは課金対象となります。また、NATインスタンスは、使用しないときだけ停止しておくことで、コストが抑制できますが、NATゲートウェイは停止ができないため、常に課金が発生することになります。
-
プロキシサーバを利用する方法
パブリックサブネット上に、EC2でプロキシサーバを構築します。Linuxですと、Squidを使ってプロキシサーバを作ることができます。構築した後に、Instance-privateのLinuxのパッケージ管理システムで、このプロキシサーバを設定します。RHEL系のyumですと、/etc/yum.confに以下のような設定を行うことで、プロキシサーバ経由でパッケージアップデートを行うことができます。(当然ですが、プロキシサーバ側で3128ポートを許可するセキュリティグループの設定が必要です。)proxy=http://proxyserver:3128
この方法でも、プロキシサーバを別途立てた場合、その分EC2の課金が発生します。使用しないときだけ停止しておいたり、もともと配置しているInstance-publicにsquidを構成することでコストを削減することはできそうです。
上記2つ以外に、追加課金を発生させずパッケージアップデートを行う方法を考えてみました。
sshポートフォワーディングを使った方法
この方法は、以下の条件が揃っていることが前提となります。
- 操作端末から、Instance-publicにssh接続が可能であること
- Instance-publicからInstance-privateへssh接続が可能であること
-
操作端末からInstance-publicへssh接続を行いログインします。
-
Instance-public上で、自分自身(Instance-public)にssh接続を行います。このとき、ダイナミックフォワーディングを有効にして接続します。下の例では、Instance-publicの1080番ポートを、リスニングポートとして有効にしています。
ssh ec2-user@instance-public -D 1080 -i sshkeyfile.pem
-
Instance-publicからInstance-privateへssh接続を行います。このとき、リモートポートフォワーディングを有効して接続を行います。下の例では、Instance-privateの2080番ポートをInstance-publicの1080番ポートに転送します。
ssh -R 2080:localhost:1080 ec2-user@instance-private -i sshkeyfile.pem
-
Instance-private上で、/etc/yum.confを編集し、以下の行を追加します。
proxy=socks5://127.0.0.1:2080
-
パッケージアップデートを行います。
sudo yum update
実際の通信の流れは、以下のようになります。パッケージアップデートの通信は、sshのトンネルの中を流れるため、instance-publicとinstance-privateの間はsshのポートだけが使用されるので、追加でセキュリティグループを設定する必要はありません。
まとめ
sshのポートフォワーディングを使うと、NATやプロキシサーバを構築しなくても、プライベートサブネット上のEC2のパッケージアップデートを行うことができました。
最初、書くネタがなくなって、絶望の淵に立たされましたが、なんとか最後まで書き終えることができて、よかったです。人間、諦めなければ、時々は、何とかなります。(何とかなっているのだろうか)