gp3を使用したEC2をCloudFormationで作成する際にスループットを指定するなら?

こんにちは!
コンサルティング部の枡川です。
起動テンプレートを経由することで、gp3を使用したEC2をCloudFormationで作成する際にスループットを指定することができます。  

gp3について

新しいEBSボリュームであるgp3ですが、発表から1年経って使用機会も増えていると思います。
下記記事で紹介されている通り、gp2と同等の性能を確保するという観点ではどのようなパターンでもgp3の方が安くなります。
特別な制約が無ければ、使わない理由は無いとまで言って良いのかもしれません。

gp3のgp2との大きな違いとして、IOPSやスループットを明示的に指定する必要があることが挙げられます。
特にスループットについてはgp2選択時の最大スループットと比較してデフォルトのスループット値が低くなる可能性が高いです。
上記ブログに記載の通り、gp2と同程度まで追加のプロビジョニングをしてもトータルのコストはgp3の方が安くなりますが、スループットについては考慮が必要となります。
上記ブログは本当に参考になるので、まだ読んでいない方は一読をおすすめいたします!

gp3を使用したEC2をCloudFormationで作る時の注意点

gp3を使用したEC2をCloudFormationで作成する際に、スループットを指定することができませんでした。
CloudFormationのAWS::EC2::Instance Ebsで設定できる属性を調べてみます。
たしかにThroughputは存在しません。

  • DeleteOnTermination
  • Encrypted
  • Iops
  • KmsKeyId
  • SnapshotId
  • VolumeSize
  • VolumeType

試しに下記テンプレートのようにThroughputを指定してみましたが、そんなものはありませんと怒られました。

EC2:
    Type: "AWS::EC2::Instance"
    Properties:
      ImageId: !Ref AMI
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: !Ref EC2VolumeSize
            DeleteOnTermination: true
            Iops: 3000
            Throughput: 250
      SecurityGroupIds: 
        - !Ref EC2SecurityGroup
      IamInstanceProfile: !Ref myInstanceProfile1
      DisableApiTermination: true
      SubnetId: !Ref EC2Subnet
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvironmentName}-ec2

初期値である125MB/sで作成し、負荷テスト等を踏まえて後から調整という形も簡単に行うことができます。
しかし、既存の環境が存在する等で明らかにスループットが足りないと見込まれる際は最初から設定したい時もあると思います。

起動テンプレートを経由して作成する

一方、起動テンプレートを経由することで最初からスループットを指定することが可能でした。
AWS::EC2::LaunchTemplate Ebsで設定できる項目は下記です。

  • DeleteOnTermination
  • Encrypted
  • Iops
  • KmsKeyId
  • SnapshotId
  • Throughput
  • VolumeSize
  • VolumeType

以上を踏まえて下記テンプレートを実行した所、正しくEC2インスタンスが作成されました。(DeviceNameはAmazon Linux2の場合)

EC2:
    Type: AWS::EC2::Instance
    Properties:
      LaunchTemplate: 
        LaunchTemplateId: !Ref LaunchTemplate
        Version: 1
      SubnetId: !Ref EC2Subnet
      Tags:
        - Key: Name
          Value: !Sub ${SystemName}-${EnvironmentName}-ec2


  LaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateData: 
        ImageId: !Ref AMI
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        BlockDeviceMappings:
          - DeviceName: /dev/xvda
            Ebs:
              VolumeType: gp3
              VolumeSize: !Ref EC2VolumeSize
              DeleteOnTermination: true
              Iops: 3000
              Throughput: 250
        SecurityGroupIds: 
          - !Ref EC2SecurityGroup
        IamInstanceProfile: 
          Arn: !GetAtt myInstanceProfile1.Arn
        DisableApiTermination: true

ボリュームを確認するとたしかに、スループットが250MB/sになっています。

まとめ

起動テンプレートを経由することで、ルートボリュームにgp3を使用したEC2をCloudFormationで作成する際にスループットを指定できます。
その他にもルートボリュームにタグ付けを実施できる等のメリットがあります。
CloudFormationでEC2を作成する際には是非起動テンプレートの使用も検討してみて下さい。
その他のメリットについても下記ブログにもまとめられています。