[AWS/構築メモ]SSMポートフォワーディングの手順

雑記
スポンサーリンク

以下は、あくまで参考として私のメモというのが前提です。

Amazon EC2インスタンスへのSSHアクセスを許可することなく、内部ネットワークのサービスに安全に接続するために、AWS Systems Manager (SSM) のポートフォワーディングを使用することができます。

このガイドは、ローカルマシンからプライベートなAWSリソースへ安全に接続するための開発者向けの手順書です。

1. 前提条件

ポートフォワーディングを開始する前に、以下のものがローカルマシンにインストールされ、設定されていることを確認してください。

  1. AWS CLI: バージョン2を推奨します。
  1. Session Manager Plugin for the AWS CLI: AWS CLIがSession Managerのセッションを処理するために必要です。
  1. AWS認証情報: aws configure コマンドを使用して、適切な認証情報が設定されていることを確認してください。
  • SSMセッションを開始するために必要なIAM権限 (ssm:StartSession) を持つ必要があります。

2. IAMロールの設定

SSMポートフォワーディングセッションを機能させるには、ターゲットのEC2インスタンスに、SSMエージェントがAWSと通信するための権限を持つIAMロールをアタッチする必要があります。

以下の手順で、必要なIAMロールを設定し、インスタンスにアタッチしてください。

  1. IAMコンソールで、EC2にアタッチするための新しいIAMロールを作成します。
  2. 「信頼されたエンティティのタイプを選択」で AWSのサービス を選択し、「ユースケース」で EC2 を選択します。
  3. 「許可ポリシー」として、AWSが提供するマネージドポリシー AmazonSSMManagedInstanceCore を検索してアタッチします。
  4. ロールに SSM-Port-Forwarding-Role のような分かりやすい名前を付け、作成を完了します。
  5. EC2コンソールに戻り、ターゲットのインスタンスを選択します。
  6. 「アクション」メニューから「セキュリティ」->「IAMロールを変更」を選択します。
  7. ドロップダウンリストから先ほど作成したロールを選択し、保存します。

これにより、インスタンスがSSMサービスと通信できるようになります。

3. 追加設定

環境によっては、ポートフォワーディングを成功させるために追加の設定が必要です。

HTTPプロキシの設定

ローカルネットワークがHTTPプロキシ経由でインターネットに接続している場合、AWS CLIとSession Manager Pluginがプロキシを使用するように設定する必要があります。

環境変数に以下の設定を追加してください。

  • HTTPS_PROXY または https_proxy: HTTPSプロキシのアドレスとポートを指定します。
  • HTTP_PROXY または http_proxy: HTTPプロキシのアドレスとポートを指定します。
  • NO_PROXY または no_proxy: プロキシをバイパスするホスト名を指定します(例: AWSサービスエンドポイント)。
# 例: Linux / macOS
export HTTP_PROXY=”
http://proxy.example.com:8080
(http://proxy.example.com:8080)”
export HTTPS_PROXY=”
http://proxy.example.com:8080
(http://proxy.example.com:8080)”
export NO_PROXY=”169.254.169.254,.amazonaws.com”

# 例: Windows PowerShell
$env:HTTP_PROXY=”
http://proxy.example.com:8080
(http://proxy.example.com:8080)”
$env:HTTPS_PROXY=”
http://proxy.example.com:8080
(http://proxy.example.com:8080)”
$env:NO_PROXY=”169.254.169.254,.amazonaws.com”

MFA(多要素認証)の設定

IAMユーザーでMFAが有効になっている場合、一時的なセッショントークンを取得する必要があります。

  1. 以下のコマンドでセッショントークンを取得します。<シリアル番号またはARN> と <トークンコード> をご自身の情報に置き換えてください。
    aws sts get-session-token \
      –serial-number arn:aws:iam::123456789012:mfa/user-name \
      –token-code 123456

  2. コマンドの出力から、AccessKeyId、SecretAccessKey、および SessionToken をコピーします。
  3. これらの認証情報を環境変数として設定します。
    export AWS_ACCESS_KEY_ID=<AccessKeyId>
    export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
    export AWS_SESSION_TOKEN=<SessionToken>

  4. 注意: これらの環境変数は現在のシェルセッションのみで有効です。セッションの有効期限が切れた場合、再度この手順を実行して認証情報を更新する必要があります。

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エージェントが実行されていないか、接続されていません。
  • 解決策:
  1. インスタンスがSystems Managerのマネージドインスタンスリストに表示されているか確認します。
  2. インスタンスに適切なIAMロール(SSM権限を持つ)がアタッチされているか確認します。
  3. SSMエージェントがインスタンス上で実行されているか確認します。

7. セキュリティに関する注意

  • ポートフォワーディングは、ターゲットインスタンスのインバウンドセキュリティグループルールをバイパスします。これは便利ですが、セキュリティ上のリスクも伴うため、信頼できる開発者のみがアクセスできるAWS認証情報を使用するようにしてください。
  • セッションが不要になったら、ターミナルで Ctrl + C を押してセッションを終了してください。