AWS EC2实例停止/终止上的触发事件

use*_*492 3 bash centos amazon-s3 amazon-web-services aws-cli

当 EC2 实例停止/终止时,是否有某种方法可以触发事件(例如运行脚本将一些日志推送到 S3)?

我已经研究过使用 /usr/lib/systemd/system 中的服务触发脚本,但我还没有遇到任何运气。我听说可以在触发服务之前关闭实例上的网络功能,如果属实,这可能就是脚本无法正确执行的原因。

use*_*492 6

所以答案并不是 AWS 特定的,但它现在对我有用(在 EC2 实例停止和终止上进行测试)。

  1. 我创建了一个 system.d 服务文件:

/usr/lib/systemd/system/my_shutdown.service

[Unit]
Description=my_shutdown Service
Before=shutdown.target reboot.target halt.target
Requires=network-online.target network.target

[Service]
KillMode=none
ExecStart=/bin/true
ExecStop=/path/to/my_script.sh
RemainAfterExit=yes
Type=oneshot

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)
  1. 将此服务添加到 multi-user.target:

systemctl enable my_shutdown.service

或者,您可以手动创建符号链接:

ln -s /usr/lib/systemd/system/my_shutdown.service /etc/systemd/system/multi-user.target.wants/my_shutdown.service

  1. 启动服务并通过停止/终止实例进行测试。

systemctl start my_shutdown.service

我的理解:

  • 描述:对我们服务的描述。
  • 之前:我们希望我们的服务在这些目标启动之前停止。
  • 要求:我们的服务需要网络能力可用。在我们的服务启动/停止之前不得停止这些目标。
  • 杀戮模式:无;不要杀死我们的进程。
  • 执行启动:/bin/true;一个不执行任何操作但返回成功的命令。服务启动时运行。
  • ExecStop:要运行的脚本。当服务停止时运行。
  • RemainAfterExit:即使所有进程都退出,我们的服务仍处于活动状态。
  • 类型:单发;预计该进程必须在 systemd 启动后续单元之前退出。
  • WantedBy:我们想要添加服务的目标。

参考:

  1. https://www.freedesktop.org/software/systemd/man/systemd.service.html
  2. https://www.freedesktop.org/software/systemd/man/systemd.kill.html#
  3. https://www.freedesktop.org/software/systemd/man/systemd.special.html
  4. https://www.freedesktop.org/software/systemd/man/systemd.target.html