この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
こんにちは、協栄情報のきおかです。
本日は、セッションマネージャーのポートフォワーディング機能を使って、いろいろやってみます。
特に、ローカルホストのポートにSSH接続してEC2インスタンスにSSM接続したり、それを利用してSSMでファイル転送などしてみます。
課題
Systems Managerのマネジメントコンソール画面(GUI)では、ファイル転送の機能がありません。
ノードのディレクトリを確認したりすることはできます。
しかし、そこからローカルにあるファイルを転送できません。
また、そもそもCUIに慣れている方であれば、CUIから操作する方が効率的かもしれません。
AWS CLIからアクセスすることで、この問題を解決できます。
特に、sftpを使えるようになることで、セッションを確立してファイル転送ができるようになります。
ゴール
構成図
構成図上は一般的なセッションマネージャー接続図です。Session Manager PluginをインストールしてAWS CLIで接続しています。
ポートフォワーディングのイメージ図
先ほど示した構成ですが、接続はポートフォワーディングで行います。接続の流れは以下のようになります。
ローカルポート10022に接続すると、リモートポート(EC2インスタンスのポート)22に接続されます。これをセッションマネージャーのセッションで行っています。
セッションマネージャーの難点はファイル転送が行えないことでした。ポートフォワーディングを利用すれば解決できます。
例えばSFTPをローカルポート10022に行えばリモートポート22に送ることができます。
下準備
今回の検証ではLinuxノードとWindowsノードで行います。それぞれのノードに対してポートフォワーディングでのSSM接続を行います。
AWS CLIのインストール
AWS CLIはローカル環境のコマンドラインシェルでコマンドを使用して、AWS サービスとやり取りするためのオープンソースツールです。詳しくはAWS公式ドキュメントをご参考ください。
AWS CLIはご自身のローカル環境にインストールしてください。
こちらのAWS公式ドキュメントからそれぞれのOSに合わせてインストールしてください。
Windowsだけですが、こちらに方法記載しておきます。
-
下記コマンドを実行して、インストールを実行。
C:> msiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
-
下記コマンドを実行して、インストール完了を確認。
C:> aws --version
どちらもエラーが出なければ完了です。
AWS CLIのアクセス設定
アクセス設定も必要です。こちらの記事をご参考ください。
Session Managerプラグインのインストール
AWS CLIを使ってSSM接続する場合に必要になるのが、Session Managerプラグインです。
AWS CLIと同様、Session Managerプラグインもご自身のローカル環境にインストールしてください。
こちらもAWS公式ドキュメントを参考にして行ってください。
-
下記URLにアクセスして、インストーラをダウンロード。
https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe
-
インストーラを実行して、インストールを実行。
-
インストールできたら下記コマンドを実行し、インストールを確認。
session-manager-plugin
以下が出力されればインストール完了です。
The Session Manager plugin is installed successfully. Use the AWS CLI to start a session.
EC2インスタンスの作成
以下を満たせばなんでも大丈夫です。
- NATゲートウェイを置いてルーティングする
- プライベートサブネットに置く
- HTTPSアウトバウンド通信を許可したセキュリティグループを作成する
- SSM Agentをインストールする(デフォルトでインストールされるAMIもあり)
- IAMポリシーAmazonSSMManagedInstanceCoreを含んだIAMロールをアタッチ
セッションマネージャー利用条件・準備はこちらを参考にしてください。
NATゲートウェイを置いてルーティングする方法はこちらを参考にしてください。
手順
まずはAWS CLIでSSM接続確認
以下のコマンドを用いてシンプルな接続が可能です。
$ aws ssm start-session --target i-xxxxxxxx
ポートフォワーディングでSSMセッション開始
下記コマンドを実行してSSMセッションを開始します。
コマンドはこちらのAWS公式ドキュメントを参考にしています。
PowerShellはJSONのparsingがLinuxと異なるため、ダブルクオテーション"
の前に\
を挿入しています。
Linuxの場合は\
は削除して実行してください。
$ aws ssm start-session \
--target i-xxxxxxxxxxxxx \
--document-name AWS-StartPortForwardingSession \
--parameters '{\"portNumber\":[\"22\"], \"localPortNumber\":[\"10022\"]}'
PowerShellで改行が上手く機能しない場合は以下で1行で行ってみてください。
$ aws ssm start-session --target i-xxxxxxxxxxxxx --document-name AWS-StartPortForwardingSession --parameters '{\"portNumber\":[\"22\"], \"localPortNumber\":[\"10022\"]}'
ここでは、ローカルのポート10022をEC2インスタンスのポート22に転送しています。
この後検証しますが、上記のSSMセッションが確立されている間は、ローカルポート10022に接続するとEC2インスタンスポート22に転送されます。
ローカルポート10022にSSH接続
先ほどのコマンドを実行するとSSMセッションが開始されます。これはそのままにしておきます。
では、ターミナル上で新しいタブかウィンドウを開いて別のセッションを開始してください。ローカルポート10022にSSH接続していきます。
以下のコマンドを実行して、ローカルポート10022にSSH接続します。
ssh ec2-user@localhost -p 10022 -i XXXXXXX.pem
xxxxxxx.pem
にはキーペアファイルへのパスを入力してください。
EC2インスタンスに接続出来れば成功です。
SFTPでファイル転送
SFTPセッションを開始
先ほどのSSMセッションが途切れていないことを確認してください。
確認出来たら以下のコードを実行して、適当なファイルを転送します。
$ sftp -oPort=10022 -i XXXXXXX.pem ec2-user@localhost
-oPort
はSFTPの接続先のポートを選ぶオプションです。今回はローカルポートである10022です。
ec2-user@localhost
はSFTPの接続先のユーザ名とホスト名を指定しています。ポートフォワーディングによりEC2インスタンスに転送されるため、ユーザ名はデフォルト設定のec2-user
となっています。
SFTPセッションでファイル転送
先ほどのコマンドを実行すると、以下のような状態になっているはずです。
sftp>
ここにファイル転送のコマンドを実行します。
sftp> put test.txt
セッション開始前にいたディレクトリにあるファイルならファイル名のみで転送できました。下記のような出力結果が出れば転送完了です。
Uploading test.txt to /home/ec2-user/test.txt
test.txt 100% 5 0.1KB/s 00:00
もし正しく転送されない場合は、test.txtの部分を絶対パスにしてみてください。
余談
scp
コマンドを使えばファイル転送できます。Tera Termのファイル転送機能もscp
を利用していますね。
sftp
が有利なのは、セッションを確立してまとめて複数送ったり、一つずつ送ったりできる点ですね。
scp
だと毎回キーペアを入力して宛先を入力して、、としないといけないので手間がかかります。
セッションタイムアウトについて
セッションマネージャーのセッションタイムアウトの時間ですが、アクティブ状態ではデフォルトでは制限はありません。非アクティブ状態では、デフォルトで20分に設定されています。つまり、20分間何も実行されたりしなければ、セッションが自動的に終了します。
以下でマネジメントコンソールでの設定方法を紹介しています、CLIで設定したい場合は、こちらのAWS公式ドキュメントを参考にしてください。
非アクティブ状態のタイムアウト設定方法
1分間から60分間まで設定できます。
設定方法は特にAWS公式ドキュメントに追記することもないので、そのまま引用しました。
- AWS Systems Manager コンソール (https://console.aws.amazon.com/systems-manager/) を開きます。
- ナビゲーションペインで、[Session Manager] を選択します。
- [Preferences (設定)] タブを選択してから、[Edit (編集)] を選択します。
- [Idle session timeout (アイドルセッションタイムアウト)] の [分] フィールドで、セッションが終了するまでのユーザを非アクティブにする時間を指定します。
- [Save] を選択します。
アクティブ状態のタイムアウト設定方法
1分間から1440分間(24時間)まで設定できます。アクティブ状態だったとしても、指定した時間でセッションを終了させるという設定です。
こちらも同様にAWS公式ドキュメントからそのまま引用しています。
- AWS Systems Manager コンソール (https://console.aws.amazon.com/systems-manager/) を開きます。
- ナビゲーションペインで、[Session Manager] を選択します。
- [Preferences (設定)] タブを選択してから、[Edit (編集)] を選択します。
- 最大セッション時間の有効化の隣のチェックボックスをオンにします。
- セッションが終了するまでの最大時間を最大セッション時間の下にある [minutes] (分) フィールドで指定します。
- [Save] を選択します。
半自動化するバッチファイルのご紹介
バッチファイルはご存じでしょうか?
ファイルをダブルクリックしたり、cmdやPowerShellでバッチファイルを実行すると、コマンドを入力することなく(半)自動的に実行してくれるWindowsの一機能です。
基本的なバッチファイルの作成手順・実行手順
-
テキストエディタ(Notepadなど)を開きます。
-
バッチファイルに記述するコマンドを入力します。例えば、以下のようなコマンドを入力することができます。
@echo off set /p id="Enter Instance ID: " echo You entered: %id% pause
set /p
でユーザーにインスタンスIDを入力するように求めます。id
は変数になっています。
echo
で入力されたIDを表示します。
pause
で次のキー入力があるまでセッションを保持します。 -
ファイル名の末尾に.batを付けて保存します。例えば、my_script.batという名前で保存することができます。
-
バッチファイルをダブルクリックするか、コマンドプロンプトから実行することで、バッチファイルのコマンドが実行されます。
コマンドプロンプトからの実行は、バッチファイルが保存されているディレクトリで、バッチファイルの名前を直接入力してEnterを押せば実行できます。
当記事の各コマンドのバッチスクリプト
通常のSSM接続.bat
@echo off
set /p InstanceID="インスタンスIDを入力してください: "
aws ssm start-session --target %InstanceID%
pause
cmd
ポートフォワーディングでセッション確立.bat
@echo off
set /p InstanceID="Please enter the Instance ID: "
set LocalPort=10022
set /p LocalPort="Please enter the local port you want to forward (default: 10022): "
set RemotePort=22
set /p RemotePort="Please enter the remote port to be forwarded to (default: 22): "
aws ssm start-session --target %InstanceID% --document-name AWS-StartPortForwardingSession --parameters portNumber="%RemotePort%",localPortNumber="%LocalPort%"
ポートフォワーディングでSSH接続(Windows用).bat
@echo off
set LocalPort=10022
set /p LocalPort="Please enter the local port you want to forward (default: 10022): "
set /p CheckKeyPairPath="Do you remember the path of your key pair? If not, a new tab will be opened so that you can check the keypair path. Do you want to open a new tab to check? (Enter 'yes' or 'no'): "
if "%CheckKeyPairPath%"=="yes" (
start cmd /k
)
set /p KeyPairPath="Enter the path of your key pair: "
ssh ec2-user@localhost -p %LocalPort% -i %KeyPairPath%
pause
ポートフォワーディングでsftp接続してEC2インスタンスにファイル転送.bat
@echo off
set LocalPort=10022
set /p LocalPort="Please enter the local port you want to forward (default: 10022): "
set /p CheckKeyPairPath="Do you remember the path of your key pair? If not, a new tab will be opened so that you can check the keypair path. Do you want to open a new tab to check? (Enter 'yes' or 'no'): "
if "%CheckKeyPairPath%"=="yes" (
start cmd /k
)
set /p KeyPairPath="Enter the path of your key pair: "
sftp -oPort=%LocalPort% -i %KeyPairPath% ec2-user@localhost
pause
まとめ
今回はセッションマネージャーのポートフォワーディング機能を使ってSSH接続やファイル転送を行ってみました。
これを利用することで、マネジメントコンソールにログインすることなく、そして踏み台サーバーにコストをかけることなくセキュアなアクセスが確立できますね。
それではまた。