事前検討
普通に考えたらAWS VPNが良いと思います。ただ微妙に高いので、、、、、
なぜか無駄にそれ以外の方法を試してみた記録です。
ただし、一部不具合があり不完全な方法になっています。
何か設定を間違ているが、何が間違っているか不明です。。。。。
接続経路の概要
- SSM SessionManagerの使えるEC2を用意する
- アクセスキーや秘密鍵を準備
- ローカル端末側にAWS CLIを導入する
- SSM SessionManager経由でプライベートなEC2にアクセスする
うまくいかない
通常StartPortForwardingSessionでVSCodeが直接EC2にアクセスできるはずが、
2段階でのアクセスになっています。
- StartPortForwardingSession起動
- SSHアクセス
SSM SessionManagerでアクセスする用のEC2の準備
EC2作るのはGUIでサクサクと、その後にロール付与とセキュリティグループの設定
IAMロールの付与
AWS Systems Manager Session Managerを使用するためには、対象のEC2インスタンスには、SSM APIを呼び出すための適切なIAMロールが必要です。このロールは、通常「AmazonSSMManagedInstanceCore」という管理ポリシーを持つIAMロールをインスタンスに関連付けることで作成できます。
GUIでAWS Management Consoleを使用してEC2インスタンスにIAMロールを関連付けるには、以下の手順を実行します:
- AWS Management Consoleにサインインします。
- 「サービス」メニューから「EC2」を選択します。
- 左側のナビゲーションパネルで「インスタンス」を選択します。
- IAMロールを関連付けたいインスタンスを選択します。
- 「アクション」メニューから「セキュリティ」を選択し、「IAMロールの変更」をクリックします。
- 「IAMロール」ドロップダウンメニューから、関連付けたいロールを選択します。ロールがリストに表示されない場合は、そのロールがまだ作成されていないか、またはEC2インスタンスを使用するための信頼ポリシーが適切に設定されていない可能性があります。
- 「適用」をクリックします。
これにより、選択したIAMロールがEC2インスタンスに関連付けられます。これで、そのインスタンスはロールに関連付けられたポリシーに基づいてAWSリソースにアクセスできるようになります。
セキュリティグループの設定
このメッセージは、EC2インスタンスのセキュリティグループがポート22(SSH)の接続を許可していないことを示しています。これを解決するには、セキュリティグループの設定を変更して、ポート22への接続を許可する必要があります。
以下に、AWS Management Consoleを使用してセキュリティグループの設定を変更する手順を示します:
- AWS Management Consoleにサインインします。
- 「サービス」メニューから「EC2」を選択します。
- 左側のナビゲーションパネルで「セキュリティグループ」を選択します。
- 変更したいセキュリティグループを選択します。
- 「インバウンドルール」タブを選択し、「ルールを編集」をクリックします。
- 「ルールを追加」をクリックし、以下の設定を行います:
- 「タイプ」:SSH
- 「プロトコル」:TCP
- 「ポート範囲」:22
- 「ソース」:カスタム
- 「ソースIP」:xxx.xxx.xx.0/29 ←どのIPを許可すべきかはError画面に出ています。
- 「ルールを保存」をクリックします。
これにより、セキュリティグループがポート22への接続を許可するようになります。これで、EC2 Instance Connectを使用してインスタンスに接続できるようになるはずです。
「ソースIP」は、インバウンド接続を許可するIPアドレスまたはIPアドレス範囲を指定します。ここで指定されたIPアドレスからの接続のみが許可されます。
アクセスキーや秘密鍵を準備
アクセスキーの取得
AWS Access KeyはAWS Management ConsoleのIAM (Identity and Access Management) サービスを通じて作成および管理できます。以下に、Access Keyを確認する手順を示します。
- AWS Management Consoleにサインインします。
- サービスメニューから「IAM」を選択します。
- 左側のナビゲーションパネルで「ユーザー」を選択します。
- ユーザーリストからAccess Keyを確認したいユーザーを選択します。
- ユーザー詳細ページで「セキュリティ認証情報」タブを選択します。
ここで、「アクセスキー」セクションを見ると、ユーザーのAccess Key IDが表示されます。ただし、セキュリティ上の理由から、Secret Access Keyは作成時に一度だけ表示され、その後はAWS Management Consoleからは確認できません。
新しいAccess Keyを作成する場合は、「アクセスキーの作成」ボタンをクリックします。新しいAccess Key IDとSecret Access Keyが生成され、ダウンロード可能な.csvファイルとして提供されます。これらのキーは、AWS SDKやCLIを使用してAWSサービスにアクセスする際に必要となります。
なお、Access Keyは重要な認証情報なので、安全な場所に保管し、不要になったらすぐに削除することが推奨されます。
SSH用の秘密鍵の取得
AWS Management Consoleを使用してEC2インスタンスを作成する際に、SSH接続のためのキーペア(公開鍵と秘密鍵)を作成することができます。このキーペアの秘密鍵は、インスタンスにSSH接続するために必要です。
ただし、AWS Management Consoleから既存の秘密鍵を取得することはできません。キーペアを作成したときにダウンロードした.pemファイルを安全な場所に保存することが重要です。この.pemファイルがないと、そのキーペアを使用してEC2インスタンスに接続することはできません。
新しいキーペアを作成するには以下の手順を行います:
- AWS Management Consoleにログインします。
- EC2ダッシュボードを開きます。
- 左側のナビゲーションパネルで「キーペア」を選択します。
- 「キーペアの作成」ボタンをクリックします。
- キーペアの名前を入力し、「キーペアの作成」をクリックします。
これにより、新しいキーペアが作成され、秘密鍵が含まれる.pemファイルが自動的にダウンロードされます。この.pemファイルを安全な場所に保存してください。
なお、既存のEC2インスタンスに新しいキーペアを適用するには、そのインスタンスを停止し、AMI(Amazon Machine Image)を作成した後、そのAMIから新しいインスタンスを起動するときに新しいキーペアを指定する必要があります。
端末側の設定について
Windows端末SSH から AWS EC2アクセス
windowsマシンから AWS CLIとSession Manager Pluginを使用して、プライベートなEC2へ接続するにはどうすれば良いですか
WindowsマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続するための手順は以下の通りです。
-
AWS CLIのインストール: AWS CLIはAWSのサービスをコマンドラインから操作するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。
-
Session Manager Pluginのインストール: Session Manager PluginはAWS Systems Managerの一部で、SSHやRDPなしでEC2インスタンスに接続するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。
-
AWS CLIの設定: AWS CLIを使用するためには、AWSの認証情報(Access Key IDとSecret Access Key)を設定する必要があります。コマンドプロンプトまたはPowerShellを開き、以下のコマンドで設定します。
aws configure
- Session Managerを使用した接続: 以下のコマンドでSession Managerを使用してEC2インスタンスに接続します。
aws ssm start-session --target instance-id
ここで、instance-id
は接続したいEC2インスタンスのIDです。
以上の手順で、WindowsマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。
Windows端末RDP から AWS EC2アクセス
Windowsマシンから AWS CLIとSession Manager Pluginを使用して、プライベートなEC2へRDP接続するにはどうすれば良いですか
AWS CLIとSession Manager Pluginを使用して、WindowsマシンからプライベートなEC2インスタンスへRDP接続するための手順は以下の通りです。
-
AWS CLIのインストール: AWS CLIはAWSのサービスをコマンドラインから操作するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。
-
Session Manager Pluginのインストール: Session Manager PluginはAWS Systems Managerの一部で、SSHやRDPなしでEC2インスタンスに接続するためのツールです。以下のURLからインストーラをダウンロードし、インストールします。
-
AWS CLIの設定: AWS CLIを使用するためには、AWSの認証情報(Access Key IDとSecret Access Key)を設定する必要があります。コマンドプロンプトまたはPowerShellを開き、以下のコマンドで設定します。
aws configure
- Session Managerを使用したRDP接続: 以下のコマンドでSession Managerを使用してEC2インスタンスにRDP接続します。
aws ssm start-session --target instance-id --document-name AWS-StartPortForwardingSession --parameters '{"localPortNumber": local-port, "portNumber": 3389}'
ここで、instance-id
は接続したいEC2インスタンスのID、local-port
はローカルマシンで開放するポート番号です。
-
RDPクライアントの起動: 上記のコマンドを実行した後、RDPクライアント(例えば、Windowsのリモートデスクトップ接続)を起動し、
localhost:local-port
に接続します。
以上の手順で、WindowsマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスにRDP接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。また、EC2インスタンスがWindows OSであり、RDP接続が許可されていることも必要です。
Mac端末 to AWS EC2アクセス
Macマシンから AWS CLIとSession Manager Pluginを使用して、プライベートなEC2へ接続するにはどうすれば良いですか
MacマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続するための手順は以下の通りです。
- AWS CLIのインストール: AWS CLIはAWSのサービスをコマンドラインから操作するためのツールです。以下のコマンドでインストールできます。
curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
sudo installer -pkg AWSCLIV2.pkg -target /
- Session Manager Pluginのインストール: Session Manager PluginはAWS Systems Managerの一部で、SSHやRDPなしでEC2インスタンスに接続するためのツールです。以下のコマンドでインストールできます。
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
- AWS CLIの設定: AWS CLIを使用するためには、AWSの認証情報(Access Key IDとSecret Access Key)を設定する必要があります。以下のコマンドで設定できます。
aws configure
- Session Managerを使用した接続: 以下のコマンドでSession Managerを使用してEC2インスタンスに接続します。
aws ssm start-session --target instance-id
ここで、instance-idは接続したいEC2インスタンスのIDです。
以上の手順で、MacマシンからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。
VScode から AWS EC2アクセス
AWS CLIとSession Manager Pluginを使用して、VS CodeからプライベートなEC2インスタンスへ接続するための手順は以下の通りです。
-
AWS CLIとSession Manager Pluginのインストール: これらのツールはAWSのサービスをコマンドラインから操作するためのものです。まだインストールしていない場合は、それぞれの公式サイトからダウンロードしてインストールしてください。
-
AWS CLIの設定: AWS CLIを使用するためには、AWSの認証情報(Access Key IDとSecret Access Key)を設定する必要があります。ターミナルを開き、以下のコマンドで設定します。
aws configure
-
VS Codeの設定: VS Codeでリモート開発を行うためには、"Remote - SSH"という拡張機能をインストールする必要があります。VS Codeの拡張機能タブから検索してインストールしてください。
-
SSH設定ファイルの編集: VS Codeの"Remote - SSH"拡張機能は、SSH設定ファイルを使用してリモートサーバーへの接続を管理します。以下のコマンドでSSH設定ファイルを開き、編集します。
code ~/.ssh/config
このファイルに、以下のような内容を追加します。
Host my-ec2-instance
HostName localhost
User ec2-user
Port local-port
IdentityFile ~/.ssh/id_rsa
ProxyCommand sh -c "aws ssm start-session --target instance-id --document-name AWS-StartPortForwardingSession --parameters '{\"localPortNumber\": \"local-port\", \"portNumber\": \"22\"}'"
Host my-ec2-instance
HostName localhost
User ec2-user
Port 9022
ConnectTimeout 300
ServerAliveInterval 60
IdentityFile ~/.ssh/awstestkey.pem
ProxyCommand sh -c "aws ssm start-session --target i-xxxx --document-name AWS-StartPortForwardingSession --parameters '{\"localPortNumber\": [\"9022\"], \"portNumber\": [\"22\"]}'"
ここで、my-ec2-instance
は任意のホスト名、ec2-user
はEC2インスタンスのユーザー名、local-port
はローカルマシンで開放するポート番号、instance-id
は接続したいEC2インスタンスのIDです。
-
VS Codeからの接続: VS Codeの左下の緑色のアイコンをクリックし、"Remote-SSH: Connect to Host..."を選択します。先ほど設定ファイルに追加したホスト名(ここでは
my-ec2-instance
)を選択すれば、VS CodeからEC2インスタンスに接続できます。
以上の手順で、VS CodeからAWS CLIとSession Manager Pluginを使用してプライベートなEC2インスタンスに接続することができます。ただし、この手順はEC2インスタンスがAWS Systems Managerと互換性があり、適切に設定されていることを前提としています。また、EC2インスタンスがSSH接続を許可していることも必要です。
なぜかうまくいかない
本当は上記設定で一発でつながるはずですが、うまくいかず以下2段階で実施中です。何が悪いんだ。。。。。
- ポートフォアード処理を起動
aws ssm start-session --target i-xxxx --document-name AWS-StartPortForwardingSession --parameters '{"localPortNumber": ["9022"], "portNumber": ["22"]}'
- ssh接続を実装
Host my-ec2-instance
HostName localhost
User ec2-user
Port 9022
ConnectTimeout 300
ServerAliveInterval 60
IdentityFile ~/.ssh/awstestkey.pem