私の組織では、ECSやDockerなどのさまざまなサービス用の使いやすい基本AMIを多数用意しています。私たちのプロジェクトの多くはCloudFormationを使用しcfn-bootstrap
ているため、ブート時に実行されて特定のパッケージをインストールし、特定の構成管理タスクを実行する2つのスクリプトとサービスで構成されるを使用しています。
システムの起動時に、次のスクリプトと同等のスクリプトを実行する必要があります。
#!/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
私はsystemdにこれを実行していることを考えていたoneshot
実行されるサービスAfter=network.target
とWantedBy=multi-user.target
。
唯一の問題は、AMIを柔軟にして、特定のファイルが存在する場合にのみこれを実行することです。上記のスクリプトをEC2ユーザーデータに埋め込むのではなく、必要な変数を定義する環境ファイルをユーザーデータで定義し、その環境ファイルが存在する場合にのみ、ワンショットサービスを実行できます。
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
与えられた条件が満たされた場合にのみsystemdがサービスを実行するようにする方法はありますか?
while
条件ではなく、if
です。つまり、で指定されたパスConditionPathExists
がサービスの開始時に存在しない場合、サービスの残りの部分は実行されません。つまり、パスが存在するのを待ちません。