Di organisasi saya, kami memiliki sejumlah AMI dasar yang mudah digunakan untuk berbagai layanan seperti ECS dan Docker. Karena banyak proyek kami melibatkan CloudFormation, kami menggunakan cfn-bootstrap
, yang terdiri dari beberapa skrip dan layanan yang berjalan saat boot untuk menginstal paket tertentu dan melakukan tugas manajemen konfigurasi tertentu untuk kami.
Saat memulai sistem, setara dengan skrip berikut harus dijalankan:
#!/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
Saya berpikir untuk menjalankan ini sebagai oneshot
layanan systemd yang berjalan After=network.target
dan WantedBy=multi-user.target
.
Satu-satunya masalah adalah bahwa saya ingin AMI saya fleksibel dan hanya menjalankan ini jika ada file tertentu. Daripada menanamkan skrip di atas ke dalam data pengguna EC2, saya dapat meminta data pengguna hanya mendefinisikan file lingkungan yang mendefinisikan variabel yang saya butuhkan dan hanya menjalankan layanan satu-shot saya jika file lingkungan itu ada:
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
Apakah ada cara untuk membuat systemd hanya menjalankan layanan jika kondisi tertentu terpenuhi?
while
kondisi, tetapiif
, yang berarti bahwa jika jalan yang ditentukan dalamConditionPathExists
tidak ada pada saat layanan dimulai sisa layanan hanya tidak akan berjalan. Yaitu, tidak menunggu jalan ada.