Amazon FSx for Lustreのデータリポジトリタスクを使ってエクスポートとリリースをしてみた
AWS側からエクスポートやリリースをしたい
こんにちは、のんピ(@non____97)です。
皆さんはAmazon FSx for Lustre(FSxL)を使用していて、AWS側からエクスポートやリリースをしたいなと思ったことはありますか? 私はあります。
FSxLファイルシステムをマウントしているクライアント側で都度lfs hsm_release
を叩くのも面倒です。AWS側からリリースをしたいところです。
そんな時に使用できるのがデータリポジトリタスクです。これを用いることでAWS側でFSxLとS3間でファイルの転送の制御が可能です。
データリポジトリタスクの種類は以下API Referenceにあるとおり、インポート/エクスポート/リリースの3種類です。
Type
Specifies the type of data repository task to create.
- EXPORT_TO_REPOSITORY tasks export from your Amazon FSx for Lustre file system to a linked data repository.
- IMPORT_METADATA_FROM_REPOSITORY tasks import metadata changes from a linked S3 bucket to your Amazon FSx for Lustre file system.
- RELEASE_DATA_FROM_FILESYSTEM tasks release files in your Amazon FSx for Lustre file system that have been exported to a linked S3 bucket and that meet your specified release criteria.
- AUTO_RELEASE_DATA tasks automatically release files from an Amazon File Cache resource.
実際に試してみました。
いきなりまとめ
- 未エクスポートのファイルはリリースできない
- データリポジトリタスクを作成することで、AWS APIでインポート/エクスポート/リリースを制御することが可能
- EventBridge SchedulerとStep Functionsを組み合わせることで、定期的にエクスポート済みのファイルをリリースすることも可能
やってみた
検証環境
検証環境は以下のとおりです。
以下記事の環境を再利用しています。
なお、検証の都合上自動エクスポートは無効にしています。
検証用ファイルの作成
検証用のファイルを作成します。
$ sudo dd if=/dev/urandom of=/mnt/fsxl/s3/random_pattern_binary_block_128MiB bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 0.504705 s, 266 MB/s
$ sudo dd if=/dev/urandom of=/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2 bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 0.487987 s, 275 MB/s
$ sudo dd if=/dev/urandom of=/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3 bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 0.50822 s, 264 MB/s
$ sudo dd if=/dev/urandom of=/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4 bs=1M count=128
128+0 records in
128+0 records out
134217728 bytes (134 MB, 128 MiB) copied, 0.504604 s, 266 MB/s
ファイル作成後にlfs hsm_state
とlfs df -h
を叩いて、エクスポート状況とOSTの使用量を確認します。
$ lfs hsm_state /mnt/fsxl/s3/
can't get hsm state for /mnt/fsxl/s3/: Inappropriate ioctl for device
$ lfs hsm_state /mnt/fsxl/s3/*
/mnt/fsxl/s3/random_pattern_binary_block_128MiB: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_4GiB: (0x00000009) exists archived, archive_id:1
$ lfs df -h
UUID bytes Used Available Use% Mounted on
hcrabbuv-MDT0000_UUID 32.7G 9.0M 32.7G 1% /mnt/fsxl[MDT:0]
hcrabbuv-OST0000_UUID 1.1T 4.5G 1.1T 1% /mnt/fsxl[OST:0]
filesystem_summary: 1.1T 4.5G 1.1T 1% /mnt/fsxl
エクスポートはされておらず、OSTは4.5GBであることが分かります。
AWS CLIからでもS3バケット上にファイルがエクスポートされていないことを確認しました。
$ aws s3 ls s3://non-97-fsxl-s3
2025-09-17 09:02:45 4294967296 random_pattern_binary_block_4GiB
エクスポート前にリリース
本来であればエクスポートするところなのでしょうが、エクスポート前にリリースできるかどうか確認をします。
$ sudo lfs hsm_release /mnt/fsxl/s3/*
Cannot send HSM request (use of /mnt/fsxl/s3/random_pattern_binary_block_128MiB): Operation not permitted
$ sudo lfs hsm_release /mnt/fsxl/s3/random_pattern_binary_block_128MiB
Cannot send HSM request (use of /mnt/fsxl/s3/random_pattern_binary_block_128MiB): Operation not permitted
$ sudo lfs hsm_release /mnt/fsxl/s3/random_pattern_binary_block_128MiB_2
Cannot send HSM request (use of /mnt/fsxl/s3/random_pattern_binary_block_128MiB_2): Operation not permitted
$ lfs hsm_state /mnt/fsxl/s3/*
/mnt/fsxl/s3/random_pattern_binary_block_128MiB: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_4GiB: (0x00000009) exists archived, archive_id:1
$ ls -l /mnt/fsxl/s3
total 4380469
-rw-r--r--. 1 root root 134217728 Sep 22 10:04 random_pattern_binary_block_128MiB
-rw-r--r--. 1 root root 134217728 Sep 22 10:04 random_pattern_binary_block_128MiB_2
-rw-r--r--. 1 root root 134217728 Sep 22 10:04 random_pattern_binary_block_128MiB_3
-rw-r--r--. 1 root root 134217728 Sep 22 10:07 random_pattern_binary_block_128MiB_4
-rw-r--r--. 1 root root 4294967296 Sep 17 09:02 random_pattern_binary_block_4GiB
はい、Operation not permitted
と拒否されてました。
ということで、エクスポート前にリリースはできないようです。
逆にいうとリリースするためにはエクスポートが完了しる必要があることが分かります。
最終的な生成物をS3にエクスポートするパスなのであれば、自動エクスポートを有効化した上でデータリポジトリタスクで定期的にリリースをすれば良さそうですね。
リリースするデータリポジトリタスクの作成
それでは、リリースするデータリポジトリタスクの作成をします。
以下AWS公式ドキュメントを参考にデータリポジトリを選択して、アクション
-リリースタスクの作成
をクリックします。
リリースするファイルシステムパスや前回アクセスからの最小期間(atime/ctime/mtimeの最大値)からの経過時間などを指定してデータリポジトリタスクを作成します。
作成してしばらくすると、データリポジトリタスクのステータスが成功
となりました。タイプはRelease data from filesystem
なので分かりやすいですね。
タスクの詳細は以下のとおりです。1件エクスポートしていることが分かります。
lfs hsm_state
を叩くと、確かにエクスポート済みだった1件だけreleased exists archived
となっていました。
$ lfs hsm_state /mnt/fsxl/s3/*
/mnt/fsxl/s3/random_pattern_binary_block_128MiB: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4: (0x00000000)
/mnt/fsxl/s3/random_pattern_binary_block_4GiB: (0x0000000d) released exists archived, archive_id:1
エクスポートするデータリポジトリタスクの作成
続いて、エクスポートするデータリポジトリタスクの作成をします。
エクスポートするファイルシステムのパスやレポートパス等を指定してタスクを作成します。
作成したタスクのステータスが成功になりました。タイプはExport to repository
です。
タスクの詳細は以下のとおりです。4件エクスポートされたようです。
lfs hsm_state
を叩くと、確かに先ほどエクスポートされていなかったファイルがexists archived
となっていました。
$ lfs hsm_state /mnt/fsxl/s3/*
/mnt/fsxl/s3/random_pattern_binary_block_128MiB: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_4GiB: (0x0000000d) released exists archived, archive_id:1
リリースするデータリポジトリタスクをStep Functionsで作成
せっかくなので、リリースするデータリポジトリタスクをStep Functionsで作成します。
といっても、CreateDataRepositoryTask
APIを叩くだけのシンプルなステートマシンです。ステートマシンのASLは以下のとおりです。
{
"Comment": "A description of my state machine",
"StartAt": "CreateDataRepositoryTask",
"States": {
"CreateDataRepositoryTask": {
"Type": "Task",
"Arguments": {
"FileSystemId": "fs-0a68e6aed0680b2a2",
"Paths": [
"s3"
],
"Report": {
"Enabled": "true",
"Format": "REPORT_CSV_20191124",
"Scope": "FAILED_FILES_ONLY",
"Path": "s3://non-97-fsxl-s3/report"
},
"Type": "AUTO_RELEASE_DATA",
"ReleaseConfiguration": {
"DurationSinceLastAccess": {
"Unit": "DAYS",
"Value": 0
}
}
},
"Resource": "arn:aws:states:::aws-sdk:fsx:createDataRepositoryTask",
"End": true
}
},
"QueryLanguage": "JSONata"
}
random_pattern_binary_block_4GiB
以外の読み込みを行い、FSxLにインポートしておきます。
$ lfs hsm_state /mnt/fsxl/s3/*
/mnt/fsxl/s3/random_pattern_binary_block_128MiB: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4: (0x00000009) exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_4GiB: (0x0000000d) released exists archived, archive_id:1
$ lfs df -h
UUID bytes Used Available Use% Mounted on
hcrabbuv-MDT0000_UUID 32.7G 9.0M 32.7G 1% /mnt/fsxl[MDT:0]
hcrabbuv-OST0000_UUID 1.1T 520.5M 1.1T 1% /mnt/fsxl[OST:0]
filesystem_summary: 1.1T 520.5M 1.1T 1% /mnt/fsxl
この状態でステートマシンを実行します。
すると、以下のように正常にデータリポジトリタスクが作成されていました。
詳細を確認するとリリースされたのは4件となっていますね。
FSxLから確認すると、確かに未リリースだったファイルがリリースされたことを確認できました。
$ lfs hsm_state /mnt/fsxl/s3/*
/mnt/fsxl/s3/random_pattern_binary_block_128MiB: (0x0000000d) released exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_2: (0x0000000d) released exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_3: (0x0000000d) released exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_128MiB_4: (0x0000000d) released exists archived, archive_id:1
/mnt/fsxl/s3/random_pattern_binary_block_4GiB: (0x0000000d) released exists archived, archive_id:1
$ lfs df -h
UUID bytes Used Available Use% Mounted on
hcrabbuv-MDT0000_UUID 32.7G 9.1M 32.7G 1% /mnt/fsxl[MDT:0]
hcrabbuv-OST0000_UUID 1.1T 7.5M 1.1T 1% /mnt/fsxl[OST:0]
filesystem_summary: 1.1T 7.5M 1.1T 1% /mnt/fsxl
あとはEventBridge Schedulerで定期実行すれば定期的に未エクスポートのファイルをリリースする処理を組めそうですね。
未エクスポートのファイルのリリースはAWS APIで簡単に実行できる
Amazon FSx for Lustreのデータリポジトリタスクを使ってエクスポートとリリースをしてみました。
未エクスポートのファイルのリリースはAWS APIで簡単に実行できます。FSxLファイルシステムのSSDが逼迫している場合は、定期的なエクスポートを実装してみてはいかがでしょうか。最終アクセスからの経過日数以上でリリース対象の絞り込みもできるため、自動エクスポートしている領域に対して実行したとしても即座にリリースということを回避することが可能です。
この記事が誰かの助けになれば幸いです。
以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!