我想在 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 policy 以限制哪些用户可以通过 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-config 和 text/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 实例,并验证脚本是否正确运行。
相关信息
启动时在 Linux 实例上运行命令
启动时在 Windows 实例上运行命令
AWS Systems Manager Automation
用户数据格式