【小ネタ】VScodeでAmazon EC2 Instance Connectを使って繋げたい!

記事タイトルとURLをコピーする

こんにちわ!サーバーワークス日本最南端社員の久保玉井(くぼたまい)です。

最近、怖い夢をみて飛び起きました。通貨単位のリラが出てくる夢だったんですが、どこの国の通貨単位なのか判らず夢に出てきましたね(汗)

さて今回は、Amazon EC2 Instance Connectを用いて、Visual Studio Codeにリモート接続する方法を記録に残します。

この記事がどなたかのお役に立てれば嬉しいです。

なぜ、Amazon EC2 Instance Connectで繋げるのか?

もしかしてこの記事を見てすでにピンと来ている人がいるかもしれません。「なぜ Amazon EC2 Instance Connectを使って繋げたいのか?」

実は先日、AWSではかなり大きなトピックである更新情報が発表されました。

aws.amazon.com

2024 年 2 月 1 日より、特定のサービスに割り当てられているかどうかに関わらず、すべてのパブリック IPv4 アドレスの利用に対して 1 IP アドレスあたり 0.005 USD/時間 が課金されます(

そう!来年の2/1よりパブリックIPv4アドレスの利用に対して課金がスタートするんですね。

「今までは無料で利用できていたパブリックIPv4アドレスが有料になる。」 その更新情報を見て私がすぐに思い浮かんだのが・・・

「あ・・勉強用に平日立ち上げているEC2インスタンス、EIP割り当てていたな。利用料増えるの痛いなぁ・・」の一言です。

業務利用であれば必要経費として認識できますが、勉強用であればコストを抑えたい。

それを踏まえて、パブリックIPv4アドレスを利用しないで接続する方法 が無いか調べることにしました。

トップエンジニア山崎さんによる詳細な記事

弊社ブログで早速検索してみたところ、2023年トップエンジニア且つアンバサダーである山崎さんが詳細な記事を書いていました。

blog.serverworks.co.jp

6月13日のAWSアップデートでPublic IPを利用することなく、EC2 Instance Connect を用いてSSH/RDP接続ができるようになったというアップデートがありました。

その記事内では、各種比較表もありました。

SSM Session Managerで接続する場合と、EC2 Instance Connect場合の違いなども書かれていたのですが、一番心動かされたのが以下の一点。

EC2インスタンスがプライベート環境に配置されている且つOSがAmazon Linux 2 2.0.20190618以降またはUbuntu 20.04以降であれば、「EC2 Instance Connect経由(without Public IP)」のアクセス方法がコスト面を考慮すると良さそうです。

そう!コスト面で大きなメリットがあるんです。

AWS公式の最新情報の記事でも以下のように記載があります。

aws.amazon.com

EIC Endpoint はすべての AWS 商用リージョンおよび AWS GovCloud (米国) リージョンで利用できます。EIC Endpoint の使用に際して、追加コストは発生しません。

という事でEC2 Instance Connectを用いて、パブリックIPv4アドレスを用いずにSSH接続する方針にしました。

具体的な接続方法

AWSの公式ドキュメントをまずは確認します。

docs.aws.amazon.com

接続先のEC2インスタンスのAMI、AWS CLIのバージョンを確認し条件を満たしていることを確認しました。

公式ドキュメントでも構成図が掲載されておりますが、注目はEC2 Instance Connect Endpointですね。

それを準備すれば良いことが判ります。

EC2 Instance Connect Endpoint にて接続先を制限するセキュリティグループを設定し、その後実際に接続するEC2にも「EC2 Instance Connect Endpointからのみ接続を受け付けるセキュリティグループ」を設定しました。

試しにマネージメントコンソール上で、接続検証をしてみます。

youtu.be

無事に、EC2 Instance Connect で目標となる接続先の EC2 へログインすることができました。

AWS CLI での接続テスト

マネージメントコンソールで接続の確認ができたら、次はドキュメントの通り以下のコマンドでローカルPCから接続を検証します。

ssh -i my-key-pair.pem ec2-user@i-0123456789example \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-0123456789example'
  • 利用するキーペアの指定
  • 接続するユーザー名
  • 接続するインスタンスID

上記が情報として必要な事がわかりました。ポイントして重要なのはProxyCommandの部分ですね。

ProxyCommand='aws ec2-instance-connect open-tunnel --instance-id i-0123456789example'

.ssd/configファイルに追記して接続確認

上記を踏まえて、.ssh/configファイルに設定を記述しました。(以下Windows端末での記述内容です)

接続先名(例:WebAppli-dev2)
    HostName "i-0123456789abcdefg"
    User ec2-user
    Port 22
    IdentityFile "キーペアの保管場所"
    ProxyCommand C:\Program Files\Amazon\AWSCLIV2\aws.exe ec2-instance-connect open-tunnel --instance-id %h

あとはPowerShellやコマンドプロンプトで接続を確認します。

PS C:\Users\user> ssh WebAppli-dev2
Last login: Tue Aug 15 01:06:01 2023 from ip-172-31-3-184.ap-northeast-1.compute.internal

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
[ec2-user@ip-172-31-9-183 ~]$

VScodeから繋げてみる。

.ssh/configで設定し接続できたらもう目標達成間近です。

Visual Studio Codeのリモート接続で、上記接続先を指定すれば繋がります!

EIPを割り当てて使っていたEC2インスタンスに、パブリックIPv4割当無しにVScodeからつながる事ができました。

注意点もあります

今回は、インターネットへの接続経路がないネットワーク環境にEC2インスタンスを配置しました。

EC2 Instance ConnectでローカルのWindowsPCからは接続できましたが、対象のEC2インスタンス自体がインターネット外部への接続ができません。そうなるとyumやdnfなどを用いてソフトウェアのインストールなども不可能になります。

対処方法としては、NAT Gatewayやエンドポイントなどインターネット外部への接続経路を準備する必要があります。

以上を踏まえると一番簡単なのは、パブリックサブネット1つだけのVPCを準備し、そのサブネット内にパブリックIPv4を未割り当てのEC2インスタンスを設置。

インターネットへの接続が必要になったらEIPを確保して割り当てる方法がお手軽かもしれません。アップデートを終えたらEIPを開放すればコストも最小限に抑えられますしね。

まとめ

ではまとめです!

  • EC2 Instance Connectを使えばプライベートサブネットで運用しているEC2インスタンスに、低コストでローカルPCから接続ができる。
  • sshのProxyCommandを用いてawsコマンドを呼び出せば良い
  • VScodeでもそのssh接続リモート接続が使える
  • パブリックIPv4アドレスを全く付与しなくて済む

以上ですね。この記事がどなたかのお役に立てれば嬉しいです。

最後までお読み頂きありがとうございました\(^o^)/

久保玉井純(執筆記事の一覧)

アプリケーションサービス部

サーバーワークス日本最南端社員。
最近、AWS Authorized Instructor Award 2022で表彰いただきました。引き続きわかりやすいトレーニング提供できるように頑張ります!