跳至内容

如何在每次 Amazon EC2 Linux 实例重启时使用用户数据自动运行脚本?

2 分钟阅读
0

我想在每次 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 实例停止和启动的工作原理)。

在停止和启动实例之前,请执行以下操作:

将您的实例配置为在每次重启时运行脚本

完成以下步骤:

  1. 确保您在实例上安装了最新版本的 cloud-init。要查看最新的 cloud-init 版本,请参阅 GitHub 网站上的 Releases · canonical/cloud-init(版本 · canonical/cloud-init)。
  2. 验证您的用户或角色的 AWS Identity and Access Management (IAM) 策略是否具有 ec2:ModifyInstanceAttribute 权限。有关修改 IAM 策略的步骤,请参阅 Edit IAM policies (console)(编辑 IAM 策略(控制台))。
  3. 停止实例
  4. 打开 Amazon EC2 控制台
  5. 选择 Instances(实例),然后选择您的实例
  6. 选择 Actions(操作),然后选择 Instance settings(实例设置)。
  7. 选择 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-configtext/x-shellscript 内容类型。将 scripts-user 参数设置为 always,这样 text/cloud-config 内容类型就会覆盖用户数据在 cloud-init 包中运行的频率。text/x-shellscript 内容类型提供了运行 cloud-init cloud_final_modules 模块的用户命令。
  8. 选择 Save(保存)。
  9. 启动您的实例,然后验证您的脚本是否能够运行。
    **注意:**如果您的脚本未按预期运行,请查看 /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(用户数据格式)

AWS 官方已更新 6 个月前