Dans mon organisation, nous avons un certain nombre d'AMI de base simples à utiliser pour différents services tels que ECS et Docker. Étant donné que beaucoup de nos projets impliquent CloudFormation, nous utilisons cfn-bootstrap
, qui se compose de quelques scripts et d'un service qui s'exécute au démarrage pour installer certains packages et effectuer certaines tâches de gestion de la configuration pour nous.
Au démarrage d'un système, un équivalent du script suivant doit être exécuté:
#!/bin/bash
# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"
# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
cfn-signal -e $returncode -r "$output"
exit $returncode
fi
# otherwise, signal success
cfn-signal -s
Je pensais à exécuter cela comme un oneshot
service systemd qui fonctionne After=network.target
et WantedBy=multi-user.target
.
Le seul problème est que j'aimerais que mon AMI soit flexible et ne l'exécute que si un certain fichier existe. Plutôt que d'incorporer le script ci-dessus dans les données utilisateur EC2, je peux demander aux données utilisateur de simplement définir un fichier d'environnement qui définit les variables dont j'ai besoin et d'exécuter mon service one-shot si ce fichier d'environnement existe:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Existe-t-il un moyen de faire en sorte que systemd n'exécute un service que si une condition donnée est remplie?
while
condition, mais uneif
, ce qui signifie que si le chemin spécifié dansConditionPathExists
n'existe pas au moment où le service démarre, le reste du service ne s'exécutera tout simplement pas. C'est-à-dire qu'il n'attend pas que le chemin existe.