Amazon FSx for LustreをCloudFormationで構築する

FSx for LustreをCloudFormationで構築するテンプレートの紹介です。
2021.06.17

FSx for Lustreを検証するためにリソースを作成するテンプレートを作りました。Lustreの構築はもちろん、検証したいときだけ気軽に作成して削除できます。肝心なデータはLustreから透過的にS3バケットへ保存し利用します。データを残しておくと次回検証時に同じS3バケットからインポートすることで低コストに環境を維持できます。

前提

  • VPCとサブネット1個を構築済みの環境
  • FSx for Lustreと連携するS3バケット1個

テンプレート

実行順序

  1. Security Group
  2. 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コマンドの引数で必要なLustreDNSNameLustreMountNameはスタックのアウトプットに値を出力しています。参考にしてください。

また、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は検証の都度、構築・削除をテンプレート化により容易にできるようになりました。経済的に検証できます。

料金 - Amazon FSx for Lustre | AWS