この記事は過去のエラー解決メモを整理したものです。
現在の推奨手順とは異なる可能性があります。
公式ドキュメントを確認して最新情報と差分がないかを確認してください。
事象
プライベートサブネットでモジュールを入れようとして、pip3 install とすると、以下のようなエラーが出ると思います
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7fa895d65890>: Failed to establish a new connection: [Errno 101] Network is unreachable')': /simple/pandas/
これはプライベートサブネットがインターネットに繋がっていない(仕様)ことが原因です
NATゲートウェイを使うことで解決できるのですが、いかんせん高いので使いたくない
そこで、NATゲートウェイを使わずにプライベートサブネットでpip3 installする方法を紹介します
環境
前提
以下のような環境を想定しています
プライベートサブネットとパブリックサブネットに一つずつインスタンスがある構成です
パブリックサブネットにはElasticIPが紐づけられています
原因
プライベートサブネットがインターネットに接続できない構成になっているため。
対策
ポートフォワーディングして、proxychains-ngを導入することで解決します
プライベートサブネットでインターネットを経由してpip3 installを行う方法
プライベートサブネットでインターネットを経由してpip3 installを行うには
- ポートフォワーディングの設定をした後で
- proxychainsでproxy経由で通信するように設定します
ポートフォワーディングの設定
プライベートサブネットからインターネットに通信できるようにするにはポートフォワーディングを行います
今、次の2つがssh接続できるようになっています
- PC->パブリック (パブリックインスタンスにElasticIPが紐づけられているため)
- パブリック->プライベート (プライベートインスタンスはパブリックインスタンスからssh接続できる仕様)
PC->パブリック->(転送)->パブリック->プライベートのようにポートフォワーディングを行うことでプライベートサブネットからインターネットに通信できるようになります
ポートフォワーディングの手順
-
公開鍵をパブリックインスタンスにコピーします
scp -i "C:\Users\xings\.ssh\keys\aws_ax1_project.pem" -r "C:\Users\xings\.ssh\keys\aws_ax1_project.pem" ec2-user@43.207.191.40:/home/ec2-user/.ssh -
PCからパブリックインスタンスにssh接続を行いログインします
ssh -i "C:\Users\xings\.ssh\keys\aws_ax1_project.pem" ec2-user@43.207.191.40 -
公開鍵の権限を変更します
chmod 600 ~/.ssh/aws_ax1_project.pem -
パブリックインスタンスからパブリックインスタンスにssh接続します
-Dオプションを使うことでパブリックインスタンスの1080番ポートを、リスニングポートとして有効にしています
ssh localhost -D 1080 -i ~/.ssh/aws_ax1_project.pem -
パブリックインスタンスからプライベートインスタンスにssh接続します
-Rオプションを使うことでプライベートインスタンスの2080番ポートをパブリックインスタンスの1080番ポートに転送しています
ssh -R 2080:localhost:1080 ec2-user@10.0.139.136 -i ~/.ssh/aws_ax1_project.pem -
確認用コマンドを実行して、成功しているかテストします
curl http://ifconfig.io --proxy 'socks5h://localhost:2080'IPアドレスが出力されれば成功です
proxychains-ngの設定
socks5://127.0.0.1:2080を経由することで外部と通信できるようになりました
ただ、コマンド実行時に毎回proxyを指定するのは面倒です
そこで、proxychains-ngを導入して、ネットワークを利用するコマンドの通信がSOCKS/HTTPプロキシを経由するように設定します
proxychains-ngの手順
※プライベートサブネットにログインした状態で作業します
-
以下のコマンドを実行します(gccなどコンパイラーが必要です)
cd /opt sudo curl --proxy socks5://127.0.0.1:2080 -O http://ftp.barfooze.de/pub/sabotage/tarballs/proxychains-ng-4.16.tar.xz sudo tar Jxvf ./proxychains-ng-4.16.tar.xz cd proxychains-ng-4.16 sudo ./configure --prefix=/usr --sysconfdir=/etc make sudo make install -
sudo vim /etc/proxychains.confコマンドで/etc/proxychains.confを編集します以下の内容を書き込みます(:wqで保存)
[ProxyList] socks5 127.0.0.1 2080 -
sudo proxychains4 bashコマンドを実行します -
curl http://ifconfig.ioコマンドを実行して上手くできているかテストしますIPアドレスが出力されれば成功です
補足 次から接続する時の手順
この記事の設定をした後にプライベートサブネットに接続するときは以下の手順を実行する必要があります
ssh localhost -D 1080 -i ~/.ssh/aws_ax1_project.pemssh -R 2080:localhost:1080 ec2-user@10.0.139.136 -i ~/.ssh/aws_ax1_project.pemsudo proxychains4 bash

