Blog

So aktualisieren Sie eine EC2-Instanz mit Volume-Anhängen mit CloudFormation

Mark van Holsteijn

Mark van Holsteijn

Aktualisiert Oktober 21, 2025
4 Minuten

Wie aktualisieren Sie eine EC2-Instanz mit Volume-Anhängen mit CloudFormation? Wenn Sie in Ihrer Infrastruktur einen Stateful-Server haben, dem ein weiteres Volume angehängt ist, macht es die Ressource AWS::EC2::VolumeAttachment unmöglich, die Instanz zu aktualisieren. In diesem Blog zeige ich Ihnen, wie Sie Volume-Attachments so konfigurieren, dass die Instanz mit Hilfe einer Auto-Scaling-Gruppe und dem EC2 Volume Manager aktualisiert werden kann. Wenn Sie versuchen, ein AWS::EC2::VolumeAttachment zu aktualisieren, gibt CloudFormation den folgenden Fehler aus:

ERROR: Update to resource type AWS::EC2::VolumeAttachment is not supported.

Dies hindert Sie daran, das AMI oder andere Eigenschaften zu aktualisieren, die einen Austausch der Instanz erfordern. Ich habe dieses Problem gelöst, indem ich die Ressourcendefinition des zustandsabhängigen Rechners in eine auto-skalierende Gruppe für eine einzelne Instanz geändert habe und das EC2 Volume Manager-Dienstprogramm verwendet habe, um beim Start von Instanzen dynamisch Volumes zuzuordnen. Um dies zu implementieren, müssen Sie:

  1. den ec2 Volume Manager einsetzen
  2. von einer Instanz zu einer Auto-Skalierungsgruppe wechseln
  3. Rolling Updates für die Auto-Scaling-Gruppe aktivieren
  4. melden Sie CloudFormation einen erfolgreichen Start
  5. ec2 Volume Manager-Tags an Volumes und Instanzen anhängen

Setzen Sie den EC2-Volumenmanager ein

Stellen Sie die ec2-volume-manager mit den folgenden Befehlen bereit:

git clone https://github.com/binxio/ec2-volume-manager.git
cd ec2-ec2-volume-manager
aws cloudformation deploy 
        --capabilities CAPABILITY_IAM 
        --stack-name ec2-volume-manager 
        --template ./cloudformation/ec2-volume-manager.yaml

Ändern Sie die Instanz in eine Gruppe mit automatischer Skalierung

Ändern Sie die Definition Ihrer Persistenzinstanz von einer AWS::EC2::Instance zu einer auto-skalierenden Einzelinstanzgruppe. Von:

StatefulServer:
  Type: AWS::EC2::Instance
  Properties:
    SubnetId: !Select [0, !Ref 'Subnets']
    LaunchTemplate:
      LaunchTemplateId: !Ref 'LaunchTemplate'
      Version: !GetAtt 'LaunchTemplate.LatestVersionNumber'

zu:

AutoScalingGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AutoScalingGroupName: !Ref AWS::StackName
      VPCZoneIdentifier:
        - !Select [0, !Ref 'Subnets']
      LaunchTemplate:
        LaunchTemplateId: !Ref 'LaunchTemplate'
        Version: !GetAtt 'LaunchTemplate.LatestVersionNumber'
      MinSize: '0'
      MaxSize: '1'
      DesiredCapacity: '1'

Rollendes Update aktivieren

Weisen Sie CloudFormation an, ein rollierendes Update durchzuführen, um die Instanzen zu ersetzen:

AutoScalingGroup:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    ...
    UpdatePolicy:
      AutoScalingRollingUpdate:
        MinInstancesInService: 0
        MaxBatchSize: 1
        WaitOnResourceSignals: true

Wenn die Instanz ersetzt werden muss, aktualisiert CloudFormation die automatische Skalierungsgruppe, indem es zuerst die alte Instanz zerstört und dann eine neue Instanz erstellt.

Signalisieren Sie einen erfolgreichen Start

CloudFormation wird warten, bis die Instanz meldet, dass sie erfolgreich gestartet wurde. Dies geschieht durch das cfn-Signal am Ende der Boot-Befehle in der Startvorlage.

LaunchTemplate:
  Type: AWS::EC2::LaunchTemplate
  Properties:
    ...
    UserData: !Base64
      Fn::Sub: |
        bootcmd:
          ...
          -  /opt/aws/bin/cfn-signal --stack ${AWS::StackName} --resource AutoScalingGroup

Ohne dieses Signal wird die Aktualisierung zurückgenommen.

Anbringen von Tags an Volumes und Instanzen

Das Dienstprogramm EC2 Volume Manager fügt Volumes automatisch an Instanzen mit denselben Tag-Werten an. Wenn eine Instanz mit dem Tag den Status running erreicht, werden alle Volumes mit demselben Tag-Wert angehängt. Wenn die Instanz gestoppt oder beendet wird, werden alle Volumes mit dem Tag ec2-volume-manager-attachments von ihr abgetrennt. Damit der Volume Manager funktioniert, markieren Sie die Volumes der Instanz wie folgt:

  Disk1:
    Type: AWS::EC2::Volume
    Properties:
      AvailabilityZone: !Sub '${AWS::Region}a'
      Size: 8
      Tags:
        - Key: ec2-volume-manager-attachment
          Value: stateful-instance-1
        - Key: device-name
          Value: xvdf

Beachten Sie, dass der Volume Manager auch das Tag device-name benötigt, das sich auf den Gerätenamen des Volumes für das Betriebssystem bezieht. Als Nächstes fügen Sie die ec2-volume-manager-attachments zur Gruppe für die automatische Skalierung hinzu:

AutoScalingGroup:
  Type: AWS::AutoScaling::AutoScalingGroup
  Properties:
    ...
    Tags:
      - Key: ec2-volume-manager-attachment
        Value: stateful-instance-1
        PropagateAtLaunch: true

Das ist alles, was erforderlich ist, um vollautomatische Updates eines zustandsabhängigen Servers mit angeschlossenen Volumes zu ermöglichen. Sie können alle Unterschiede sehen, wenn Sie die CloudFormation-Vorlage des zustandsabhängigen Servers mit der Vorlage für die ec2-volume-manager-Lösung vergleichen.

Bereitstellen der Demo

Eine Demo ist verfügbar. Setzen Sie sie mit ein:

export VPC_ID=$(aws ec2  
                --output text 
                --query 'Vpcs[?IsDefault].VpcId' describe-vpcs)
export SUBNET_IDS=$(aws ec2 describe-subnets --output text 
                --filters Name=vpc-id,Values=$(VPC_ID) 
                          Name=default-for-az,Values=true 
                --query 'join(,,sort_by(Subnets[?MapPublicIpOnLaunch], &AvailabilityZone)[*].SubnetId)')

aws cloudformation deploy 
        --capabilities CAPABILITY_NAMED_IAM 
        --stack-name ec2-volume-manager-demo 
        --template ./cloudformation/demo-stack.yaml 
        --parameter-overrides VPC=$VPC_ID Subnets=$SUBNET_IDS

Fazit

Wenn Sie einen Stateful-Server mit einem weiteren Volume in Ihrer Infrastruktur haben, ist es mit der Ressource AWS::EC2::VolumeAttachment nicht möglich, die Instanz zu aktualisieren. Wenn Sie jedoch eine einzelne Instanz mit automatischer Skalierung in Kombination mit dem EC2 Volume Manager verwenden, können Sie dies tun!Wenn Sie möchten, können Sie auch eine statische IP-Adresse an Ihre Stateful-Instanz anhängen. Stellen Sie sicher, dass Sie die ebs-Volumes beim Booten ordnungsgemäß einbinden.

Alternative Lösungen

Obwohl wir immer empfehlen, Ihre EC2-Instanzen zustandslos zu halten und wann immer möglich verwaltete persistente Dienste zu verwenden, haben wir den EC2-Volume-Manager erfolgreich für IBM MQ- und Microsoft SQL Server-Instanzen eingesetzt. Wenn Sie die Magie des EC2-Volume-Managers nicht mögen, können Sie die Volumes auch im Boot-Skript der persistenten Instanz anhängen.

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.