リソースのクリーンアップを行うために、EC2 インスタンスにシャットダウン フックを追加する必要がありました。
さらに、テスト目的でインスタンスを手動で開始および停止することもでき、最初のブートストラップと同じ方法で起動フックとシャットダウン フックをトリガーする必要がありました。
次に、Cloudformation bash スクリプトを介して AWS EC2 Ubuntu 16.04 LTS インスタンスにスクリプトをサービスとしてインストールすることにしました。
スクリプトの最初の単純なバージョンは次のとおりです。
UserData:
"Fn::Base64":
!Sub
- |
#!/usr/bin/env bash
BOOTSTRAP_SCRIPT_NAME=bootstrap
BOOTSTRAP_SCRIPT_PATH=/etc/init.d/${BOOTSTRAP_SCRIPT_NAME}
cat > /etc/init.d/boostrap <<EOF
### BEGIN INIT INFO
# Provides: ${BOOTSTRAP_SCRIPT_NAME}
# Required-Start: \\\$local_fs \\\$remote_fs \\\$network \\\$syslog \\\$named
# Required-Stop: \\\$local_fs \\\$remote_fs \\\$network \\\$syslog \\\$named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Bootstrap an instance
# Description: Bootstrap an instance
### END INIT INFO
function start() {
echo "STARTUP on $(date)"
}
function stop() {
echo "SHUTDOWN on $(date)"
}
case "\$1" {
start)
start | tee -a /var/log/${BOOTSTRAP_SCRIPT_NAME}.log
;;
stop)
stop | tee -a /var/log/${BOOTSTRAP_SCRIPT_NAME}.log
;;
}
EOF
chmod +x ${BOOTSTRAP_SCRIPT_PATH}
update-rc.d -f ${BOOTSTRAP_SCRIPT_NAME} remove
update-rc.d ${BOOTSTRAP_SCRIPT_NAME} defaults
このバージョンでは、ブートストラップ スクリプトは開始されません。
ブートストラップ スクリプトが cloud-init フェーズ中にインストールされ、ちなみに Linux sysv の init フェーズ中にインストールされ、現在の init フェーズには参加しないことがすぐにわかりました... (これが間違っている場合は教えてください ;-))
次に、cloudformation bash の例の apache2 など、手動で開始することにしました。スクリプトの最後に次の行を追加しました。
${BOOTSTRAP_SCRIPT_PATH} start
再度テストしたところ、この修正後、bootstrap.log ファイルに「STARTUP on XXX」というログが記録されていました。しかし、コンソールでインスタンスを停止しようとすると、bootstrap.log ファイルに「XXX でのシャットダウン」ログが表示されませんでした...
インスタンスにログインし、スクリプトを手動で開始/停止しようとしました...すべての起動ログとシャットダウン ログが 8-O. 次に、boostrap スクリプトが init スクリプトとして識別されなかったため、インスタンスの停止または終了時に停止コールバックが呼び出されないと想定しました ... (これが間違っている場合は教えてください ;-))
次に、AWS コンソールからインスタンスを数回開始および停止しましたが、STARTUP および SHUTDOWN メッセージの両方がログに表示されたままです。これは私の仮説を確認しました。ログは、最初の初期化およびシャットダウン サイクル中にのみ失われます。
だから私は奇妙で醜いことをしました...最後の行の開始コマンドを次のコマンドに置き換えます:
reboot -n
スクリプトは必要に応じて機能するようになりましたが、スクリプトを初期化または少なくとも cloud-init 中のシャットダウン フェーズで再起動せずに有効にする、よりクリーンな方法が必要だと思います ...
誰かが問題の最善の解決策または詳細を持っていますか?
PS:再起動する代わりに試しinit u
てみましたが、成功しませんでしたtelinit u