So führen Sie das ec2 UserData-Skript beim Cloudformation-Update aus
Ich habe ein ec2 userData-Skript, das Docker-Compose Pull and Up ausführt.
Ich möchte "aws cloudformation update-stack" ausführen und neue Docker-Images laden. Jedes Mal, wenn sich die Eigenschaft $ {imageTag} ändert.
Dies ist meine Cloudformationsinstanz yml:
myInstance:
Type: 'AWS::EC2::Instance'
Metadata:
'AWS::CloudFormation::Init':
configSets:
configs:
- "configDockers"
- "configOther"
configDocker:
commands:
a:
command: 'echo -e IMAGE_TAG=${imageTag} >> .env'
b:
command: 'docker-compose pull'
c:
command: 'docker-compose up'
Properties:
UserData:
Fn::Base64:
!Sub |
runcmd:
- /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region} -c configs
- /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region}
Ich habe versucht, "Docker-Compose Down" hinzuzufügen, alte Bilder im UserData-Skript zu entfernen und cloud_final_modules hinzuzufügen, um UserData bei jedem Start auszuführen:
myInstance:
Type: 'AWS::EC2::Instance'
Metadata:
'AWS::CloudFormation::Init':
configSets:
configs:
- "configDockers"
- "configOther"
configDocker:
commands:
a:
command: 'echo -e IMAGE_TAG=${imageTag} >> .env'
b:
command: 'docker-compose down'
c:
command: 'docker images -q | xargs -r sudo docker rmi'
d:
command: 'docker-compose pull'
e:
command: 'docker-compose up'
Properties:
UserData:
Fn::Base64:
!Sub |
#cloud-config
cloud_final_modules:
- [scripts-user, always]
runcmd:
- /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region} -c configs
- /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource myInstance --region ${AWS::Region}
Nach "aws cloudformation update-stack" wird das Skript jedoch nicht erneut ausgeführt, obwohl sich das imageTag geändert hat. Es wird nur ausgeführt, wenn ich einen Wert unter runcmd ändere.
Wie kann ich das UserData-Skript jedes Mal ausführen, wenn "aws cloudformation update-stack" ausgeführt wird (jedes Mal, wenn sich imageTag ändert)?
Wie kann ich einige UserData-Befehle nur beim ersten Start, andere Befehle bei jedem Neustart und andere Befehle beim Stoppen der Instanz ausführen?
Beispiel: Ich möchte "docker-compose down" nur beim Stoppen der Instanz ausführen , aber andere Befehle befehlen: "docker-compose pull / up" bei jedem Neustart der Instanz oder "aws cloudformation update-stack" und einige anfängliche Befehle nur beim ersten Setup .
Antworten
Wie kann ich einige UserData-Befehle nur beim ersten Start, andere Befehle bei jedem Neustart und andere Befehle beim Stoppen der Instanz ausführen?
Das kannst du nicht. UserDatasoll nur beim Start der Instanz ausgeführt werden, nicht beim Neustart, Starten oder Stoppen (eine der unten genannten Ausnahmen). Dazu müssen Sie alle diese Funktionen selbst implementieren.
Dies erfolgt üblicherweise durch die Definition von benutzerdefinierten Systemd-Unit- Dateien. Sie müssten also solche Unit-Dateien für Ihre Docker-Komposition erstellen.
Die einzige Ausnahme ist eine ziemlich hackige Art, Benutzerdaten beim Start der Instanz auszuführen, wie im letzten AWS-Blogbeitrag beschrieben:
- Wie kann ich Benutzerdaten verwenden, um bei jedem Neustart meiner Amazon EC2-Instanz automatisch ein Skript auszuführen?