Closed3

EC2 Instance Connect EndpointでAWS CLIからパブリックサブネットのホストにアクセスする

kun432kun432

Session Managerはちとお高いので、EC2 Instance Connect Endpointを使ってみた。

https://dev.classmethod.jp/articles/ec2-instance-connect-endpoint-private-access/

https://zenn.dev/bamtech1904/articles/20230702_eic-endoint

AWS公式の記事もそうなのだけど、

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/connect-with-ec2-instance-connect-endpoint.html


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には接続できる。

でここを見ると、

https://dev.classmethod.jp/articles/connect-to-amazon-ec2-instance-recheck/#ec2-instance-connect-%25E3%2582%25A8%25E3%2583%25B3%25E3%2583%2589%25E3%2583%259D%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2588

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のリファレンス

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2-instance-connect/ssh.html

--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-typedirect または eice に明示的に設定することをお勧めします。

なるほど、パブリックなEIPが割り当てられている場合には、EC2 Instance Connectとして直接接続しにいくということね。で、EC2 Instance Connect Endpointを想定して設定しているので、パブリックからのSSHは許可していないので、繋がらなかったというわけね。

EC2 Instance Connect Endpointを使う場合には--connection-type eiceを明示的に指定するのが良いね。

kun432kun432

EC2インスタンスのOSがAmazon Linux 2023以外だとユーザ名を定義する必要がある。例えばUbuntuの場合。

aws ec2-instance-connect ssh \
    --connection-type eice \
    --instance-id i-XXXXXXXXXXXX \
    --os-user ubuntu
kun432kun432

scpとかをやりたい場合にはトンネルだけ張って、そこにscpするという方法がある。

のだが、そうなると結局鍵がいるっぽい。むーん。

このスクラップは2025/01/31にクローズされました