Mountpoint for Amazon S3 を HPC 用途で利用するときの考慮事項

2023.08.20

HPC ワークロードで Mountpoint for Amazon S3 の利用を検討していました。HPC ワークロードで S3 へ直接アクセスできるのは魅力的なことで、 具体的には AWS ParallelCluster でゲノム解析するときに有効な構成を検討するにあたり調べたことをまとました。

Mountpoint for Amazon S3 とは

Linux マシンに S3 バケットをマウントして直接 S3 バケットに対して読み書き機能を提供するソフトウェアです。

マウントと一言で表現してしまうと EFS や、FSx をはじめとするとネットワークファイルシステム(NFS)をイメージすると思います。S3 はオブジェクトストレージであることと、API でアクセスするため、一般的にイメージする「ファイルシステムをマウントした状態」と比べると制約があります。

基本的な説明は以下のブログを参考にしてください。

Mountpoint for Amaozn S3 の基礎知識

1 次ソースとして参考になる情報が多かったのは GitHub のリポジトリでした。README 以外のページも用意されおり、確認したい内容は探せば見つかるくらいには情報が整理されていました。

AWS 公式のドキュメントも用意されています。mount-s3コマンドのインストール手順は手厚いですが、現時点ではそれ以外の内容はないに等しいです。mount-s3コマンドの指定できるフラグなど利用検討時に把握しておくべき情報は GitHub にしかありません。

上記の 2 つソースから私が確認した内容をまとめておきます。

検証環境

OS は Ubuntu 20.04 LTS の AWS ParallelCluster 3.6.1 環境で検証しています。mount-s3 コマンドのバージョンは1.0.0です。

一般的なこと

HPC 用途に限定しない一般的な内容のまとめです。後半にゲノム解析用途の内容をまとめています。

基本的なコンセプト

Mountpoint for Amazon S3 の行動指針が載っています。

  1. POSIX 準拠はしていない
  2. S3 の API 操作で効率的な実装ができないファイル操作であるリネームや、ファイルの更新はサポート(エミュレート)しない

マウントする EC2 に必要な IAM ポリシー

S3 のバケットポリシーか、IAM ポリシーで制御できます。IAM ポリシーの設定例を説明のため転記します。

また、--alow-deleteフラグなしでマウントするデフォルト状態では削除操作ができません。ファイルの削除するときはハイライト箇所の許可ポリシーが必要です。

{
   "Version": "2012-10-17",
   "Statement": [
        {
            "Sid": "MountpointFullBucketAccess",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET"
            ]
        },
        {
            "Sid": "MountpointFullObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:AbortMultipartUpload",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
            ]
        }
   ]
}

参考

ファイルの削除ができるフラグ指定

マウントした S3 バケットにファイル作成する書き込み操作に加えて、削除可能するにはマウント時に--allow-deleteフラグの指定が必要です。

項目
S3 バケット名 hpc-dev-mountpoint
マウント先のパス /mnt/mountpoint-for-s3

実行例

$ sudo mount-s3 --allow-delete hpc-dev-mountpoint /mnt/mountpoint-for-s3/

既存のファイルの更新(オブジェクトの上書き)はできません。--allow-deleteフラグを付けることで、ファイルを更新しようと思えば、ファイルを削除してから再作成することで遠回しには実現できます。

参考

バージョニングの有効化有無

--allow-deleteフラグをつけてマウントする場合は意図しないファイル削除を防ぐためにも、S3 バケットのバージョニングは有効化が推奨されています。

参考

マウント後 sudo なしでアクセスするために必要なフラグ

S3 バケットをマウントするとパーミッションもオーナーも以下の表示で一見すると壊れている様に見えます。chownも効きませんがsudoをつければ、今回の場合は--alow-deleteフラグも付けているためファイルの読み書きできます。

$ sudo mkdir /mnt/mountpoint-for-s3
$ sudo mount-s3 --allow-delete hpc-dev-mountpoint-060238338506 /mnt/mountpoint-for-s3/
$ ll /mnt
ls: cannot access 'mountpoint-for-s3': Permission denied
total 8
drwxr-xr-x  3 root root 4096 Aug 18 07:24 ./
drwxr-xr-x 19 root root 4096 Aug 18 07:31 ../
d?????????  ? ?    ?       ?            ? mountpoint-for-s3/

ですが、lsコマンド打つのにもsudoを付けるのはストレスです。--allow-otherフラグを付けてマウントするとsudo問題は解決できました。

項目
S3 バケット名 hpc-dev-mountpoint
マウント先のパス /mnt/mountpoint-for-s3

実行例

$ sudo mount-s3 --allow-delete --allow-other hpc-dev-mountpoint /mnt/mountpoint-for-s3/

参考

fstab 非サポート

現状ですと自動マウントするには何かしらの方法で起動後にmount-s3コマンドを実行する必要があります。定番の fstab はサポートしていませんでした。また、ロードマップにも fstab 対応は載っていません。

Issue を漁っていると自動マウントのためにサービス化している例がありました。私はテストしていないので動作未確認です。

[Unit]
Description=Mountpoint for Amazon S3 mount
Wants=network.target
AssertPathIsDirectory=/home/ubuntu/models

[Service]
Type=forking
User=ubuntu
Group=ubuntu
ExecStart=/usr/bin/mount-s3 stabdif-dev-2-models-bucket /home/ubuntu/models --debug
ExecStop=/usr/bin/fusermount -u /home/ubuntu/models

[Install]
WantedBy=default.target

起動の度にワンショットでコマンド実行するだけならと思い crontab でmount-s3コマンドを一発実行でも自動マウントを試したところ成功しました。

項目
S3 バケット名 hpc-dev-mountpoint
マウント先のパス /mnt/mountpoint-for-s3

実行例

@reboot sudo mount-s3 --allow-delete --allow-other hpc-dev-mountpoint /mnt/mountpoint-for-s3/

systemd のサービス化、crontab の設定、あとは .bashrc などでも起動じにコマンドを一発実行できるなら可能かと思います。

参考

ゲノム解析用途

ParallelCluster でゲノム解析を実行を想定して確認した内容をまとめます。

以下の環境を想定しています。

Inventory icons created by Freepik - Flaticon

ストレージクラス選定

非同期アクセスとなる以下のストレージクラスから読み取りはサポートされていません。

  • S3 Glacier Flexible Retrieval
  • S3 Glacier Deep Archive storage classes
  • S3 Inteligent-Tiering の Archive Access, Deep Archive Access tiers

逆にファイルの書き込みは S3 Glacier Deep Archive でもなんでもサポートしています。

ParallelCluster からの利用を考えると、大容量のシーケンスファイルの読み取りと、解析結果の保存先として S3 を利用することになります。 シーケンスファイルのデータサイズとアクセス頻度を考えると、Inteligent-Tiering にコスト最適化を任せたいところです。

Inteligent-Tiering の S3 バケットはマウント対象としてサポートしていますので、Inteligent-Tiering を推しておきます。

解析結果のファイル数が細かく多い場合は、tar でアーカイブして S3 にアップするオブジェクト数を減らす対応は必要になるかもしれません。

参考

パフォーマンスチューニング

  • ネットワークスループットはデフォルトで最適化済み
    • EC2の利用可能帯域幅の最大値がデフォルト
    • 複数のマウントポイントがある場合に帯域制限かけたときに設定値を変更する可能性はある
  • スレッド数は要検討
    • 最大 16 スレッド処理がデフォルト
    • 最大スレッド数は調整可能
    • 増やせば CPU 負荷あがるがコンピュートノードならあまり気にするところではない
    • ヘッドノードにマウントする場合はスペックと要相談
  • オブジェクトサイズは最適化済み
    • 並列リクエストの 1 パートサイズは 8 MiB がデフォルト
    • 検証時に最大スループット記録した値をデフォルト値として採用している
  • 読み込みオブジェクトサイズは上限なし
    • 巨大なシーケンスファイルでも心配なし
  • 書き込みオブジェクトサイズは要検討
    • 書き込み最大サイズは 78.1 GiB がデフォルト値
    • 最大 5 TiB まで許可できる

参考

S3 API リクエスト数は経過観察

ゲノム解析ソフトは OSS で多様多種なアプリケーションが存在しています。当然、個々のアプリにワークロードは異なります。

But many data lake customers use more domain-specific tools that don’t natively support S3’s object APIs and instead expect inputs and outputs to be files in a local file system. For example, many genomics research tools are open-source Linux applications that read sequencing data from a file system,

The inside story on Mountpoint for Amazon S3, a high-performance open source file client | AWS Storage Blog

アプリケーションによってはファイルの読み出しが過度に発生し、S3 API リクエスト課金が高額になることも考えられます。アプリケーション次第のため、しばらく運用したあとに S3 の請求項目を確認して使い方を検討することになります。

Inventory icons created by Freepik - Flaticon

おわりに

ParallelCluster で Mountpoint for Amazon S3 を組み込んだ構成も検証しました。その前に調べた基本的な内容を整理しました。