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

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
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:
- den ec2 Volume Manager einsetzen
- von einer Instanz zu einer Auto-Skalierungsgruppe wechseln
- Rolling Updates für die Auto-Scaling-Gruppe aktivieren
- melden Sie CloudFormation einen erfolgreichen Start
- 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 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
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.
Unsere Ideen
Weitere Blogs
Contact


