EC2 Instance Connect エンドポイントを使って手元の Windows 11 端末からプライベートサブネットの EC2 に WinSCP でファイルコピーしてみた

2023.11.07

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

EC2 Instance Connect エンドポイントを使って手元の Windows 11 端末からプライベートサブネットの EC2 に WinSCP でファイルコピーしてみました。
検証手順を連携します。

構成図

以下のような構成で検証します。

準備

以下のブログとほぼ同じ準備が必要です。

このブログと違う点は以下の 2 点です。

  • キーペアのタイプで .ppk が必要であること
  • WinSCP のインストールが必要であること

AWS 環境の構築

以下のブログを参考に、AWS 環境の構築を実施してください。

接続元の端末で AWS CLI とプロファイル(IAM ユーザーのアクセスキー)の設定

接続元とする手元の端末で AWS CLI のインストールとプロファイル(IAM ユーザーのアクセスキー)の設定をします。

今回は以下ブログを参考に、私が使用している Windows 11 で設定します。

コマンドプロンプトで以下のように AWS CLI のバージョンを確認できます。

C:\Users\kitani.emi>aws --version
aws-cli/2.13.30 Python/3.11.6 Windows/10 exe/AMD64 prompt/off

C:\Users\kitani.emi>

AWS CLI 用の IAM ユーザー「eic-endpoint-test」を作成し、アクセスキーを手元の端末に設定します。
EC2 Instance Connect Endpoint を使用するための IAM 権限は以下のドキュメントを参考にしました。

今回私が設定した権限は以下になります。

eic-endpoint-test-policy

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2InstanceConnect",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Resource": [
                "arn:aws:ec2:ap-northeast-1:123456789012:instance-connect-endpoint/eice-03a123cad4174aaf4"
            ],
            "Condition": {
                "NumericEquals": {
                    "ec2-instance-connect:remotePort": "22"
                },
                "IpAddress": {
                    "ec2-instance-connect:privateIpAddress": "10.0.10.11/32"
                }
            }
        },
        {
            "Sid": "Describe",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2:DescribeInstanceConnectEndpoints"
            ],
            "Resource": "*"
        },
        {
            "Sid": "SendSSHPublicKey",
            "Effect": "Allow",
            "Action": "ec2-instance-connect:SendSSHPublicKey",
            "Resource": "arn:aws:ec2:ap-northeast-1:123456789012:instance/*"
        }
    ]
}

この権限を付与した IAM ユーザーのアクセスキーを発行し、.aws 配下の config ファイルと credentials ファイルにプロファイル情報を追記します。

  • config ファイルの例
[default]
region = ap-northeast-1
output = json

[profile eic-endpoint-test]
region = ap-northeast-1

[profile test-role]
region = ap-northeast-1
  • credentials の例
[default]
aws_access_key_id = AKIAxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[eic-endpoint-test]
aws_access_key_id = AKIAxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[test-role]
aws_access_key_id = AKIAxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

WinSCP のインストール

WInSCP がインストールされていない場合は以下のブログを参考にインストールしてください。

キーペアの作成と設定

EC2 のキーペアとして .ppk 形式のキーペアを設定していない場合は、以下の手順を参考に .ppk 形式のキーペアを追加してください。

セッションマネージャーで接続する準備をおこなっていない方は、以下のブログを参考にコマンドプロンプトで EC2 インスタンスに SSH 接続して公開鍵の文字列を登録してください。

WinSCP 用のユーザーを作成いただいても大丈夫ですし、ec2-user を使う場合は以下の画像のように 1 つの authorized_keys ファイルの中に複数公開鍵の文字列を登録することもできます。

WinSCP でファイルコピーする

準備ができたら、WinSCP でファイルコピーを試していきます。
まずは ec2-instance-connect open-tunnel コマンドでローカルマシン(今回は手元の Windows 11 端末)と EC2 インスタンス間に SSH トンネルを開いておきます。
Linux インスタンス用ユーザーガイド|SSH を使用した Linux インスタンスへの接続 も参考にして下さい。

コマンドプロンプトで以下のコマンドを実行します。

aws ec2-instance-connect open-tunnel ^
    --instance-id i-xxxxxxxxxxxxxxxxx ^
    --remote-port 22 ^
    --local-port 10022 ^
    --profile eic-endpoint-test

i-xxxxxxxxxxxxxxxxx には、作成した(接続する)EC2 インスタンスのインスタンス ID を入れてください。

  • 実行結果
    C:\Users\kitani.emi>aws ec2-instance-connect open-tunnel ^
    More?     --instance-id i-0a1d205bd3242dca6 ^
    More?     --remote-port 22 ^
    More?     --local-port 10022 ^
    More?     --profile eic-endpoint-test
    Listening for connections on port 10022.

最後が Listening for connections on port 10022. となり、SSH トンネルが開いた状態になります。
このコマンドプロンプトのウィンドウは開いたままにしてください。

では、この状態で WinSCP を開きます。
以下のように入力します。

  • 転送プロトコル:SFTP
  • ホスト名:localhost
  • ポート番号:10022(SSH トンネルを張ったときに設定したローカルポートのポート番号)
  • ユーザー名:ec2-user(キーペアを登録したユーザー)

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

[SSH] - [認証] の「秘密鍵」で、キーペア(.ppk 形式)を保存している手元の Windows 11 端末のパスを入力します。
入力できたら「OK」をクリックします。

「ログイン」をクリックします。

初めて接続する際は、以下のように警告が出ます。このまま「はい」で進めます。

EC2 インスタンスに接続できました。

手元の Windows 11 端末のエクスプローラーから、WinSCP にテストファイルをドラッグ&ドロップします。

テストファイルを EC2 上にアップロードできました。

WinSCP でファイルを作成してみます。
空白部分で右クリックし、[新規] - [ファイル] をクリックします。
任意のファイル名を入力し、「OK」をクリックします。

ファイルの中身を編集できます。
左上の上書き保存のアイコンで上書き保存し、右上の×をクリックして作成したファイルを閉じます。

WinSCP 上で作成したファイルが表示されているのが分かります。
WinSCP 上で見えている EC2(RHEL9)上のファイルを、ドラッグ&ドロップで手元の Windows 11 端末にコピーします。

手元の Windows 11 端末にファイルをコピーできました。

参考