AWS ParallelCluster でもSSH接続はやめて、セッションマネージャーで接続できます

2021.04.15

AWS ParallelClusterはクラウドHPC環境を簡単に構築できるツールです。

AWS ParallelClusterで作成したクラスター環境にもAWS Systems Manager セッションマネージャーを利用できます。 ヘッドノード、コンピュートノードへのSSH接続を廃止し、よりセキュアなクラスター環境を構築してみましょう。

プライベートサブネットにクラスター環境構築する場合に特にオススメです。ログインノードにあたる踏み台サーバをなくせます。

結論

  • additional_iam_policiesの設定で必要なIAMポリシーを追加
  • SSM-Agentはデフォルトでインストール済み & サービス自動起動済み
    • ParallelClusterのバージョンと、OSに依る部分なので都度確認した方がよい
  • 自動生成されるIAMロールはヘッドノードと、コンピュートノードで共通

検証環境

項目
ParallelCluster 2.10.3
OS Ubuntu 18.04 LTS
AMI aws-parallelcluster-2.10.3-ubuntu-1804-lts-hvm-x86_64-202103172101
Architecture Intel
HeadNode t3.micro
ComputeNode c5.large

セッションマネージャーの設定

ロギングの設定はしていません。

ParallelClusterの設定ファイル

additional_iam_policiesにセッションマネージャーで必要なIAMポリシー(AmazonSSMManagedInstanceCore)を指定します。

# v2.10.3
[aws]
aws_region_name = us-east-1

[aliases]
ssh = ssh {CFN_USER}@{MASTER_IP} {ARGS}

[global]
cluster_template = default
update_check = true
sanity_check = true

[cluster default]
key_name = sandbox-key-useast1
scheduler = slurm
# --- HeadNode Setting ---
base_os = ubuntu1804
master_instance_type = t3.micro
master_root_volume_size = 30
# --- Netowrk Setting ---
vpc_settings = default
# --- Compute Setting ---
queue_settings = spot1

# --- IAM Policy---
additional_iam_policies = arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

# --- Tag ---
tags = { "Name" : "Blog-Sample-ClusterSSM" }

[vpc default]
vpc_id = vpc-07edfc27679c9ca80
master_subnet_id = subnet-0ab2754446b2f87a4
compute_subnet_id = subnet-0ab2754446b2f87a4
use_public_ips = true # 検証用設定: パブリックサブネットで起動しているため

[queue spot1]
compute_resource_settings = spot1_resource
placement_group = DYNAMIC
compute_type = spot

[compute_resource spot1_resource]
instance_type = c5.large
max_count = 16

クラスターを作成しました。

> pcluster create ssm-cluster -c ssm
Beginning cluster creation for cluster: ssm-cluster
Creating stack named: parallelcluster-ssm-cluster
Status: parallelcluster-ssm-cluster - CREATE_COMPLETE
MasterPublicIP: 99.99.99.99
ClusterUser: ubuntu
MasterPrivateIP: 10.1.11.224

ヘッドノードのIAMロールを確認します。 自動生成されたIAMロールに設定ファイル内で指定したAmazonSSMManagedInstanceCoreポリシーが追加されています。

ヘッドノード接続テスト

セッションマネージャーで接続してみます。

WEBブラウザからヘッドノードへログインできました。 キャプチャは文字が読みづらいため以降はテキストで説明します。

SSM-Agentはインストール済みでサービスは自動起動していました。そのため、IAMポリシー追加するだけでセッションマネージャーから接続できたわけです。

$ sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service
● snap.amazon-ssm-agent.amazon-ssm-agent.service - Service for snap application amazon-ssm-agent.amazon-ssm-agent
   Loaded: loaded (/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-04-15 01:05:59 UTC; 6min ago
 Main PID: 883 (amazon-ssm-agen)
    Tasks: 34 (limit: 1099)
   CGroup: /system.slice/snap.amazon-ssm-agent.amazon-ssm-agent.service
           ├─ 883 /snap/amazon-ssm-agent/3552/amazon-ssm-agent
           ├─1147 /snap/amazon-ssm-agent/3552/ssm-agent-worker
           ├─1379 /snap/amazon-ssm-agent/3552/ssm-session-worker cm-ohmura.yasutaka-0c3bbbcb3143aab9b i-040aae658db141912
           ├─1398 sh
           └─1636 sudo su - ubuntu
           --- 省略 ---

Ubuntuなので当初はPostinstall処理でSSM-Agentをインストールして起動させないといけないのかと思っていました。ひと手間省けてよかったです。

コンピュートノード接続テスト

まずテストジョブを投げてコンピュートノードを起動させます。

テストジョブの内容はSSM-Agentの状態を出力するだけです。

text.sh

! /bin/bash
sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service

テストジョブを投げました。

$ sbatch -n1 test.sh
Submitted batch job 2

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
spot1*       up   infinite      1   mix# spot1-dy-c5large-1
spot1*       up   infinite     15  idle~ spot1-dy-c5large-[2-16]

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                 2     spot1  test.sh   ubuntu CF       0:09      1 spot1-dy-c5large-1

コンピュートノードの起動を待ちます。

しばらくするとキューからジョブがなくなっています。

$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)

ヘッドノードに保存されたコンピュートノードの実行結果を確認します。コンピュートノードでもSSM-Agentが起動していることがわかりました。

slum-2.out

● snap.amazon-ssm-agent.amazon-ssm-agent.service - Service for snap application amazon-ssm-agent.amazon-ssm-agent
   Loaded: loaded (/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2021-04-15 01:30:28 UTC; 2min 3s ago
 Main PID: 1082 (amazon-ssm-agen)
    Tasks: 20 (limit: 4391)
   CGroup: /system.slice/snap.amazon-ssm-agent.amazon-ssm-agent.service
           ├─1082 /snap/amazon-ssm-agent/3552/amazon-ssm-agent
           └─1471 /snap/amazon-ssm-agent/3552/ssm-agent-worker
           --- 省略 ---

コンピュートノードにもセッションマネージャーで接続ができました。接続先がコンピュートノードなのか分かりにくいのですがホスト名から識別できます。

ParallelClusterで自動生成のIAMロールについて

pcluster createで作成したクラスター環境には自動生成のIAMロールがヘッドノードと、コンピュートノードに割り当てられます。IAMロールはヘッドノードと、コンピュートノードで共通です。

ヘッドノードのIAMロールと、コンピュートノードのIAMロールで異なるIAMロールを設定することはできません。

セッションマネージャー設定Tips

セッションマネージャーでSSH・SCPを使いたい

ローカル端末とヘッドノード間でファイルを転送したいことはよくあります。WEBブラウザからのログインだとファイル転送ができません。

セッションマネージャーのトンネル内でSSHやSCPコマンドを使うこともできます。設定すればSCPコマンドでヘッドノードにファイル転送ができます。

下記ブログを参考にしてください。

セッションマネージャーのエンドポイント

会社からだとセッションマネージャーで接続できない。

オンプレにHPC環境をお持ちの企業様は研究開発などを行っており、セキュリティに厳しいケースが多く見られます。プロキシサーバなどで社内セットワークからインターネットへ制限がある環境でしたら社内ネットワークも疑ってみてください。

ちなみに東京リージョンでのセッションマネージャーのエンドポイントは下記になります。プロキシサーバなどインターネットの出口を制限していないかご確認ください。

# HTTPSアクセスの許可が必要
ssm.ap-northeast-1.amazonaws.com

まとめ

additional_iam_policiesに必要なIAMポリシーを追記すると、自動生成されるIAMロールに追加したIAMポリシーが追加される。 IAMロールはヘッドノードと、コンピュートノードで共通であり、別々のIAMロールを設定することはできない。

おわりに

セッションマネージャーを使うとSSH接続を許可したセキュリティグループの設定が不要になります。不要にはなるのですが...クラスター作成時にデフォルトで作成されるセキュリティグループは以下のように全世界からSSH接続を許可した状態です。

パブリックサブネットにクラスター環境を作成する場合は、デフォルトのSSH接続許可を削除してセッションマネージャーのアクセスに寄せられないかご検討ください。

参考