【问题标题】:Cloudformation - How to reference the instance-id of an EC2 instance if the instance has been created using an Auto Scaling Group and a Launch ConfigCloudformation - 如果实例是使用 Auto Scaling 组和启动配置创建的,如何引用 EC2 实例的实例 ID
【发布时间】:2020-06-11 15:13:11
【问题描述】:

我正在尝试创建一个 EBS 卷并将其附加到我的 EC2 实例。该实例有自己的 Auto Scaling 组和启动配置。我希望如果此实例变得不正常并终止,EBS 卷应自动附加到由 Auto Scaling 组启动的新实例。挂载命令在启动配置中,所以这不是问题。

这是我的代码:

Influxdbdata1Asg:
 Type: 'AWS::AutoScaling::AutoScalingGroup'
 Properties:
  TargetGroupARNs:
    - !Ref xxxx
  VPCZoneIdentifier:
    - !GetAtt 'NetworkInfo.PrivateSubnet1Id'
  LaunchConfigurationName: !Ref yyyy
  MinSize: 1
  MaxSize: 1
  DesiredCapacity: 1
Data1:
 Type: AWS::EC2::Volume
 DeletionPolicy: Retain
 Properties:
  Size: !Ref 'DataEbsVolumeSize'
  AvailabilityZone: !GetAtt 'NetworkInfo.PrivateSubnet1Id'
  Tags:
    - Key: Name
      Value: !Join 
        - '-'
        - - !Ref 'AWS::StackName'
          - data1
Attachdata1:
 Type: AWS::EC2::VolumeAttachment
 Properties:
  InstanceId: !Ref ????
  VolumeId: !Ref Data1
  Device: /dev/xvdb

【问题讨论】:

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


    【解决方案1】:

    很遗憾,您不能这样做:

    Attachdata1:
     Type: AWS::EC2::VolumeAttachment
     Properties:
      InstanceId: !Ref ????
      VolumeId: !Ref Data1
      Device: /dev/xvdb
    

    原因是 ASG 正在启动实例,您不会有它的想法。

    附加必须在 CloudFormation 之外完成,因为无法预先知道将来的实例 ID。正如其他答案提到的生命周期挂钩。

    或者甚至更好地使用独立于 ASG 的存储,例如 EFS,它会在实例启动和终止之间自动保持,并且可以由多个实例挂载。

    【讨论】:

      【解决方案2】:

      对于这个问题,您特别希望使用Lifecycle Hooks,它会在实例终止或启动时触发。

      为此,您的生命周期挂钩将通知您的 SNS 通知,然后该通知将调用 Lambda 函数。此 Lambda 函数将在确认生命周期操作完成之前执行更改。

      有一篇关于这个here的博客文章。

      您的问题提到了 CloudFormation,但这仍将涉及触发操作的生命周期挂钩。您将需要一个具有 AWS::EC2::VolumeAttachment 资源的 CloudFormation 堆栈。 Lambda 需要更新堆栈中的“InstanceId”属性才能执行此更改。

      【讨论】:

        猜你喜欢
        • 2021-02-09
        • 2016-10-29
        • 2021-08-25
        • 2013-03-28
        • 2014-08-09
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 2016-12-25
        相关资源
        最近更新 更多