AWS ParallelClusterでSSHポートフォワーディングとデータ転送
AWS ParallelClusterを利用した環境でパブリックサブネットの踏み台サーバから、プライベートサブネット内のヘッドノードへSSHポートフォワーディングを試す機会がありましたので紹介します。
- SSHポートフォワーディングのコマンド例
- 踏み台サーバを利用したrsyncコマンド例
- ファイル転送時のメトリクス確認
AWS ParallelClusterの環境例
ヘッドノードを含むクラスター環境はプライベートサブネット内に閉じており、ヘッドノードへはインターネットから直接接続できない状態です。
SSHポートフォワーディング
ヘッドノードのセキュリティグループは踏み台サーバからSSH接続を許可しています。
前提として踏み台サーバと、ParallelClusterのクラスター環境を作成した状態から説明をはじめます。
踏み台サーバ情報
実際のコマンド例で使用している値です。グローバルIPと、ユーザ名、キーペアを抑えておけばコマンドで必要な情報は揃います。
項目 | 値 |
---|---|
OS | Amazon Linux2 |
インスタンスタイプ | t4g.micro |
グローバルIP | 54.199.94.181 |
ユーザ名 | ec2-user |
キーペア名 | sandbox-key.pem |
ヘッドノード情報
プライベートIPと、ユーザ名、キーペアを抑えておけばコマンドで必要な情報は揃います。
項目 | 値 |
---|---|
OS | Ubuntu 18.04LTS |
インスタンスタイプ | c5.large |
プライベートIP | 10.0.17.12 |
ユーザ名 | ubuntu |
キーペア名 | sandbox-key.pem |
踏み台サーバへSSH接続
踏み台サーバへSSH接続し-L
オプションでポートフォワーディングの準備します。
コマンド例
ssh -i [踏み台サーバのキーペア] [踏み台サーバのユーザ名]@[踏み台サーバのグローバルIP] -L [ローカル端末の重複しない適当なポート番号]:[ヘッドノードのプライベートIP]:22
実際のコマンド
$ ssh -i sandbox-key.pem ec2-user@54.199.94.181 -L 55522:10.0.17.12:22
これで準備ができました。
ヘッドノードへSSH接続
準備したローカルホストのポート宛にSSH接続し目的のヘッドノードへアクセスします。
コマンド例
ssh -i [ヘッドノードのキーペア] [ヘッドノードのユーザ名]@localhost -p [ローカルの重複しない適当なポート番号で指定した番号]
実際のコマンド
$ ssh -i ./sandbox-key.pem ubuntu@localhost -p 55522
ヘッドノードのログイン成功できました。ジョブ管理するノードなのでsinfo
コマンドを打ちました。
$ sinfo -s PARTITION AVAIL TIMELIMIT NODES(A/I/O/T) NODELIST compute* up infinite 0/10/0/10 compute-dy-c5large-[1-10]
下記のエラー時の対処
localhost
の55522
ポートで別サーバに以前接続したことがあった場合は下記のエラーが表示されます。
$ ssh -i ./sandbox-key.pem ubuntu@localhost -p 55522 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is SHA256:LSyQkgm7MPSVnJA5ltxjMxUkB74tqsITcluLj0c5ZOc. Please contact your system administrator. Add correct host key in /Users/ohmura.yasutaka/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /Users/ohmura.yasutaka/.ssh/known_hosts:198 ECDSA host key for [localhost]:55522 has changed and you have requested strict checking. Host key verification failed.
接続先、鍵の変更が意図している場合はknown_hosts
から該当行を削除すれば解消されます。
$ ssh-keygen -R [localhost]:55522
ローカル端末からヘッドノードへデータ転送
必要なデータをヘッドノードのローカルストレージか、マウントしているEFSや、FSx for Lustreなどに転送したい場合
サンプルの転送データとして1GBのファイルを作成します。
$ dd if=/dev/zero of=1gb_file bs=1g count=1 1+0 records in 1+0 records out 1073741824 bytes transferred in 1.723867 secs (622868157 bytes/sec) ~/aws $ ls -lh 1gb_file -rw-r--r-- 1 ohmura.yasutaka staff 1.0G 2 11 17:18 1gb_file
コマンド例
rsync -av -e 'ssh -i [踏み台サーバのキーペア] [踏み台サーバのユーザ名]@[踏み台サーバのグローバルIP] ssh -i [ヘッドノードのキーペア]' [ローカルの転送するファイルまたはディレクトリ] [ヘッドノードのユーザ名]@[ヘッドノードのプライベートIPの]:[ヘッドノードの転送先パス]
実際のコマンド
$ rsync -av -e 'ssh -i sandbox-key.pem ec2-user@54.199.94.181 ssh -i sandbox-key.pem' ./1gb_file ubuntu@10.0.17.12:/home/ubuntu building file list ... done 1gb_file sent 1073873027 bytes received 42 bytes 1091889.24 bytes/sec total size is 1073741824 speedup is 1.00
ヘッドノードから確認
1GBのファイルがホームディレクトリに転送されていました。
$ ls -hld $PWD/* -rw-r--r-- 1 ubuntu ubuntu 1.0G Feb 11 08:18 /home/ubuntu/1gb_file
CloudWatchから確認
踏み台サーバ経由で転送するため、当然踏み台サーバとヘッドノードともにネットワークトラフィックが発生しています。今回はヘッドノードのEBS(ローカルストレージ)が転送先でした。踏み台サーバではEBSへの読み書きは基本発生せず、転送先のヘッドノードへの書き込みが発生していることが確認できました。
学術情報ネットワーク SINET5を利用している施設では通常のインターネット接続でも AWSへの経路は10Gbps帯域 があります。踏み台サーバ経由のデータ転送する場合は、踏み台サーバのネットワーク帯域がボトルネックにならないようメトリクスの確認と、インスタンスタイプにご注意ください。
学術研究機関でのSINET5を経由したAWSの利用 | Amazon Web Services ブログ
おわりに
AWS ParallelClusterのヘッドノードをパブリックサブネット作成すればSSHポートフォワーディングしなくても接続できます。しかし、少しでもセキュアにクラスター環境を作成し検証したい場合はお手軽に作れる環境のためよいのではないでしょうか。データの転送についてはローカル端末からS3へアップロードしてからヘッドノードでダウンロードも可能です。選択肢のひとつとしてご参考になれば幸いです。
参考
「SSHホスト鍵が変わってるよ!」と怒られたときの対処 - Qiita
踏み台経由のrsync, 帯域制限付き - Qiita