如何在每次重新启动 Amazon EC2 实例时利用用户数据来自动执行脚本?

上次更新时间:2020 年 4 月 16 日

我想在 Amazon Elastic Compute Cloud (Amazon EC2) 实例每次重启时使用用户数据执行脚本。该如何操作?

简短描述

默认情况下,用户数据脚本和 cloud-init 指令仅在 EC2 实例启动的第一个引导周期内运行。但是,您可以使用 MIME 多部分文件配置自己的用户数据脚本和 cloud-init 指令。MIME 多部分文件允许您的脚本覆盖 cloud-init 包中用户数据的执行频率。然后,此文件执行该用户脚本。 有关 MIME 多部分文件的更多信息,请参阅 cloud-init 网站上的 MIME 多部分文件

解决方法

警告:在开始执行此操作之前,请查看以下信息:

1.    确保在 EC2 实例上安装了最新版本的 cloud-init 且正常运行。

2.    出于安全原因,请创建 IAM 策略以限制哪些用户可以通过 ModifyInstanceAttribute API 添加或删除用户数据。

3.    打开 Amazon EC2 控制台

4.    停止您的实例

5.    依次选择操作实例设置查看/更改用户数据

6.    将您的用户脚本复制到查看/更改用户数据框,然后选择保存

以下示例是一个 Shell 脚本,将“Hello World”写入 testfile.txt 文件(位于 /tmp 目录中)。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [scripts-user, always]

--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"

#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//

默认情况下,cloud-init 每次仅允许用户数据使用一种内容类型。但是,此示例显示的是 MIME 多部分文件中的 text/cloud-configtext/x-shellscript 两种内容类型。

text/cloud-config 内容类型可以覆盖 cloud-init 包中用户数据的执行频率,方法是将 SCRIPTS-USER 参数设为 ALWAYS

text/x-shellscript 内容类型可以提供将通过 cloud-init cloud_final_modules 模块执行的实际用户脚本。在此示例中,只有一行要执行,即 /bin/echo "Hello World." >> /tmp/testfile.txt

注意:请将行 /bin/echo "Hello World." >> /tmp/testfile.txt 替换为要在实例启动期间执行的 Shell 脚本。

7.    重新启动您的 EC2 实例,并验证脚本是否正确执行。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?