x86とarm64用の起動テンプレートを混在させたEC2オートスケール環境をCloudFormationで試してみた

複数の起動テンプレートをサポートしたEC2オートスケーリンググループで、x86_64とarm64環境の起動を試してみました。
2020.11.26

AWSチームのすずきです。

2020年11月19日のアップデートでサポートされた、複数の起動テンプレートを利用して、x86_64とarm64異なるCPUアーキテクチャを組み合わせたEC2オートスケーリンググループ設定を試す機会がありましたので、紹介させていただきます。

Amazon EC2 Auto Scaling が、Auto Scaling グループの複数起動テンプレートのサポートを発表

設定

2020年11月時点 の AWSコンソールは、複数の起動テンプレートを利用する EC2 オートスケール設定をサポートしていませんでした。

今回は、CloudFormation を利用して設定を試みました。

CloudFormation

  • テンプレート
AWSTemplateFormatVersion: '2010-09-09'
Description: Ec2 AutoScaling Overrides LaunchTemplateSpecification
Parameters:
  Ec2SubnetId:
    Type: List<AWS::EC2::Subnet::Id>
  Ec2ImageId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
  Ec2ImageIdArm64:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2
Resources:
  Ec2LaunchTemplateX86:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateData:
        ImageId: !Ref 'Ec2ImageId'
        InstanceType: t3.nano
  Ec2LaunchTemplateArm64:
    Type: AWS::EC2::LaunchTemplate
    Properties:
      LaunchTemplateData:
        ImageId: !Ref 'Ec2ImageIdArm64'
        InstanceType: t4g.nano
  Ec2InstanceAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier: !Ref 'Ec2SubnetId'
      DesiredCapacity: 9
      MinSize: 0
      MaxSize: 9
      MixedInstancesPolicy:
        InstancesDistribution:
          OnDemandBaseCapacity: 0
          OnDemandPercentageAboveBaseCapacity: 0
          SpotAllocationStrategy: lowest-price
          SpotInstancePools: 3
        LaunchTemplate:
          LaunchTemplateSpecification:
            LaunchTemplateId: !Ref 'Ec2LaunchTemplateX86'
            Version: !GetAtt 'Ec2LaunchTemplateX86.LatestVersionNumber'
          Overrides:
            - InstanceType: t3.micro
            - InstanceType: t3a.micro
            - LaunchTemplateSpecification:
                LaunchTemplateId: !Ref 'Ec2LaunchTemplateArm64'
                Version: !GetAtt 'Ec2LaunchTemplateArm64.LatestVersionNumber'
              InstanceType: t4g.micro

Overrides

「Overrides」設定として LaunchTemplateSpecification の指定が可能になりました。

    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      MixedInstancesPolicy:
        LaunchTemplate:
          Overrides:
            - InstanceType: t3.micro
            - InstanceType: t3a.micro
            - LaunchTemplateSpecification:
                LaunchTemplateId: !Ref 'Ec2LaunchTemplateArm64'
                Version: !GetAtt 'Ec2LaunchTemplateArm64.LatestVersionNumber'
              InstanceType: t4g.micro

SpotAllocationStrategy

SpotAllocationStrategy は「lowest-price」、当該アベイラビリティーゾーンのスポット価格が廉価な インスタンスを3種類組み合わせて利用する指定としました。

  • スポット価格

ARMアーキテクチャの「t4g」インスタンスの利用を意図して「lowest-price」を利用しましたが、 通常は「SpotAllocationStrategy: capacity-optimized」、 アベイラビリティーゾーンごとの利用可能なスポットキャパシティーに基づいて在庫の多いインスタンスを利用し、 リバランスも有効「CapacityRebalance: true」にして利用する事をおすすめします。

      MixedInstancesPolicy:
        InstancesDistribution:
          SpotAllocationStrategy: capacity-optimized
      CapacityRebalance: true

確認

東京リージョンのデフォルトVPCのセグメントを利用して CloudFormation でCreateStack を実施、 x86_64 と arm64、異なる AMI を利用する EC2インスタンス が、一つのオートスケールグループ配下で起動した事が確認できました。

まとめ

従来、複数の起動テンプレート毎に EC2オートスケーリンググループ設定を用意した場合、 CodeDeployなどの利用や稼働台数の管理が煩雑になるなどの課題がありましたが、シンプルな利用が可能になりました。

また、異なるCPUアーキテクチャを混在させた利用以外でも、 組み合わせるEC2インスタンス、インスタンスストアが利用可能な場合にローカルストレージ設定をUserDataで実施する場合や、 T2/T3 無制限オプション (CreditSpecification) 設定が望ましい場合にもご活用ください。