【问题标题】:Cloudformation Attach instance to Auto scaling groupCloudformation 将实例附加到 Auto Scaling 组
【发布时间】:2020-08-14 15:32:01
【问题描述】:

在我的 CloudFormation 文件中,我创建了一个实例、一个启动配置和一个 Auto Scaling 组。

  LogstashInstance:
    Type: AWS::EC2::Instance
    Properties:
      IamInstanceProfile:
        Ref: LogstashInstanceProfile                 
      InstanceType: t2.micro
      KeyName: chuongtest
      ImageId: ami-0cd31be676780afa7
      UserData:
      SecurityGroupIds:
        - Ref: LogstashSecurityGroup
      SubnetId: subnet-0e5691582096fe1e6
      Tags:
        - Key: Name
          Value: Logstash Instance      
  LogstashLaunchConfiguration:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:  
      EbsOptimized: false
      IamInstanceProfile:
        Ref: LogstashInstanceProfile
      ImageId: ami-0cd31be676780afa7
      InstanceMonitoring: true
      InstanceType: t2.micro
      KeyName: chuongtest
      LaunchConfigurationName: LogstashLaunchConfiguration
      SecurityGroups: 
        - Ref: LogstashSecurityGroup
      UserData:                                          
  LogstashAutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties: 
      AutoScalingGroupName: LogstashAutoScalingGroup
      AvailabilityZones: 
        - ap-southeast-1b
      DesiredCapacity: 1        
      LaunchConfigurationName:
        Ref: LogstashLaunchConfiguration
      MaxSize: 1
      MinSize: 1
      Tags: 
        - Key: Name
          PropagateAtLaunch: "false"
          Value: Logstash ASG 
        - Key: Instances
          PropagateAtLaunch: "true"
          Value: Logstash

我的想法是创建一个实例,将其附加到 ASG 并使用 ASG 保持工作继续进行。 但此代码将启动 2 个实例。

第一个实例的用户数据与后面的实例不同,因此我无法删除该实例。

我查看了文档,但找不到任何有意义的东西。有没有办法在模板中配置,还是只有脚本?

【问题讨论】:

  • 您不能将实例“附加”到 ASG。您需要在 AWS::AutoScaling::LaunchConfiguration 中构建它。如果服务器上有您不能丢失的数据,您可以创建原始服务器的 AMI,在启动配置中使用该 AMI,然后在部署后删除 LogstashInstance。
  • link 我看到有一种方法可以将实例附加到 ASG,我可以从该实例创建 ASG。但我在 cloudformation 中找不到方法

标签: amazon-web-services amazon-ec2 amazon-cloudformation


【解决方案1】:

我查看了文档,但找不到任何有意义的东西。有没有办法在模板中配置,还是只有脚本?

没有意义,因为它不实用。 ASG 将仅从关联的AWS::AutoScaling::LaunchConfiguration 启动实例。因此,在 ASG 中“手动”附加实例没有多大意义。 ASG 将在失败时不会重新启动它。

如果“手动”附加的实例由于某种原因被终止,例如硬件故障,ASG会根据启动配置启动替换。

用户数据与后面的实例不同

在这种情况下,最好的办法是在您的UserData 中提供一些条件,这将确定要运行您的UserData 的哪个版本。

或者,只需两个 ASG。一个用于第一个实例,而另一个用于其余实例。

【讨论】:

  • 我可以手动将实例附加到 ASG,点击此链接docs.aws.amazon.com/autoscaling/ec2/userguide/… 我的想法是使用第一个用户数据启动第一个实例,将其放入 ASG,然后在第一次崩溃时启动后面的实例使用第二个用户数据。
  • @BlakeAsh 在您的 UserData 中,您使用 AWS CLI 或 SDK 以编程方式挂载卷。第一个实例,启动时会将卷附加到自身并安装它。然后当它被终止和替换时,第二个实例也会这样做。该过程将根据需要继续进行。
  • Yesss :(我怎么会忘记那样。非常感谢,我会做一个快速测试并告诉你结果
  • @BlakeAsh 哦。只需要确保卷和 ASG 在同一个 AZ 中。卷只有 AZ 范围。
  • 嗨@Marcin,你的建议使我的模板工作,所以它也让我的一天。非常感谢
【解决方案2】:

编辑

通过 cmets 讨论后,我强烈推荐使用 EFS 的方法,因为它专为您正在进行的工作负载设计而设计。

此外,它是多可用区与轮换单个 EBS 卷的方法,因为实例在自动扩展组中失败,如果可用区失败并可能导致数据丢失,这种方法将不会持续存在。

原创

如果第一个实例与其他实例不同,则应小心将其添加到自动缩放组(因为您希望它保持不变),尤其是在它如何处理实例替换方面。

自动缩放组旨在缩放通常不可变的类似实例,因此通过将您的主机置于此自动缩放组中,它将被视为其他主机之一。

Auto Scaling 组包含一组 Amazon EC2 实例,出于自动扩展和管理的目的,这些实例被视为逻辑分组。

如果您必须将其添加到自动缩放组,这是一般方法:

还要确保将 MinSizeDesiredCapacity 都设置为 0,以删除启动的任何额外实例。

正如我之前所说的如果可以避免,则不应将此实例添加到 ASG 中,tt 可能会导致混淆。

【讨论】:

  • 感谢您的回答。没什么不同。在第一个实例中,我挂载了一个 EBS 卷并使用它。当第一个死掉时,具有不同用户数据的下一个实例可以挂载剩余的 EBS 卷并继续该过程。
  • 您是否可以不共享 EFS 挂载,这样您可以使用 1 个实例自动扩展但始终使用共享的 EFS 挂载? :)
  • 是的,EFS 是第二选择,因为它的价格。但是如果我不能使用 EBS,我将更改为 EFS。但我认为我可以通过一些脚本来使用 EBS,但我想找到一个正式的方式
  • 好吧,我的意思是我个人会选择 EFS,因为脚本更少,而且它旨在让您的实例不可变。另一个优点是 EFS 是多可用区,而 EBS 方法是在单个可用区中。如果 AZ 出现故障,您可能会失去您所拥有的 :(
  • 是的,克里斯,EFS 是一种更简单的方法。我想我会在这一天之后使用它,但现在我会尽力而为:D
猜你喜欢
  • 2016-10-29
  • 2023-04-08
  • 2016-12-25
  • 2018-07-27
  • 2018-07-11
  • 2019-11-02
  • 2018-09-22
  • 2013-03-28
  • 2022-09-29
相关资源
最近更新 更多