この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
FSx for Lustreを検証するためにリソースを作成するテンプレートを作りました。Lustreの構築はもちろん、検証したいときだけ気軽に作成して削除できます。肝心なデータはLustreから透過的にS3バケットへ保存し利用します。データを残しておくと次回検証時に同じS3バケットからインポートすることで低コストに環境を維持できます。
2022/2/16追記ブラッシュアップしたサンプルテンプレートを作成しました
前提
- VPCとサブネット1個を構築済みの環境
- FSx for Lustreと連携するS3バケット1個
テンプレート
実行順序
- Security Group
- FSx for Lustre
Security Group
FSx for LustreにアタッチするセキュリティグープにはTCPの988, 1021-1023ポートの許可が必要です。 マネジメントコンソールから作成するときも説明されています。
ドキュメントを参照するとFSx for Lustreにアタッチするセキュリティグープからの自己参照と、LustreをマウントするEC2などリソースから上記ポートを許可する必要がありました。
上記条件を反映したセキュリティグープ設定は下記になります。
sg.yml
---
AWSTemplateFormatVersion: "2010-09-09"
Description: Create Security Group*2
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: Common Settings
Parameters:
- ProjectName
- Environment
- Label:
default: VPC
Parameters:
- VPCID
Parameters:
ProjectName:
Description: Project Name
Type: String
Default: unnamed
Environment:
Description: Environment
Type: String
Default: dev
AllowedValues:
- prod
- dev
- stg
VPCID:
Type: AWS::EC2::VPC::Id
Resources:
# Create Security Group
# EC2 to mount Lustre
SecurityGroup1:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub ${ProjectName}-${Environment}-ec2-mount-lustre-sg
GroupDescription: EC2 to mount Lustre Security Group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: "0.0.0.0/0"
Description: "Access from Public"
VpcId: !Ref VPCID
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Environment}-ec2-mount-lustre-sg
# FSx for Lustre
SecurityGroup2:
Type: AWS::EC2::SecurityGroup
Properties:
GroupName: !Sub ${ProjectName}-${Environment}-lustre-sg
GroupDescription: FSx for Lustre Security Group
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 2049
ToPort: 2049
SourceSecurityGroupId: !Ref SecurityGroup1
Description: "Access from EC2 to mount Lustre"
- IpProtocol: tcp
FromPort: 988
ToPort: 988
SourceSecurityGroupId: !Ref SecurityGroup1
Description: "Access from EC2 to mount Lustre"
- IpProtocol: tcp
FromPort: 1021
ToPort: 1023
SourceSecurityGroupId: !Ref SecurityGroup1
Description: "Access from EC2 to mount Lustre"
VpcId: !Ref VPCID
Tags:
- Key: Name
Value: !Sub ${ProjectName}-${Environment}-lustre-sg
SecurityGroup2Ingress1:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: !Ref SecurityGroup2
IpProtocol: tcp
FromPort: 988
ToPort: 988
SourceSecurityGroupId: !GetAtt SecurityGroup2.GroupId
Description: "Access from Lustre LNET network"
SecurityGroup2Ingress2:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: !Ref SecurityGroup2
IpProtocol: tcp
FromPort: 1021
ToPort: 1023
SourceSecurityGroupId: !GetAtt SecurityGroup2.GroupId
Description: "Access from Lustre LNET network"
Outputs:
ExportSG1:
Value: !Ref SecurityGroup1
Export:
Name: !Sub ${AWS::StackName}-SG1
ExportSG2:
Value: !Ref SecurityGroup2
Export:
Name: !Sub ${AWS::StackName}-SG2
FSx for Lustre
SCRATCH_2
タイプで作成しています。テンプレートの設定値をマネジメントコンソールから確認すると以下の値です。
lustre.yml
---
AWSTemplateFormatVersion: "2010-09-09"
Description: Create Lustre*1
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: Common Settings
Parameters:
- ProjectName
- Environment
- Label:
default: Lustre Settings
Parameters:
- LustreSubnetID1
Parameters:
ProjectName:
Description: Project Name
Type: String
Default: unnamed
Environment:
Description: Environment
Type: String
Default: dev
AllowedValues:
- prod
- dev
- stg
LustreSubnetID1:
Type: AWS::EC2::Subnet::Id
StackNameSG:
Type: String
Description: Stack name of SecurityGroup
ImportS3BucketName:
Type: String
Default: "s3://hoge"
Resources:
FSxFileSystem:
Type: "AWS::FSx::FileSystem"
Properties:
FileSystemType: "LUSTRE"
StorageCapacity: 1200
SubnetIds:
- !Ref "LustreSubnetID1"
SecurityGroupIds:
- Fn::ImportValue: !Sub "${StackNameSG}-SG2"
LustreConfiguration:
AutoImportPolicy: "NEW"
ImportPath: !Ref "ImportS3BucketName"
ExportPath: !Sub "${ImportS3BucketName}/export"
ImportedFileChunkSize: 1024
WeeklyMaintenanceStartTime: "6:20:00"
DeploymentType: "SCRATCH_2"
DataCompressionType: "LZ4"
StorageType: "SSD"
Tags:
- Key: "Name"
Value: !Sub ${ProjectName}-${Environment}-lustre
Outputs:
ExportLustreID:
Value: !Ref FSxFileSystem
Export:
Name: !Sub "${AWS::StackName}-LustreID1"
ExportLustreMountName:
Value: !GetAtt "FSxFileSystem.LustreMountName"
Export:
Name: !Sub "${AWS::StackName}-LustreMountName1"
ExportLustreDNSName:
Value: !GetAtt "FSxFileSystem.DNSName"
Export:
Name: !Sub "${AWS::StackName}-LustreDNSName1"
TIPS
FSx for Lustreをテンプレートからデプロイ時にLustreへアタッチするセキュリティグープに自己参照して許可するTCP 988
を抜かした場合のエラーです。ちなみにTCP 1021-1023
は許可しなくてもLustreのデプロイは成功しました。デプロイ時には必要ではなくても後々使われるのでしょう。注意してください。
エラーメッセージ
The file system cannot be created because the default security group in the subnet provided or the provided security groups do not permit Lustre LNET network traffic on port 988 (Service: AmazonFSx; Status Code: 400; Error Code: InvalidNetworkSettings; Request ID: f321b930-acf3-47a6-84c3-21cbfd6b30e8; Proxy: null)
FSx for Lustreマウント確認
以下のドキュメントを参考にAmazon Linux2からFSx for Lustreをマウントし接続確認を行います。
Mounting from an Amazon EC2 I instance - Amazon FSx for Lustre
mount
コマンドの引数で必要なLustreDNSName
とLustreMountName
はスタックのアウトプットに値を出力しています。参考にしてください。
また、FSx for Lustreの管理画面からも同じ値を確認できます。
/mnt/lustre
配下にLustreをマウントします。mount
コマンドの書式は以下です。引数の値はご自身の環境に合わせて変更してください。
sudo mount -t lustre -o noatime,flock [LustreDNSName]@tcp:/[LustreMountName] /mnt/lustre
実際にマウントしたときのコマンド例
sudo amazon-linux-extras install -y lustre2.10
sudo mkdir /mnt/lustre
sudo mount -t lustre -o noatime,flock fs-05a0d371dac49defc.fsx.ap-northeast-1.amazonaws.com@tcp:/d2whnbmv /mnt/lustre
Lustreを認識できています。まだLustre上にファイルをロードしていません。ディスク使用量は4.4MBです。
> lfs df -h
UUID bytes Used Available Use% Mounted on
d2whnbmv-MDT0000_UUID 34.4G 5.4M 34.4G 0% /mnt/lustre[MDT:0]
d2whnbmv-OST0000_UUID 1.1T 4.4M 1.1T 0% /mnt/lustre[OST:0]
filesystem_summary: 1.1T 4.4M 1.1T 0% /mnt/lustre
サンプルで事前に連携するS3バケットへファイルを保存していました。S3バケット内のファイルをLustreを通して透過的に確認できています。
> ll /mnt/lustre/
total 26K
drwxr-xr-x 2 root root 25K Jun 17 00:30 export/
-rwxr-xr-x 1 root root 2.0G Jun 15 01:59 windAuroundBuildings.tar.gz*
Lustreにロードしていないのでreleased
の表示です。
> lfs hsm_state ./windAuroundBuildings.tar.gz
./windAuroundBuildings.tar.gz: (0x0000000d) released exists archived, archive_id:1
試しに2GBのファイルをロードしてみます。lfs hsm_action
コマンドでNOOP表示を確認できればロード完了です。
> sudo lfs hsm_restore ./windAuroundBuildings.tar.gz
> sudo lfs hsm_action ./windAuroundBuildings.tar.gz
/mnt/lustre/windAuroundBuildings.tar.gz: NOOP
released
の表示がなくなり、Lustre上へS3のファイルがロードされた状態です。
> lfs hsm_state ./windAuroundBuildings.tar.gz
./windAuroundBuildings.tar.gz: (0x00000009) exists archived, archive_id:1
あらためてLustreのディスク使用量を確認すると2.0GBあり、Lustre上にファイルが置かれています。容量についてはLustreの圧縮機能を有効化してるので多少容量が削減できているのか、丸められただけなのかは判斷つきませんでした。
> lfs df -h
UUID bytes Used Available Use% Mounted on
d2whnbmv-MDT0000_UUID 34.4G 5.5M 34.4G 0% /mnt/lustre[MDT:0]
d2whnbmv-OST0000_UUID 1.1T 2.0G 1.1T 0% /mnt/lustre[OST:0]
filesystem_summary: 1.1T 2.0G 1.1T 0% /mnt/lustre
おわりに
FSx for Lustreを長時間起動していると料金が気になってきました。Lustreに置きたい必要なデータはS3からインポート、エクスポートで運用します。キャッシュレイヤーの位置づけのLustreは検証の都度、構築・削除をテンプレート化により容易にできるようになりました。経済的に検証できます。