AWS ParallelCluster Ubuntu 22.04 で Mountpoint for Amazon S3 を使って S3 バケットをマウントする方法

2023.10.08

AWS ParallelCluster で OS は Ubuntu 22.04 を利用し、 Mountpoint for Amazon S3 を利用できるクラスター環境を構築手順を紹介します。

ヘッドノード、コンピュートノードから直接 S3 バケットのデータを取得できます。大容量のデータを読み取ることの多い機械学習、ゲノム解析(リファレンスゲノムなど)のワークロードで ParallelCluster を利用する場合は本構成もご検討ください。

Inventory icons created by Freepik - Flaticon

経緯

Mountpoint for Amazon S3 がリリース時点で最新だった ParallelCluster 3.6 + Ubuntu 20.04 でクラスターを構築手順は以前ご紹介しました。

その後に ParallelCluster 3.7 代がリリースされ、Ubuntu 22.04 を新たにサポートしました。

Ubuntu 22.04 を利用する場合、以前に紹介したクラスターの構築手順では失敗することがわかりました。原因切り分けについては以下のブログを参照ください。

運悪く ParallelCluster 3.7.0 以前のバージョンは脆弱性を抱えました。脆弱性対応済みのバージョンとして ParallelCluster 3.7.1 がリリースされています。

今後は ParallelCluster 3.7.1 以降のバージョンかつ、Ubuntu ユーザーは Ubuntu 22.04 への切り替えが進むことでしょう。そして Mountpoint for Amazon S3 の組み合わせの需要が見込まれます。

改めて構築手順を整理しました。

クラスター構築手順

全体の流れや、マウント用の S3 バケット、IAM ポリシーを事前に作成する Cloudformation テンプレートも以下のブログの通りで問題ありませんでした。比較的丁寧に設定方法を紹介していることもあり、必要な変更点のみをこちらの記事で紹介します。

AWS ParallelCluster に Mountpoint for Amazon S3 を使って S3 バケットをマウントする方法 | DevelopersIO

想定する要件

  • ParallelCluster のバージョンは CVE-2023-41915 脆弱性対応済みの v3.7.1 または、それ以降
    • 現時点で最新版は v3.7.1 です
    • ※ 以降の動作保証はできないのですが問題を確認したらブログをアップすると思います
  • OS は Ubuntu 22.04
    • Ubuntu ユーザーは機をみて 20.04 からの移行をご検討されているのではないでしょうか
  • Mountpoint for Amazon S3 をヘッドノード、コンピュートノードにマウントしたい

変更点: カスタムブートストラップアクションの準備

重要なポイントです。mount-s3で必要なライブラリ(libfuse2)を事前インストールする必要があります。

mount.sh

#! /bin/bash

sudo apt update
sudo apt install libfuse2 -y

wget -P /tmp https://s3.amazonaws.com/mountpoint-s3-release/latest/x86_64/mount-s3.deb
sudo apt-get install /tmp/mount-s3.deb -y
sudo mkdir /mnt/s3
sudo mount-s3 --allow-delete --allow-other [マウントする S3 バケット名] /mnt/s3/

ParallelCluster 3.7.1 + Ubuntu 22.04 対応で大きな変更点だったのは、カスタムブートストラップアクションのスクリプト修正でした。

変更点: クラスターコンフィグ作成

Ubuntu 22.04 からは SSH 接続に必要なキーペアは ED25519 タイプが必須です。RSA タイプのキーペアだと接続できません。セッションマネージャーで運用される場合は気になりませんが仕様変更が入ったことはご認識しておいてください。

v371released.yaml

Region: ap-northeast-1
Image:
  Os: ubuntu2204
Tags:
  - Key: Name
    Value: v371-cluster
# ----------------------------------------------------------------
# Head Node Settings
# ----------------------------------------------------------------
HeadNode:
  InstanceType: t3.micro
  Networking:
    ElasticIp: false
    SubnetId: subnet-0cc9326cae7a514a3
  Ssh:
    KeyName: sandbox-keypair
  LocalStorage:
    RootVolume:
      Size: 40
      Encrypted: true
      VolumeType: gp3
      Iops: 3000
      Throughput: 125
   # CustomActions:
    # OnNodeConfigured:
  Iam:
    AdditionalIamPolicies:
      - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3
    S3Access:
      - BucketName: hpc-dev-postinstall-files
        EnableWriteAccess: false
# ----------------------------------------------------------------
# Compute Node Settings
# ----------------------------------------------------------------
Scheduling:
  Scheduler: slurm
  SlurmSettings:
    ScaledownIdletime: 5
  SlurmQueues:
    # ------ Compute 1 ------
    - Name: queue1
      ComputeResources:
        - Name: queue1
          Instances:
            - InstanceType: c6i.large
            - InstanceType: m6i.large
          MinCount: 0
          MaxCount: 10
          DisableSimultaneousMultithreading: true
      ComputeSettings:
        LocalStorage:
          RootVolume:
            Size: 40
            Encrypted: true
            VolumeType: gp3
            Iops: 3000
            Throughput: 125
      CapacityType: SPOT
      AllocationStrategy: lowest-price
      Networking:
        SubnetIds:
          - subnet-0cc9326cae7a514a3
        PlacementGroup:
          Enabled: false
      CustomActions:
        OnNodeConfigured:
          Script: s3://hpc-dev-postinstall-files/mount-moutpoint-for-s3/mount.sh
      Iam:
        AdditionalIamPolicies:
          - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
          - Policy: arn:aws:iam::123456789012:policy/hpc-dev-AllowMountpointForS3
        S3Access:
          - BucketName: hpc-dev-postinstall-files
            EnableWriteAccess: false

# ----------------------------------------------------------------
#  Other Settings
# ----------------------------------------------------------------
Monitoring:
  Logs:
    CloudWatch:
      Enabled: true
      RetentionInDays: 180
      DeletionPolicy: "Delete"
  Dashboards:
    CloudWatch:
      Enabled: false

動作確認

クラスターをデプロイ後、ヘッドノードへログインしコンピュートノードに Mountpoint for Amazon S3 を通して S3 バケットをマウントできているのか確認します。

テストジョブの内容

カスタムブートストラップのスクリプトでコンピュートノードは/mnt/s3ディレクトリに S3 バケットをマウントする設定にしています。/mnt/s3のディレクトリのファイルを確認するテストジョブを投げます。

test.sh

#! /bin/bash

hostname
ls -l /mnt/s3

マウントした S3 バケットにあるオブジェクトはこんな感じです。ベンチマークのテストで生成されたファイルが転がっています。

実行結果

ジョブの実行結果を確認します。コンピュートノードから S3 バケットのオブジェクトを参照できています。

slurm-1.out

queue1-dy-queue1-1
total 39014400
-rw-r--r-- 1 root root 1073741824 Aug 27 04:38 SEQ8M-Q128T1-1G-Read.0.0
-rw-r--r-- 1 root root  524288000 Aug 27 07:29 SEQ8M-Q128T1-500M-Read.0.0
-rw-r--r-- 1 root root 1073741824 Aug 27 04:39 SEQ8M-Q128T16-1G-Read.0.0
-rw-r--r-- 1 root root 1073741824 Aug 27 04:42 SEQ8M-Q128T16-1G-Read.1.0
-rw-r--r-- 1 root root 1073741824 Aug 27 04:40 SEQ8M-Q128T16-1G-Read.10.0
-rw-r--r-- 1 root root 1073741824 Aug 27 04:40 SEQ8M-Q128T16-1G-Read.11.0

これで Ubuntu 22.04 対応の Moutpoint for Amazon S3 の動作確認がとれました。

おわりに

ゲノム解析のワークロードで Mountpoint for Amazon S3 ご利用の方は意見交換したいので仕事関係なしにご連絡お待ちしております。