我想在每次 Amazon Elastic Compute Cloud (Amazon EC2) 实例重启时使用用户数据运行脚本。
简短描述
默认情况下,用户数据命令和 cloud-init 指令仅在 EC2 实例启动的第一个启动周期内运行。要覆盖此配置,请使用多用途互联网邮件扩展 (MIME) 多部分文件来配置您的用户数据命令和 cloud-init 指令。有关详细信息,请参阅 Cloud-init 网站上的 MIME multi-part archive(Mime 多部分存档)。然后,将文件添加到您的实例。
**注意:**您可以查看任何实例的实例用户数据。但是,要更新实例用户数据,必须停止实例。
解决方法
配置实例以进行停止和启动
**注意:**当停止或启动某个实例时,该实例的公有 IP 地址将发生变化。最佳实践是使用弹性 IP 地址(而不是公有 IP 地址)将外部流量路由到您的实例。如果您使用的是 Amazon Route 53,则在公有 IP 地址发生变化时可能需要更新 Route 53 DNS 记录。停止和启动与实例重启不同。有关详细信息,请参阅 How EC2 instance stop and start works(EC2 实例停止和启动的工作原理)。
在停止和启动实例之前,请执行以下操作:
将您的实例配置为在每次重启时运行脚本
完成以下步骤:
- 确保您在实例上安装了最新版本的 cloud-init。要查看最新的 cloud-init 版本,请参阅 GitHub 网站上的 Releases · canonical/cloud-init(版本 · canonical/cloud-init)。
- 验证您的用户或角色的 AWS Identity and Access Management (IAM) 策略是否具有 ec2:ModifyInstanceAttribute 权限。有关修改 IAM 策略的步骤,请参阅 Edit IAM policies (console)(编辑 IAM 策略(控制台))。
- 停止实例。
- 打开 Amazon EC2 控制台。
- 选择 Instances(实例),然后选择您的实例
- 选择 Actions(操作),然后选择 Instance settings(实例设置)。
- 选择 Edit user data(编辑用户数据),然后将您的用户命令作为 MIME 多部分文件输入:
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="cloud-config.txt"
#!/bin/bash
/bin/echo "Hello World" >> /tmp/testfile.txt
--//--
**注意:**将 /bin/echo "Hello World" >> /tmp/testfile.txt 部分替换为您要在实例启动时运行的 shell 命令。前面的命令示例将 Hello World 写入 /tmp 目录下的 testfile.txt 文件。通过 MIME 多部分文件,您可以同时向用户数据添加多种内容类型。前面的命令同时使用 text/cloud-config 和 text/x-shellscript 内容类型。将 scripts-user 参数设置为 always,这样 text/cloud-config 内容类型就会覆盖用户数据在 cloud-init 包中运行的频率。text/x-shellscript 内容类型提供了运行 cloud-init cloud_final_modules 模块的用户命令。
- 选择 Save(保存)。
- 启动您的实例,然后验证您的脚本是否能够运行。
**注意:**如果您的脚本未按预期运行,请查看 /var/log/cloud-init-output.log 文件以获取可用于调试脚本的信息。有关详细信息,请参阅 cloud-init 网站上的 How to debug cloud-init(如何调试 cloud-init)。
相关信息
Run commands when you launch an EC2 instance with user data input(在启动包含用户数据输入的 EC2 实例时运行命令)
如何在新 EC2 Windows 实例启动时运行命令?
如何在重启或启动实例时在现有 EC2 Windows 实例上运行命令?
cloud-init 网站上的 User-data formats(用户数据格式)