LiJell's 성장기

EC2 Auto Scaling Multiple Launch Templates 본문

Cloud

EC2 Auto Scaling Multiple Launch Templates

All_is_LiJell 2023. 12. 29. 19:01
반응형

개요

나는 ECS capacity provider를 Fargate에서 Spot Instance로 전환 중이였고, 안정성을 위한 EC2 Auto Scaling Multiple Launch Templates을 적용하며 겪은 내용을 정리해봤다.

문제점

ECS capacity provider를 EC2 spot instance로 전환하면서 안정성을 위해 multiple launch templates을 사용하고자 했습니다.

하지만, ARM architecture family instance만 적용이 되고 X86 architecture family instance는 찾아볼 수 없었습니다.

그에 대한 원인은 MixedInstancesPolicy configureation의 오류였습니다.

원인

작업은 Terraform에서 이루어졌지만, 설명을 위해 AWS Docs 기준으로 함께 보시죠.

Before

{
  "AutoScalingGroupName":"my-asg",
  "MixedInstancesPolicy":{
    "LaunchTemplate":{
      "LaunchTemplateSpecification":{
        "LaunchTemplateName":"my-launch-template-for-x86",
        "Version":"$Latest"
      },
      "Overrides":[
        {
          "InstanceType":"c6g.*",
          "LaunchTemplateSpecification": {
            "LaunchTemplateName": "my-launch-template-for-arm",
            "Version": "$Latest"
          }
        }
      ]
    },
    "InstancesDistribution":{
      "OnDemandBaseCapacity": 1,
      "OnDemandPercentageAboveBaseCapacity": 50,
      "SpotAllocationStrategy": "capacity-optimized"
    }
  },
  "MinSize":1,
  "MaxSize":5,
  "DesiredCapacity":3,
  "VPCZoneIdentifier":"subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782",
  "Tags":[ ]
}
  • 위 코드 블록을 보시면, Overrides에 InstanceType을 c6g.*로 주었습니다. 제가 기대한 것은 Graviton Instance의 LaunchTemplateName으로 my-launch-template-for-arm로 적용되고, 그 외 값들은 x86이 적용될 것으로 기대했지만, 말 그대로 Override기 때문에 기대와는 달랐습니다. 모두 Gravition Instance만 적용됐죠. 

해결 방법

After

{
  "AutoScalingGroupName":"my-asg",
  "MixedInstancesPolicy":{
    "LaunchTemplate":{
      "LaunchTemplateSpecification":{
        "LaunchTemplateName":"my-launch-template-for-x86",
        "Version":"$Latest"
      },
      "Overrides":[
        {
          "InstanceType":"c6g.*",
          "LaunchTemplateSpecification": {
            "LaunchTemplateName": "my-launch-template-for-arm",
            "Version": "$Latest"
          }
        },
        {
          "InstanceType":"c5.*"
        },
        {
          "InstanceType":"c5a.*"
        }
      ]
    },
    "InstancesDistribution":{
      "OnDemandBaseCapacity": 1,
      "OnDemandPercentageAboveBaseCapacity": 50,
      "SpotAllocationStrategy": "capacity-optimized"
    }
  },
  "MinSize":1,
  "MaxSize":5,
  "DesiredCapacity":3,
  "VPCZoneIdentifier":"subnet-5ea0c127,subnet-6194ea3b,subnet-c934b782",
  "Tags":[ ]
}
  • 즉, 변경 후에는 Overrides에 X86 architecture family instance에 대한 type을 따로 명시 해줬고, 해당 instance type에 대한 LaunchTemplateSpecification은 override되지 않았기 때문에 default 값이 적용되는 겁니다.
"LaunchTemplateSpecification":{
        "LaunchTemplateName":"my-launch-template-for-x86",
        "Version":"$Latest"
      },

결론

Multiple Launch Templates를 위해서 Overrides를 사용할 땐 원하는 architecture family instance type에 override하고싶은 LaunchTemplateSpecification을 명시해줘야 합니다. 즉 Overrides에 명시하지 않은 내용은 최상단에 명시해둔 default값을 따르게 됩니다.

반응형
Comments