【小ネタ】LaunchTemplate を利用して、EBS最適化を有効にしたい場合

CloudFormation上で、LaunchTemplateを利用し、EBS最適化を有効にしたい場合の書き方を紹介します。
2022.02.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

LaunchTemplateを利用して、EBS最適化を定義しましたが、マネコンの表示上「無効」と表示されてしまいました。
恐らく、マネコン表示上の問題だけだとは思いますが、モヤモヤしましたので、「有効」と表示されるよう検証してみました。

結論

LaunchTemplateと並列でEbsOptimizedを記述することでEBS最適化が(マネコンの表示上も)有効になります。

AWSTemplateFormatVersion: 2010-09-09
Description: My EC2

Parameters:
  SystemName:
    Type: String
    Default: dev
  KeyName:
    Description: A Key name to access EC2
    Type: AWS::EC2::KeyPair::KeyName
    Default: # 指定したキー
  AMI:
    Type: String
    Default: ami-08a8688fb7eacb171
  InstanceType:
    Type: String
    Default: r5.large
  EC2VolumeSize:
    Type: Number
    Default: 8

Resources:
  InstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Path: "/"
      Roles:
        - # 指定したロール名
  
  WebServerLaunchTemplate:
    Type: AWS::EC2::LaunchTemplate
    Properties: 
      LaunchTemplateData: 
        ImageId: !Ref AMI
        InstanceType: !Ref InstanceType
        KeyName: !Ref KeyName
        BlockDeviceMappings:
          - DeviceName: /dev/sda1
            Ebs:
              VolumeType: "gp2"
              VolumeSize: !Ref EC2VolumeSize
              DeleteOnTermination: true
        # EbsOptimized: true
        IamInstanceProfile: 
          Arn: !GetAtt InstanceProfile.Arn
  
  WebServer:
    Type: AWS::EC2::Instance
    Properties: 
      LaunchTemplate: 
        LaunchTemplateId: !Ref WebServerLaunchTemplate
        Version: 1
      SubnetId: # 指定したサブネット
      EbsOptimized: true
      Tags: 
        - Key: Name
          Value: !Sub ${SystemName}-web-server

LaunchTemplateData配下に定義した場合

リファレンスでは、LaunchTemplateData配下に 、EbsOptimizedが定義できます。しかしながら、こちらに定義した場合、実際に構築されたEC2をマネコンで確認してみると、EBS最適化は「無効」と表示されていました(恐らく、表示上の問題)。

しかしながら、一旦「インスタンスを停止し、インスタンスタイプを変更」を押してみると、「このインスタンスタイプでは、デフォルトでEBS最適化が有効になっています。」と表示されています。EBS最適化(デフォルト)の章を見ても、r5.largeは含まれています。   ※そのまま何も変更せず、「適用」を押すことで、表示上も「有効」にすることができます。  

最後に

LaunchTemplateプロパティと並列にEbsOptimizedを定義することで「有効」表示がされました。もし、同じように悩んでいる方の助けになりましたら幸いです。