NLB 経由で手元の Windows 11 からプライベートサブネットの EC2(RHEL9)に TeraTerm での SSH 接続とファイル転送を試してみた

NLB 経由で、手元の Windows 11 からプライベートサブネットの EC2(RHEL9)に TeraTerm での SSH 接続とファイル転送を試してみました。NLB はスティッキーセッション未サポート、350 秒以上無活動の接続を自動的に切断するという仕様があるため、システム要件を加味し慎重に選定してください。
2023.11.05

コーヒーが好きな emi です。

今回は NLB 経由で、手元の Windows 11 からプライベートサブネットの EC2(RHEL9)に TeraTerm での SSH 接続とファイル転送を試してみました。

はじめに

プライベートサブネットの EC2(RHEL9)にオンプレミスサーバーや手元の開発端末からファイルを共有したいケースがあります。
よく考えられるのは「踏み台サーバー経由でファイル共有する」「Transfer family で S3 バケットにデータを配置し、S3 バケット経由でファイル共有する」などのパターンです。

しかし、今回は「EC2 インスタンスを AWS Auto Scaling でスケーリングせず、1 台のみ」、「データを EC2 内部に保持している」、「ファイル共有したい周辺サーバーや開発端末が多く、SSM ポートフォワードや EC2 Instance Connect エンドポイントだと周辺サーバーや開発端末の設定が大変」等の前提があったため、NLB 経由で TeraTerm での SSH 接続とファイル転送を試してみました。

NLB を選定する際の注意点などは以下のブログにまとめていますので、参照ください。

Systems Manager セッションマネージャーを使いたい場合は以下のブログをご参照ください。

検証:TeraTerm での SSH 接続とファイル送受信

今回の検証構成図

以下のような構成で検証します。NLB のターゲットグループには EC2(RHEL9)が 1 台だけ含まれるようにします。
手元の Windows 11 端末には TeraTerm をインストールしておき、VPC と EC2 はあらかじめ作成しておいてください。

以降の手順は基本的に以下のブログと同様に設定します。
キーペアの部分のみ注意が必要ですので、後述します。

NLB のターゲットグループの作成

以下を参照のうえ実施ください。

NLB の作成

以下を参照のうえ実施ください。

EC2 インスタンスのセキュリティグループの編集

以下を参照のうえ実施ください。

ターゲットグループのヘルスステータス確認

以下を参照のうえ実施ください。

キーペアの作成

RHEL 9.0 では SHA-1 が非推奨になったことにより、キーペアのタイプが「RSA」だと鍵認証に失敗します。
本検証ではキーペアのタイプは「ED25519」を選択してください。

EC2 のコンソール画面で [キーペア] - [キーペアを作成] をクリックします。

  • 名前:任意の名前(今回は「sftp-test-tokyo4」としています)
  • キーペアのタイプ:ED25519
  • プライベートキーファイル形式:.pem

設定したら、「キーペアを作成」をクリックします。

秘密鍵(今回は「sftp-test-tokyo4.pem」)がダウンロードされます。このタイミングでしかキーペアはダウンロードできないので、大事に保管してください。

キーペアの公開鍵の文字列を取得

キーペアの公開鍵を取得します。
PuTTy などの 3rd Party 製品を使う方法もありますが、AWS CLI で公開鍵を表示できるので、CloudShell で公開鍵の文字列を取得しましょう。
以下のドキュメントで、AWS CLI を利用して公開鍵の文字列を取得するコマンドを確認します。

パブリックキーの説明

公開鍵の文字列を取得するコマンド構文

aws ec2 describe-key-pairs --key-names key-pair-name --include-public-key

key-pair-name にはキーペアの名前をいれます。今回キーペアの名前は「sftp-test-tokyo4」としましたので、実行コマンドは以下になります。

aws ec2 describe-key-pairs --key-names sftp-test-tokyo4 --include-public-key

CloudShell を開き、コマンドを実行します。

  • 実行結果
    [cloudshell-user@ip-10-6-34-245 ~]$ aws ec2 describe-key-pairs --key-names sftp-test-tokyo4 --include-public-key
    {
        "KeyPairs": [
            {
                "KeyPairId": "key-0789c1188293c8c61",
                "KeyFingerprint": "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx",
                "KeyName": "sftp-test-tokyo4",
                "KeyType": "ed25519",
                "Tags": [],
                "PublicKey": "ssh-ed25519 AAAAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlh39 sftp-test-tokyo4",
                "CreateTime": "2023-11-02T18:33:50.546000+00:00"
            }
        ]
    }
    [cloudshell-user@ip-10-6-34-245 ~]$

"PublicKey" の後ろが公開鍵の文字列です。ssh-ed25519 AAAAxxx~xxxlh39 sftp-test-tokyo4 の部分をコピーしておいてください。

セッションマネージャーで EC2(RHEL9)に接続し、公開鍵の文字列を登録

セッションマネージャーで EC2(RHEL9)に接続し、公開鍵の文字列を登録します。
セッションマネージャーで EC2(RHEL9)に接続してください。

ec2-user に切り替えます。

実行コマンド

sudo su - ec2-user
  • 実行結果例
    sh-5.1$ sudo su - ec2-user
    Last login: Sun Nov  5 07:45:27 UTC 2023 from 104.28.238.35 on pts/0
    [ec2-user@ip-10-1-10-94 ~]$

ls -la コマンドで、ec2-user のホームディレクトリに .ssh があるか確認します。

  • 実行結果例
    [ec2-user@ip-10-1-10-94 ~]$ ls -la
    total 28
    drwx------. 3 ec2-user ec2-user 4096 Nov  2 19:04 .
    drwxr-xr-x. 4 root     root       38 Oct 31 02:21 ..
    -rw-r--r--. 1 ec2-user ec2-user    0 Nov  2 15:57 20231103_test.txt
    -rw-------. 1 ec2-user ec2-user  875 Nov  2 18:45 .bash_history
    -rw-r--r--. 1 ec2-user ec2-user   18 Nov 24  2022 .bash_logout
    -rw-r--r--. 1 ec2-user ec2-user  141 Nov 24  2022 .bash_profile
    -rw-r--r--. 1 ec2-user ec2-user  492 Nov 24  2022 .bashrc
    -rw-------. 1 ec2-user ec2-user   20 Nov  2 18:49 .lesshst
    drwx------. 2 ec2-user ec2-user   76 Nov  2 18:57 .ssh
    -rw-r--r--. 1 ec2-user ec2-user   30 Oct 31 02:42 test_EC2_file.txt
    -rw-r--r--. 1 ec2-user ec2-user    0 Aug 12 13:32 test.txt
    [ec2-user@ip-10-1-10-94 ~]$

.ssh がありました。
続いて ls -la .ssh/ コマンドで、authorized_keys ファイルがあるか確認します。

  • 実行結果例
    [ec2-user@ip-10-1-10-94 ~]$ ls -la .ssh/
    total 24
    drwx------. 2 ec2-user ec2-user    76 Nov  2 18:57 .
    drwx------. 3 ec2-user ec2-user  4096 Nov  5 07:15 ..
    -rw-------. 1 ec2-user ec2-user   496 Nov  2 18:54 authorized_keys
    -rw-------. 1 ec2-user ec2-user 12288 Nov  2 17:49 .authorized_keys.swp
    -rw-r--r--. 1 ec2-user ec2-user   127 Nov  2 18:57 known_hosts
    [ec2-user@ip-10-1-10-94 ~]$

authorized_keys ファイルがありました。
vi .ssh/authorized_keys で編集します。

  • 実行結果
    [ec2-user@ip-10-1-10-94 ~]$ vi .ssh/authorized_keys

vi コマンドを実行すると vi エディタが開きます。i キーを押下して編集モードに遷移します。
先ほどコピーしておいた公開鍵の文字列を貼り付けます。

既に登録済みの別の公開鍵の文字列が存在しますが、改行して、上記画像のように続けて貼り付けて OK です。

esc キーを押下して編集モードを抜けたら、:wqを入力し Enter キーを押下して保存します。
authorized_keys ファイルの中身が正しく編集できたか cat コマンドで確認します。

実行コマンド

cat .ssh/authorized_keys
  • 実行結果
    [ec2-user@ip-10-1-10-94 ~]$ cat .ssh/authorized_keys
    ssh-rsa AAAAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxSZV7 sftp-test-tokyo
    
    ssh-ed25519 AAAAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxlh39 sftp-test-tokyo4
    [ec2-user@ip-10-1-10-94 ~]$

authorized_keys ファイルに公開鍵の文字列が保存できたことが確認できました。
これで EC2 インスタンスにキーペアの公開鍵の文字列を登録できました。

もし authorized_keys ファイルの編集権限がない場合は chmod 600 .ssh/authorized_keys などで書き込み権限を付与してください。

TeraTerm による SSH 接続

TeraTerm を開きます。

  • ホスト:コピーしておいた NLB の DNS 名、または NLB に付与した Elastic IP アドレス
  • TCP ポート:22
  • サービス:SSH

入力できたら「OK」をクリックします。

  • ユーザー名:ec2-user(キーペアを登録したユーザー)
  • 「RSA/DSA/ECDSA/ED25519鍵を使う」にチェック
  • 秘密鍵:キーペアを保存している手元の Windows 11 端末のパスを入力

入力できたら「OK」をクリックします。

EC2 インスタンスに NLB 経由で SSH 接続できました。

TTHHS: Secure File Copy によるファイル送受信

[ファイル] - [SSH SCP] をクリックします。

「TTSSH: Secure File Copy」画面が開きます。
まずは手元の Windows 11 端末から EC2(RHEL9)のファイルを送ります。
上部の From に送りたいファイルのパスを入力し、「send」をクリックします。

EC2 上 ec2-user のホームディレクトリで ls -la コマンドでを実行しファイルを確認すると、send したファイルが存在することが分かります。

[ec2-user@ip-10-1-10-94 ~]$ ls -la
total 28
drwx------. 3 ec2-user ec2-user 4096 Nov  2 19:04 .
drwxr-xr-x. 4 root     root       38 Oct 31 02:21 ..
-rw-r--r--. 1 ec2-user ec2-user    0 Nov  2 15:57 20231103_02_test.txt
-rw-r--r--. 1 ec2-user ec2-user    0 Nov  2 15:57 20231103_test.txt
-rw-------. 1 ec2-user ec2-user  875 Nov  2 18:45 .bash_history
-rw-r--r--. 1 ec2-user ec2-user   18 Nov 24  2022 .bash_logout
-rw-r--r--. 1 ec2-user ec2-user  141 Nov 24  2022 .bash_profile
-rw-r--r--. 1 ec2-user ec2-user  492 Nov 24  2022 .bashrc
-rw-------. 1 ec2-user ec2-user   20 Nov  2 18:49 .lesshst
drwx------. 2 ec2-user ec2-user   76 Nov  2 18:57 .ssh
-rw-r--r--. 1 ec2-user ec2-user   30 Oct 31 02:42 test_EC2_file.txt
-rw-r--r--. 1 ec2-user ec2-user    0 Aug 12 13:32 test.txt
[ec2-user@ip-10-1-10-94 ~]$

次は EC2 上のファイルを手元の端末にコピーします。
EC2 上でテストファイルを作成します。

touch 20231103_02_test_EC2_file.txt

ファイルが作成できたか確認します。

ls -la | grep 20231103_02_test_EC2_file.txt
  • 実行結果例
    [ec2-user@ip-10-1-10-94 ~]$ touch 20231103_02_test_EC2_file.txt
    [ec2-user@ip-10-1-10-94 ~]$ ls -la | grep 20231103_02_test_EC2_file.txt
    -rw-r--r--. 1 ec2-user ec2-user    0 Nov  2 19:05 20231103_02_test_EC2_file.txt
    [ec2-user@ip-10-1-10-94 ~]$

では手元の端末にコピーします。
以下の画像のように、下部の From に送りたいファイルパスを入力します。
To にはファイルをコピーしたい手元の端末のパスを入力し、「Receive」をクリックします。

手元の端末にファイルがコピーされました。

終わりに

今回は「EC2 インスタンスを AWS Auto Scaling でスケーリングせず、1 台のみ」、「データを EC2 内部に保持している」等の前提があったため NLB 経由での SCP ファイル送受信を試してみました。 どなたかの参考になれば幸いです。

参考