Come eseguire lo script ec2 UserData sull'aggiornamento di cloudformation
Ho lo script ec2 userData che esegue il pull and up di docker-compose.
Voglio eseguire "aws cloudformation update-stack" e caricare nuove immagini Docker. Ogni volta che la proprietà $ {imageTag} cambia.
Questa è la mia istanza cloudformation 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}
Ho provato ad aggiungere "docker-compose down", rimuovere vecchie immagini nello script UserData e aggiungere cloud_final_modules per eseguire UserData ad ogni avvio:
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}
Ma dopo "aws cloudformation update-stack", lo script non viene più eseguito nonostante il tag di immagine modificato. funziona solo se cambio qualche valore sotto runcmd.
Come posso eseguire lo script UserData ogni volta che "aws cloudformation update-stack" è in esecuzione (ogni volta che imageTag cambia)?
Come posso eseguire alcuni comandi UserData solo al primo avvio, altri comandi a ogni riavvio e altri comandi all'istanza di arresto?
ad esempio: voglio eseguire "docker-compose down" solo all'arresto dell'istanza, ma altri comandi comando: "docker-compose pull / up" al riavvio di ogni istanza o "aws cloudformation update-stack" e alcuni comandi iniziali solo alla prima configurazione .
Risposte
Come posso eseguire alcuni comandi UserData solo al primo avvio, altri comandi a ogni riavvio e altri comandi all'istanza di arresto?
Non puoi. UserDataè pensato per essere eseguito solo all'avvio dell'istanza, non al riavvio, all'avvio o all'arresto (un'eccezione menzionata di seguito). Per fare ciò, devi implementare tu stesso tutte queste funzionalità.
Questo è comunemente fatto attraverso la definizione di file di unità systemd personalizzati . Quindi dovresti creare tali file di unità per il tuo docker-compose.
L'unica eccezione è, un modo piuttosto hacker, di eseguire i dati utente all'avvio dell'istanza descritto nel recente post del blog AWS:
- Come posso utilizzare i dati dell'utente per eseguire automaticamente uno script a ogni riavvio della mia istanza Amazon EC2?