以下は、あくまで参考として私のメモというのが前提です。
Amazon EC2インスタンスへのSSHアクセスを許可することなく、内部ネットワークのサービスに安全に接続するために、AWS Systems Manager (SSM) のポートフォワーディングを使用することができます。
このガイドは、ローカルマシンからプライベートなAWSリソースへ安全に接続するための開発者向けの手順書です。
1. 前提条件
ポートフォワーディングを開始する前に、以下のものがローカルマシンにインストールされ、設定されていることを確認してください。
- AWS CLI: バージョン2を推奨します。
- Session Manager Plugin for the AWS CLI: AWS CLIがSession Managerのセッションを処理するために必要です。
- AWS認証情報: aws configure コマンドを使用して、適切な認証情報が設定されていることを確認してください。
- SSMセッションを開始するために必要なIAM権限 (ssm:StartSession) を持つ必要があります。
2. IAMロールの設定
SSMポートフォワーディングセッションを機能させるには、ターゲットのEC2インスタンスに、SSMエージェントがAWSと通信するための権限を持つIAMロールをアタッチする必要があります。
以下の手順で、必要なIAMロールを設定し、インスタンスにアタッチしてください。
- IAMコンソールで、EC2にアタッチするための新しいIAMロールを作成します。
- 「信頼されたエンティティのタイプを選択」で AWSのサービス を選択し、「ユースケース」で EC2 を選択します。
- 「許可ポリシー」として、AWSが提供するマネージドポリシー AmazonSSMManagedInstanceCore を検索してアタッチします。
- ロールに SSM-Port-Forwarding-Role のような分かりやすい名前を付け、作成を完了します。
- EC2コンソールに戻り、ターゲットのインスタンスを選択します。
- 「アクション」メニューから「セキュリティ」->「IAMロールを変更」を選択します。
- ドロップダウンリストから先ほど作成したロールを選択し、保存します。
これにより、インスタンスがSSMサービスと通信できるようになります。

3. 追加設定
環境によっては、ポートフォワーディングを成功させるために追加の設定が必要です。
HTTPプロキシの設定
ローカルネットワークがHTTPプロキシ経由でインターネットに接続している場合、AWS CLIとSession Manager Pluginがプロキシを使用するように設定する必要があります。
環境変数に以下の設定を追加してください。
- HTTPS_PROXY または https_proxy: HTTPSプロキシのアドレスとポートを指定します。
- HTTP_PROXY または http_proxy: HTTPプロキシのアドレスとポートを指定します。
- NO_PROXY または no_proxy: プロキシをバイパスするホスト名を指定します(例: AWSサービスエンドポイント)。
export HTTP_PROXY=”
export HTTPS_PROXY=”
export NO_PROXY=”169.254.169.254,.amazonaws.com”
# 例: Windows PowerShell
$env:HTTP_PROXY=”
$env:HTTPS_PROXY=”
$env:NO_PROXY=”169.254.169.254,.amazonaws.com”
MFA(多要素認証)の設定
IAMユーザーでMFAが有効になっている場合、一時的なセッショントークンを取得する必要があります。
- 以下のコマンドでセッショントークンを取得します。<シリアル番号またはARN> と <トークンコード> をご自身の情報に置き換えてください。
aws sts get-session-token \
–serial-number arn:aws:iam::123456789012:mfa/user-name \
–token-code 123456 - コマンドの出力から、AccessKeyId、SecretAccessKey、および SessionToken をコピーします。
- これらの認証情報を環境変数として設定します。
export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken> - 注意: これらの環境変数は現在のシェルセッションのみで有効です。セッションの有効期限が切れた場合、再度この手順を実行して認証情報を更新する必要があります。
4. コマンドの構文
ポートフォワーディングのための基本的なコマンド構文は以下の通りです。
aws ssm start-session \
--target <インスタンスID> \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["<リモートポート>"],"localPortNumber":["<ローカルポート>"]}'
各パラメータの説明:
- –target <インスタンスID>: 接続したいEC2インスタンスのIDを指定します。
- –document-name AWS-StartPortForwardingSession: ポートフォワーディングセッションを開始するために使用するSSMドキュメントです。
- –parameters: セッションのパラメータを指定します。
- portNumber: ターゲットインスタンス上でフォワードしたいポート番号。
- localPortNumber: ローカルマシン上でリッスンするポート番号。
5. 具体的な使用例
ローカルマシンのポート 33060 を、EC2インスタンスID i-1234567890abcdef0 で実行されているMySQLデータベース(ポート 3306)にフォワードする例を見てみましょう。
aws ssm start-session \
--target i-1234567890abcdef0 \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["3306"],"localPortNumber":["33060"]}'
コマンドを実行すると、ターミナルに以下のようなメッセージが表示され、セッションが確立されます。
Starting session with SessionId: <セッションID>
Port 33060 opened for sessionId <セッションID>.
Waiting for connections...
これで、ローカルマシンから localhost:33060 に接続すると、EC2インスタンス上のMySQLデータベース(ポート 3306)に接続されます。
6. トラブルシューティング
問題: InvalidParameters エラー
- 原因: パラメータのJSON形式に誤りがある可能性があります。
- 解決策: シングルクォートとダブルクォートが正しく、カンマが適切に配置されているか確認してください。
問題: The SessionManagerClient plugin was not found エラー
- 原因: Session Manager Pluginがインストールされていないか、PATHが正しく設定されていません。
- 解決策: 前提条件セクションのリンクを参照して、プラグインを正しくインストールしてください。
問題: An error occurred (TargetNotConnected) エラー
- 原因: ターゲットインスタンス上でSSMエージェントが実行されていないか、接続されていません。
- 解決策:
- インスタンスがSystems Managerのマネージドインスタンスリストに表示されているか確認します。
- インスタンスに適切なIAMロール(SSM権限を持つ)がアタッチされているか確認します。
- SSMエージェントがインスタンス上で実行されているか確認します。
7. セキュリティに関する注意
- ポートフォワーディングは、ターゲットインスタンスのインバウンドセキュリティグループルールをバイパスします。これは便利ですが、セキュリティ上のリスクも伴うため、信頼できる開発者のみがアクセスできるAWS認証情報を使用するようにしてください。
- セッションが不要になったら、ターミナルで Ctrl + C を押してセッションを終了してください。