x86とarm64用の起動テンプレートを混在させたEC2オートスケール環境をCloudFormationで試してみた
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) 設定が望ましい場合にもご活用ください。