AWS ParallelClusterでSSHポートフォワーディングとデータ転送

AWS ParallelClusterのプライベートサブネット内のヘッドノードへのSSH接続方法
2021.02.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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]

下記のエラー時の対処

localhost55522ポートで別サーバに以前接続したことがあった場合は下記のエラーが表示されます。

$ 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