
EC2にWindows HPCクラスターをセットアップする
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、坂巻です。
今回は非常に計算量の多い処理を行うことができるハイパフォーマンスコンピューティング(HPC)についてのエントリです。
ハイパフォーマンスコンピューティング・・・その存在は知りつつも、特別なもので敬遠している人も多いのではないでしょうか。(私がそうでした..) EC2にWindows HPCクラスターをセットアップしてみたところ、構築作業自体はシンプルなものでしたので、ご紹介したいと思います。
画面を貼っているので、少々長くなってしまいましたが、作業手順は以下のチュートリアルを参考にしています。
それでは、はじめましょう。
構成
本エントリではMicrosoft HPC Packを利用し、HPCクラスター環境を構築します。

目次
- 前提条件
- セキュリティグループ作成
- ドメインコントローラ用のセキュリティグループ
- ドメインメンバーサーバ用のセキュリティグループ
- HPCクラスター用のセキュリティグループ
- セキュリティグループルール追加
- ドメインコントローラ用のセキュリティグループ
- ドメインメンバーサーバ用のセキュリティグループ
- HPCクラスター用のセキュリティグループ
- EC2作成(ドメインコントローラー)
- ドメインコントローラーのセットアップ
- ドメインユーザ作成
- EC2作成(ヘッドノード)
- DNS設定
- ドメイン参加
- Internet Explorerセキュリティ強化の構成変更
- HPC Packインストール
- ヘッドノード設定
- EC2作成(計算ノード)
- HPC Packインストール
- 計算ノード設定
- さいごに
前提条件
- EC2を起動するVPCが構築済みであること
- 参考までに本エントリで利用したVPCはこちらにあります
- Tools for Windows PowerShellの実行環境
セキュリティグループ作成
Tools for Windows PowerShellを使用して、ドメインコントローラー、ドメインメンバーサーバ及び、HPCクラスター用のセキュリティグループを作成します。コマンド内のパラメータ-VpcIdにvpc-1ae4a97dを指定していますが、セキュリティグループを作成するVPCのIDに置き換えて実行してください。
ドメインコントローラ用のセキュリティグループ
New-EC2SecurityGroup -VpcId vpc-1ae4a97d -GroupName "SG - Domain Controller" -Description "Active Directory Domain Controller"
ここで作成されたセキュリティグループのIDはsg-7de6c005とします。
ドメインメンバーサーバ用のセキュリティグループ
New-EC2SecurityGroup -VpcId vpc-1ae4a97d -GroupName "SG - Domain Member" -Description "Active Directory Domain Member"
ここで作成されたセキュリティグループのIDはsg-5b486e23とします。
HPCクラスター用のセキュリティグループ
New-EC2SecurityGroup -VpcId vpc-1ae4a97d -GroupName "SG - Windows HPC Cluster" -Description "Windows HPC Cluster Nodes"
ここで作成されたセキュリティグループのIDはsg-c04d6bb8とします。
上記コマンドを実行すると-VpcIdに指定したVPC内に、セキュリティグループが作成されます。

セキュリティグループルール追加
ドメインコントローラ用のセキュリティグループ
セキュリティグループのルール追加にあたり、必要な情報を変数に代入します。以下の箇所は置き換えて実行してください。
$sg_dm.GroupId…ドメインメンバーサーバ用のセキュリティグループID(ここではsg-5b486e23)IpRanges…リモートデスクトップを許可するアドレス
$sg_dm = New-Object Amazon.EC2.Model.UserIdGroupPair
$sg_dm.GroupId = "sg-5b486e23"
$r1 = @{ IpProtocol="UDP"; FromPort="123"; ToPort="123"; UserIdGroupPairs=$sg_dm }
$r2 = @{ IpProtocol="TCP"; FromPort="135"; ToPort="135"; UserIdGroupPairs=$sg_dm }
$r3 = @{ IpProtocol="UDP"; FromPort="138"; ToPort="138"; UserIdGroupPairs=$sg_dm }
$r4 = @{ IpProtocol="TCP"; FromPort="49152"; ToPort="65535"; UserIdGroupPairs=$sg_dm }
$r5 = @{ IpProtocol="TCP"; FromPort="389"; ToPort="389"; UserIdGroupPairs=$sg_dm }
$r6 = @{ IpProtocol="UDP"; FromPort="389"; ToPort="389"; UserIdGroupPairs=$sg_dm }
$r7 = @{ IpProtocol="TCP"; FromPort="636"; ToPort="636"; UserIdGroupPairs=$sg_dm }
$r8 = @{ IpProtocol="TCP"; FromPort="3268"; ToPort="3269"; UserIdGroupPairs=$sg_dm }
$r9 = @{ IpProtocol="TCP"; FromPort="53"; ToPort="53"; UserIdGroupPairs=$sg_dm }
$r10 = @{ IpProtocol="UDP"; FromPort="53"; ToPort="53"; UserIdGroupPairs=$sg_dm }
$r11 = @{ IpProtocol="TCP"; FromPort="88"; ToPort="88"; UserIdGroupPairs=$sg_dm }
$r12 = @{ IpProtocol="UDP"; FromPort="88"; ToPort="88"; UserIdGroupPairs=$sg_dm }
$r13 = @{ IpProtocol="TCP"; FromPort="445"; ToPort="445"; UserIdGroupPairs=$sg_dm }
$r14 = @{ IpProtocol="UDP"; FromPort="445"; ToPort="445"; UserIdGroupPairs=$sg_dm }
$r15 = @{ IpProtocol="ICMP"; FromPort="-1"; ToPort="-1"; UserIdGroupPairs=$sg_dm }
$r16 = @{ IpProtocol="TCP"; FromPort="3389"; ToPort="3389"; IpRanges="210.139.188.126/32" }
ドメインコントローラのセキュリティグループにルールを追加します。
コマンド内のパラメータ-GroupIdはドメインコントローラ用のIDに置き換えて実行してください。(ここではsg-7de6c005)
Grant-EC2SecurityGroupIngress -GroupId sg-7de6c005 -IpPermission @( $r1, $r2, $r3, $r4, $r5, $r6, $r7, $r8, $r9, $r10, $r11, $r12, $r13, $r14, $r15, $r16 )
上記コマンドを実行すると、ドメインコントローラ用のセキュリティグループにルールが追加されます。

こちらののルールの詳細については、How to configure a firewall for domains and trustsをご確認ください。
ドメインメンバーサーバ用のセキュリティグループ
セキュリティグループのルール追加にあたり、必要な情報を変数に代入します。以下の箇所は置き換えて実行してください。
$sg_dm.GroupId…ドメインコントローラ用のセキュリティグループID(ここではsg-7de6c005)
$sg_dc = New-Object Amazon.EC2.Model.UserIdGroupPair
$sg_dc.GroupId = "sg-7de6c005"
$r1 = @{ IpProtocol="TCP"; FromPort="49152"; ToPort="65535"; UserIdGroupPairs=$sg_dc }
$r2 = @{ IpProtocol="UDP"; FromPort="49152"; ToPort="65535"; UserIdGroupPairs=$sg_dc }
$r3 = @{ IpProtocol="TCP"; FromPort="53"; ToPort="53"; UserIdGroupPairs=$sg_dc }
$r4 = @{ IpProtocol="UDP"; FromPort="53"; ToPort="53"; UserIdGroupPairs=$sg_dc }
ドメインメンバーサーバ用のセキュリティグループにルールが追加されました。
コマンド内のパラメータ-GroupIdはドメインメンバーサーバ用のIDに置き換えて実行してください。(ここではsg-5b486e23)
Grant-EC2SecurityGroupIngress -GroupId sg-5b486e23 -IpPermission @( $r1, $r2, $r3, $r4 )
上記コマンドを実行すると、ドメインメンバーサーバ用のセキュリティグループにルールが追加されます。

HPCクラスター用のセキュリティグループ
セキュリティグループのルール追加にあたり、必要な情報を変数に代入します。以下の箇所は置き換えて実行してください。
$sg_hpc.GroupId…HPCクラスター用のセキュリティグループID(ここではsg-c04d6bb8)IpRanges…リモートデスクトップを許可するアドレス
$sg_hpc = New-Object Amazon.EC2.Model.UserIdGroupPair
$sg_hpc.GroupId = "sg-c04d6bb8"
$r1 = @{ IpProtocol="TCP"; FromPort="80"; ToPort="80"; UserIdGroupPairs=$sg_hpc }
$r2 = @{ IpProtocol="TCP"; FromPort="443"; ToPort="443"; UserIdGroupPairs=$sg_hpc }
$r3 = @{ IpProtocol="TCP"; FromPort="1856"; ToPort="1856"; UserIdGroupPairs=$sg_hpc }
$r4 = @{ IpProtocol="TCP"; FromPort="5800"; ToPort="5800"; UserIdGroupPairs=$sg_hpc }
$r5 = @{ IpProtocol="TCP"; FromPort="5801"; ToPort="5801"; UserIdGroupPairs=$sg_hpc }
$r6 = @{ IpProtocol="TCP"; FromPort="5969"; ToPort="5969"; UserIdGroupPairs=$sg_hpc }
$r7 = @{ IpProtocol="TCP"; FromPort="5970"; ToPort="5970"; UserIdGroupPairs=$sg_hpc }
$r8 = @{ IpProtocol="TCP"; FromPort="5974"; ToPort="5974"; UserIdGroupPairs=$sg_hpc }
$r9 = @{ IpProtocol="TCP"; FromPort="5999"; ToPort="5999"; UserIdGroupPairs=$sg_hpc }
$r10 = @{ IpProtocol="TCP"; FromPort="6729"; ToPort="6730"; UserIdGroupPairs=$sg_hpc }
$r11 = @{ IpProtocol="TCP"; FromPort="7997"; ToPort="7997"; UserIdGroupPairs=$sg_hpc }
$r12 = @{ IpProtocol="TCP"; FromPort="8677"; ToPort="8677"; UserIdGroupPairs=$sg_hpc }
$r13 = @{ IpProtocol="TCP"; FromPort="9087"; ToPort="9087"; UserIdGroupPairs=$sg_hpc }
$r14 = @{ IpProtocol="TCP"; FromPort="9090"; ToPort="9092"; UserIdGroupPairs=$sg_hpc }
$r15 = @{ IpProtocol="TCP"; FromPort="9100"; ToPort="9163"; UserIdGroupPairs=$sg_hpc }
$r16 = @{ IpProtocol="TCP"; FromPort="9200"; ToPort="9263"; UserIdGroupPairs=$sg_hpc }
$r17 = @{ IpProtocol="TCP"; FromPort="9794"; ToPort="9794"; UserIdGroupPairs=$sg_hpc }
$r18 = @{ IpProtocol="TCP"; FromPort="9892"; ToPort="9893"; UserIdGroupPairs=$sg_hpc }
$r19 = @{ IpProtocol="UDP"; FromPort="9893"; ToPort="9893"; UserIdGroupPairs=$sg_hpc }
$r20 = @{ IpProtocol="TCP"; FromPort="6498"; ToPort="6498"; UserIdGroupPairs=$sg_hpc }
$r21 = @{ IpProtocol="TCP"; FromPort="7998"; ToPort="7998"; UserIdGroupPairs=$sg_hpc }
$r22 = @{ IpProtocol="TCP"; FromPort="8050"; ToPort="8050"; UserIdGroupPairs=$sg_hpc }
$r23 = @{ IpProtocol="TCP"; FromPort="5051"; ToPort="5051"; UserIdGroupPairs=$sg_hpc }
$r24 = @{ IpProtocol="TCP"; FromPort="3389"; ToPort="3389"; IpRanges="210.139.188.126/32"}
HPCクラスター用のセキュリティグループにルールを追加します。
コマンド内のパラメータ-GroupIdはHPCクラスター用のIDに置き換えて実行してください。(ここではsg-c04d6bb8)
Grant-EC2SecurityGroupIngress -GroupId sg-c04d6bb8 -IpPermission @( $r1, $r2, $r3, $r4, $r5, $r6, $r7, $r8, $r9, $r10, $r11, $r12, $r13, $r14, $r15, $r16, $r17, $r18, $r19, $r20, $r21, $r22, $r23, $r24 )
上記コマンドを実行すると、HPCクラスター用のセキュリティグループにルールが追加されます。

こちらののルールの詳細については、Appendix 1: HPC Cluster Networkingをご確認ください。
EC2作成(ドメインコントローラー)
ドメインコントローラーとなるEC2を作成します。EC2作成の詳細は割愛しますが、AMIはami-07f2a061(Windows_Server-2016-Japanese-Full-Base-2018.03.24)を利用しました。セキュリティグループは先程作成した、ドメインコントローラ用のセキュリティグループsg-7de6c005をアタッチしています。その他の項目は、以下の設定としました。

ドメインコントローラーのセットアップ
作成したEC2にEIPをアタッチし、ドメインコントローラーにログインします。 サーバーマネージャーを起動し[役割と機能の追加]をクリックします。

[役割ベースまたは機能ベースのインストール]をクリックします。

[サーバープールからサーバを選択]より、表示されたサーバを選択します。

[Active Directory ドメインサービス]を選択します。

[機能の追加]をクリックします。

[次へ]をクリックします。

[インストール]をクリックします。

インストールが正常に完了したことを確認し[このサーバーをドメインコントローラーに昇格する]をクリックします。

[新しいフォレストを追加する]を選択し、ドメイン名に[hpc.local]を入力します。

フォレスト、ドメインの機能レベルより[Windows Server 2008 R2]を選択し、パスワードに任意の値を入力します。

[次へ]をクリックします。

[次へ]をクリックします。

[次へ]をクリックします。

[次へ]をクリックします。

[インストール]をクリックします。

インストールが完了すると再起動が行われます。
ドメインユーザ作成
ドメインコントローラーにhpc.local\administratorでログインします。
サーバーマネージャーを起動し[Active Directoryユーザーとコンピューター]をクリックします。

[hpc.local]を右クリックし、[新規作成]-[ユーザー]をクリックします。

ログオン名に[hpcuser]を入力し、ユーザを作成します。

EC2作成(ヘッドノード)
ヘッドノードとなるEC2を作成します。EC2作成の詳細は割愛しますが、AMIはami-1b67ea7d(Windows_Server-2012-RTM-Japanese-64Bit-Base-2017.12.13)を利用しました。セキュリティグループは先程作成した、ドメインメンバーサーバ用sg-5b486e23と、HPCクラスター用のセキュリティグループsg-c04d6bb8をアタッチしています。その他の項目は、以下の設定としました。

DNS設定
作成したEC2にEIPをアタッチし、ヘッドノードにログインします。 [インターネット プロトコル バージョン4 (TCP/IPv4)のプロパティ]の優先DNSに、ドメインコントローラーのIPを指定します。

ドメイン参加
[コンピュータ名/ドメイン名の変更]より、ドメイン名に[hpc.local]を入力します。

hpc.local\administratorで認証を行います。

hpc.localに参加したことを確認します。

[今すぐ再起動する]をクリックします。

Internet Explorerセキュリティ強化の構成変更
hpc.local\hpcuserで、ヘッドノードにログインします。
サーバーマネージャーを起動し[ローカルサーバー]-[IEセキュリティ強化の構成]をクリックします。

[オフ]を設定します。

HPC Packインストール
HPC-HeadMicrosoft Download CenterからHPC Pack 2012 をダウンロードします。

[setup]を実行します。

[新たにインストールするか、新機能を既存のインストールに追加する]をクリックします。

インストールウィザードに従い設定していきます。[インストールの種類の選択]では[ヘッドノードを作成することで新しいHPCクラスターを作成する]を選択してください。

必要なコンポーネントのインストール中にエラーが発生してしまいました。。

ログC:\Program Files\Microsoft SQL Server\110\Setup Bootstrap\Log\Summary.txtに、以下メッセージが出力されていたので再起動を行いました。
Exception type: Microsoft.SqlServer.Configuration.RulesEngineExtension.RulesEngineRuleFailureException
Message:
A computer restart is required because of broken fusion ATL. You must restart your computer before you continue.
再起動後に再度実行したところ、無事にインストールすることができました。

ヘッドノードを設定
スタートメニューより[HPC Cluster Manager]をクリックします。

[ネットワークの構成]をクリックします。

[エンタープライズ ネットワーク上ののみのすべてのノード]をクリックします。

[次へ]をクリックします。

[ファイアウォールの設定を、クラスター内のネットワークおよびノードに自動的に適用する]より[オン]を選択します。

[構成]をクリックします。

[完了]をクリックします。

[インストール資格情報の提供]をクリックします。

hpc.local\hpcuserで認証を行います。

[はい]をクリックします。

[新しいノードの名前付けの構成]をクリックします。

[OK]をクリックします。

[ノードテンプレートの作成]をクリックします。

[計算ノードテンプレート]を選択します。

[次へ]をクリックします。

[オペレーティングシステムなし]を選択します。

[次へ]をクリックします。

[作成]をクリックします。

ヘッドノードが正常に作成された事が確認できました。

EC2作成(計算ノード)
計算ノードとなるEC2を作成します。EC2作成の詳細は割愛しますが、AMIはami-1b67ea7d(Windows_Server-2012-RTM-Japanese-64Bit-Base-2017.12.13)を利用しました。セキュリティグループは先程作成した、ドメインメンバーサーバ用sg-5b486e23と、HPCクラスター用のセキュリティグループsg-c04d6bb8をアタッチしています。その他の項目は、以下の設定としました。

HPC Packインストール
HPC-HeadMicrosoft Download CenterからHPC Pack 2012 をダウンロードします。

[setup]を実行します。

[新たにインストールするか、新機能を既存のインストールに追加する]をクリックします。

[次へ]をクリックします。

[仕様許諾契約書に同意します]にチェックを付与します。

[新しい計算ノードを作成することで既存のHPCクラスターに参加する]を選択します。

[次へ]をクリックします。

参加するクラスターを選択します。リストをクリックするとヘッドノードの名前が表示されます。

[次へ]をクリックします。

[更新プログラムをチェックするときにMicrosoft Updateを仕様する]を選択します。

[イントール]をクリックします。

[完了]をクリックします。

計算ノード設定
ヘッドノードより、[HPC Cluster Manager]を確認します。 ノードが非承認となっているので承認作業を行います。

非承認のノードを選択し、右クリック[ノードの追加]をクリックします。

[既に構成済みの計算ノードまたはブローカーノードを追加する]を選択します。

[次へ]をクリックします。

[すべて選択]にチェックを付与します。

[完了]をクリックします。

クラスタマネージャーより、ノードが追加されたことが確認できました。

さいごに
コンソール作業が多かったため、少々長くなってしまいましたがシンプルな作業で、HPCクラスターの構築が行えました。 次回はHPCクラスターにジョブを設定して、実際にハイパフォーマンスコンピューティングを体感できればと思いますが、検討中でございます。 これをきっかけに、ハイパフォーマンスコンピューティングの世界に足を踏み入れていただける方が増えれば望外の喜びです。







