如何在云初始化阶段通过AWS cloudformation用户数据bash脚本安装并启动服务?

如何在云初始化阶段通过AWS cloudformation用户数据bash脚本安装并启动服务?,bash,amazon-web-services,amazon-cloudformation,cloud-init,sysv,Bash,Amazon Web Services,Amazon Cloudformation,Cloud Init,Sysv,我需要在我的EC2实例上添加一个shutdownhook来完成一些资源清理工作 此外,出于测试目的,我还可以手动启动和停止实例,我希望启动和关闭挂钩的触发方式与初始引导时相同 然后我决定通过Cloudformation bash脚本在AWS EC2 Ubuntu 16.04 LTS实例上安装一个脚本作为服务 以下是该脚本的第一个简单版本: UserData: "Fn::Base64": !Sub - | #!/usr/bin/env bash

我需要在我的EC2实例上添加一个shutdownhook来完成一些资源清理工作

此外,出于测试目的,我还可以手动启动和停止实例,我希望启动和关闭挂钩的触发方式与初始引导时相同

然后我决定通过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
我再次测试了它,并在这个修复后的bootstrap.log文件中看到了“在XXX上启动”日志。 但是当我试图在控制台中停止实例时,bootstrap.log文件中没有出现“SHUTDOWN on XXX”日志

我登录实例并尝试手动启动/停止脚本。。。所有的启动和关闭日志都显示为8-O。然后我认为,由于boostrap脚本未被标识为init脚本,因此不会在实例stop或terminate上调用stop回调。。。(如果这是错误的,告诉我;-)

然后,我从AWS控制台多次启动和停止实例,启动和关闭消息仍然出现在日志中。 这证实了我的假设。日志仅在第一次初始化和关机循环中丢失

所以我做了一些奇怪和丑陋的事情。。。我将最后一行开始命令替换为以下命令:

reboot -n 
该脚本现在可以按照我的需要工作了,但我认为应该有一种更干净的方法来启用我的init脚本,或者至少在cloudinit期间的关闭阶段启用脚本,而无需重新启动

是否有人对此问题有最佳解决方案或更多细节


PS:我尝试了
init u
telinit u
而不是重新启动,但没有成功

原因似乎是引导程序不是第一次作为服务启动的。它作为普通脚本运行。请尝试向用户数据中添加以下行,而不是
${BOOTSTRAP\u SCRIPT\u PATH}start

sudo service ${BOOTSTRAP_SCRIPT_NAME} start
sudo service ${BOOTSTRAP_SCRIPT_NAME} start