どうも、若松です。

先日ローンチされたInstanceConnect、すこぶる便利ですね。
純粋なSSHなので、SessionManagerのような環境変数が読み込まれない等がなくて快適です。
ただし、コマンド履歴のログは取れないのでトレードオフですね。

コンソールからSSHする際に躓くIPレンジの許可

InstanceConnectは純粋なSSHのため、SGでIPレンジを許可してあげる必要があります。
許可するべきIPレンジは以下にありますが、探すのが面倒です。
https://ip-ranges.amazonaws.com/ip-ranges.json

そこで以下のBashワンライナーを駆使することで、許可すべきIPレンジを一発で出すことができます。(curlとjqを実行できることが前提です。)

curl -s https://ip-ranges.amazonaws.com/ip-ranges.json | jq '.prefixes[]' | jq 'select(.service == "EC2_INSTANCE_CONNECT" and .region == "ap-northeast-1").ip_prefix'

ワンライナーの解説

curl

curlコマンドを用いてWeb上のjsonをダウンロードしています。
このjsonはAWSが公開している、AWSが使用しているIPレンジの一覧です。
-s はダウンロード時間などの無駄な情報を出力しないようにするオプションです。

1個目のjq

1個目のjqでprefixesの中身を抜き出しています。
これを入れている理由は、次に行うselectで、配列を渡してしまうとjsonのトップレベルが帰ってしまうからです。

2個目のjq

ここで絞り込みを行っています。
絞り込み条件は以下です。

項目
service EC2_INSTANCE_CONNECT
region ap-northeast-1

つまり、東京リージョンのInstanceConnectで使用されるIPレンジに絞っています。
さらに出力をip_prefixのみ指定することでIPレンジのみが出力されます。

2019/6/30時点では以下が出力されるはずです。

"3.112.23.0/29"

まとめ

最初は公開されているIPレンジを全て許可しなくてはいけないのかと絶望しましたが、絞ってみると案外少なくてホッとしました。
ただ、このIPレンジは追加/変更される可能性があるので、本気でマネージメントコンソールからのSSHを運用に組み込みたい場合は、定期的にjsonの変更を監視し、SGの変更を自動化しておく必要があるかと思います。

元記事はこちら

東京リージョンのマネージメントコンソールからInstanceConnectでSSHする際のIPレンジを調べるワンライナー