AWS ではVPCのネットワークACLを利用してアクセス制限をかける。特に、ssh(ポート22) は特定のIPからの接続しか許可しないのが普通だと思う。セキュリティグループを使う場合もあるけど、ここでは、ネットワークACLで制限をかけている前提。
wifi ルーターなんかのグローバルIPが変動するもの経由でIPのしぼられたサーバに接続したい時、通常 VPN を使うだろうけども、それがない場合は ACL を変更してアクセスすることになる。そういう時の楽で間違えない対応方法ということで。
前提
環境は Mac で。Windows でも基本的に同じことができるが、sed とか無いので、bash とかを cygwin なんかで入れてもらうのがてっとりばやそう。
普通のやり方
いちいちAWSマネジメントコンソールにログインして VPC-->ネットワークACLのインバウンドを修正する、というのが普通のやり方。毎回は面倒くさい。
コマンドラインで出来ないか?
コマンドラインでこれを実現するには、
- 自分のグローバルIPの取得
- ACLの設定(変更)
ができれば良いよな、できるよな・・・と思い立った。
前準備
pip と awscli をインストールする。
コマンドラインで以下を実行。
$ sudo easy_install pip
$ sudo pip install awscli
awscli 利用するために若干設定が必要だけど、これはいろんなところに情報あるので省略する。
自分のグローバルIPの取得方法
グローバルIPを返してくれるサービスを使う。ifconfig.me が定番だけどえらい遅いので、別のを使う。今回は、httpbin.org/ip を使った。レスポンスが json なんで、必要な所だけ切り出して使う。
$ curl -s httpbin.org/ip | sed -n -e "s/.*: .\(.*\).$/\1/p"
これで、自分の IP アドレスだけ表示されたらOK。
aws コマンドと組み合わせたワンライナー
事前に書き換えたい network-acl-id、ACLの rule-number を確認しておいて、以上を使ったワンライナーが以下。ここでは network-acl-id が acl-acsdee9c9、ACLインバウンドの rule-number が2200番を指定した。
$ aws ec2 replace-network-acl-entry --network-acl-id acl-acsdee9c9 --ingress --rule-number 2200 --protocol all --rule-action allow --cidr-block `curl -s httpbin.org/ip | sed -n -e "s/.*: .\(.*\).$/\1/p"`/32
長くてゴメン。
必要であればこれをそのままシェルスクリプトにすればいい。自分のグローバルIP の部分を任意のグローバルIPにすることも出来るので、日常のオペレーションでもこれを使ったほうが間違いが少ないように思う。
いじょ。