EC2 Instance Connect EndpointでAWS CLIからパブリックサブネットのホストにアクセスする
Session Managerはちとお高いので、EC2 Instance Connect Endpointを使ってみた。
AWS公式の記事もそうなのだけど、
referred from https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html
プライベートサブネットのEC2に踏み台無しでログインできる、ということは書いてあるのだが、では果たしてパブリックサブネットのEC2にはアクセスできるのか?ということは明示的に書いていない。
普通に考えるとまあできるんだろうということで実際にやってみたのだが、
- マネージメントコンソールからの接続は、プライベート・パブリック共にOK
- AWS CLIからの接続は、プライベート: OK、パブリック: NG
となった。もう少し細かく書くと、パブリックサブネットでパブリックIPv4アドレスを割り当てたEC2インスタンスに対して、AWS CLIで接続すると
aws ec2-instance-connect ssh --instance-id i-XXXXXXXXXX
ssh: connect to host XX.XX.XX.XX port 22: Operation timed out
※上記のIPアドレスは場プリックサブネットのEC2インスタンスに割り当てたEIPのアドレス
となって接続できない。プライベートサブネットのEC2には接続できる。
でここを見ると、
EC2 Instance Connect
(snip)
特徴としては接続する側・される側両方でパブリックIPを使用してインスタンスに接続するため、Amazon EC2 インスタンス自体にパブリックIPが付与されている必要があります。
referred from https://dev.classmethod.jp/articles/connect-to-amazon-ec2-instance-recheck/EC2 Instance Connect エンドポイント
続いて、プライベートIPを使用して接続する「EC2 Instance Connect エンドポイント」を使用する方法について説明します。
(snip)
これを使用することで、プライベートサブネットに配置したパブリックIPを持たないAmazon EC2 インスタンスでも、踏み台インスタンスなどを配置することなく、安全に接続することができます。
referred from https://dev.classmethod.jp/articles/connect-to-amazon-ec2-instance-recheck/
でCLIの指定。
EC2 Instance Connectの場合
aws ec2-instance-connect ssh --connection-type direct --instance-id <インスタンスID>
EC2 Instance Connect Endpointの場合
aws ec2-instance-connect ssh --connection-type eice --instance-id <インスタンスID>
AWS CLI v2のリファレンス
--connection-type
(文字列) インスタンスへの SSH 接続方法を指定します。 (デフォルト: auto)
direct
: インスタンスに直接 SSH 接続します。 CLI は以下の順序で IP アドレスを使用して接続を試みます。
- パブリック IPv4
- IPv6
- プライベート IPv4
eice
: EC2 インスタンスコネクトエンドポイントを使用して SSH 接続します。 CLI は常にプライベート IPv4 アドレスを使用します。auto
: CLI はインスタンス情報に基づいて、使用する接続タイプ(direct または eice)を自動的に決定します。現在、CLI は以下の順序で IP アドレスを使用して接続を試行し、対応する接続タイプを使用します。
- パブリック IPv4: direct
- プライベート IPv4: eice
- IPv6: direct
将来的には、自動接続タイプの動作を変更する可能性があります。希望する接続タイプが確実に使用されるようにするには、
–connection-type
をdirect
またはeice
に明示的に設定することをお勧めします。
なるほど、パブリックなEIPが割り当てられている場合には、EC2 Instance Connectとして直接接続しにいくということね。で、EC2 Instance Connect Endpointを想定して設定しているので、パブリックからのSSHは許可していないので、繋がらなかったというわけね。
EC2 Instance Connect Endpointを使う場合には--connection-type eice
を明示的に指定するのが良いね。
EC2インスタンスのOSがAmazon Linux 2023以外だとユーザ名を定義する必要がある。例えばUbuntuの場合。
aws ec2-instance-connect ssh \
--connection-type eice \
--instance-id i-XXXXXXXXXXXX \
--os-user ubuntu
scpとかをやりたい場合にはトンネルだけ張って、そこにscpするという方法がある。
のだが、そうなると結局鍵がいるっぽい。むーん。