10分で作成できる AWS ParallelCluster の実行環境 AWS CloudShell 編

最速で AWS ParallelCluster のクラスターを作成する実行環境を用意したいときにご利用ください。
2022.06.11

いつもとは違う AWS アカウント上に AWS ParallelCluster のデモや、動作検証のために実行環境を用意する必要がありました。最速で実行環境を用意できるのは CloudShell だろうと思い作成してみたので作成方法をご紹介します。

AWS CloudShell について

AWS ParallelCluster の実行環境として利用する場合の必要事項です。

CloudShell については以下のリンクから詳細をご参照ください。

AWS ParallelCluster の実行環境作成

今回の AWS ParallelCluster の実行環境とは、クラスターを管理するための pcluster コマンドを利用可能な環境を作成することを目的とします。

以下のドキュメントを参考に実行環境を作成します。

Install AWS ParallelCluster in a virtual environment (recommended) - AWS ParallelCluster

ParallelCluster コマンドのインストール

ParallelCluster のコマンドは pip3 install で簡単に導入できます。CloudShell はデフォルトで Python3 がインストール済みです。ParallelCluster では Python3.6 以上のバージョンであれば良いため条件を満たしています。

$ python3 -V
Python 3.7.10

仮想環境を利用することが推奨されていますので分けておきます。ParallelCluster のバージョンを識別できるよう314と振りました。最新バージョンはRelease Noteを確認しないとわかりません。

$ python3 -m venv pcluster314
$ source pcluster314/bin/activate

ParallelCluster の管理コマンドをインストールします。

$ pip3 install aws-parallelcluster
$ pcluster version
{
  "version": "3.1.4"
}

ParallelCluster の管理コマンドの準備完了です。

Node.js のインストール

pcluster コマンドからクラスターを生み出すために Node.js の AWS CDK が利用されています。CDK 実行のための環境を準備します。

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
$ chmod ug+x ~/.nvm/nvm.sh
$ source ~/.nvm/nvm.sh
$ nvm install --lts
$ node --version
v16.15.1

ParallelCluster の管理コマンドと、CDK の実行が可能になり、AWS ParallelCluster の実行環境が整いました。

クラスター作成テスト

pcluster コマンドおよび、CDK が正常に動作するかテストのためクラスターを作成します。

クラスター作成の前提

  • クラスター(EC2)が起動する VPC、サブネットがあること

クラスターのコンフィグファイル

デモで作成したクラスターのサンプルコンフィグファイルです。環境依存のパラメーターは適時変更してください。

  • ヘッドノードのセクション(HeadNode
    • SubnetId: subnet-035be95eeaa091603
    • KeyName: sandbox-key
  • コンピュートノードのセクション(SlurmQueues
    • subnet-035be95eeaa091603

コンピュートノードはスポットインスタンスで起動指定してあります。スポット起動に必要なサービスリンクロールが存在していない場合は以下のドキュメントを参照し作成してください。

Amazon EC2 spot fleet role - AWS Batch

demo-cluster.yml

Region: ap-northeast-1
Image:
  Os: ubuntu2004
Monitoring:
  Logs:
    CloudWatch:
        Enabled: true
        RetentionInDays: 30
        DeletionPolicy: "Delete"
  Dashboards:
    CloudWatch:
        Enabled: false
Tags:
    - Key: Name
      Value: DemoCluster
HeadNode:
  InstanceType: t3.micro
  Networking:
    ElasticIp: false
    SubnetId: subnet-035be95eeaa091603
  Ssh:
    KeyName: sandbox-key
  LocalStorage:
    RootVolume:
      Size: 35
      Encrypted: false
      VolumeType: gp3
      Iops: 3000
      Throughput: 125
  Iam:
    AdditionalIamPolicies:
      - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
Scheduling:
  Scheduler: slurm
  SlurmSettings:
    ScaledownIdletime: 5
  SlurmQueues:
    # --- 1 ---
    - Name: debug
      ComputeResources:
        - Name: debug
          InstanceType: t3.micro
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: false
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: false
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      Networking:
         SubnetIds:
           - subnet-035be95eeaa091603
         PlacementGroup:
           Enabled: true
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

    # --- 2 ---
    - Name: large
      ComputeResources:
        - Name: large
          InstanceType: c6i.large
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 35
            Encrypted: false
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      Networking:
         SubnetIds:
           - subnet-035be95eeaa091603
         PlacementGroup:
           Enabled: true
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore

クラスター作成

ClouShell にコンフィグをペーストで上手く貼り付けられませんでした。CloudShell のアクションからファイルをアップロードしました。

コンフィグファイルを引数にクラスターを作成します。

$ pcluster create-cluster --cluster-name DemoCluster --cluster-configuration demo-cluster.yaml

クラスター作成には10分程度時間がかかります。CloudShell は20分放置でセッションが切断されますが、クラスター作成処理は非同期実行されているため仮にセッション切断されても影響はありません。

{
  "cluster": {
    "clusterName": "DemoCluster",
    "cloudformationStackStatus": "CREATE_IN_PROGRESS",
    "cloudformationStackArn": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/DemoCluster/e5f81480-e932-11ec-8cbd-0a5f98338a5d",
    "region": "ap-northeast-1",
    "version": "3.1.4",
    "clusterStatus": "CREATE_IN_PROGRESS"
  }
}

クラスター構築が終わるかクラスターのステータスを確認して待ちます。

CLUSTER_NAME=DemoCluster
while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .clusterStatus; sleep 5; done

CREATE_COMPLETEの表示を確認できればクラスター作成完了です。

実行結果

CREATE_IN_PROGRESS
CREATE_IN_PROGRESS
CREATE_COMPLETE

EC2 のダッシュボードを確認するとヘッドノードの起動を確認できました。

以上で、CloudShell からクラスター作成ができることを確認しました。

おわりに

クレデンシャルのことを考えると CloudShell が最もお手軽な実行環境なのではないかと思いました。常用する場合は EC2、Cloud9や、ローカルPC など他の実行環境を検討してください。気づいたら実行環境ごとクラスターのコンフィグが消失していた!ということがないようにお気をつけください。