跳至内容

如何在重启或启动实例时在现有 Amazon EC2 Windows 实例上运行命令?

2 分钟阅读
0

当我重启或启动现有的 Amazon Elastic Compute Cloud (Amazon EC2) Windows 实例时,我想在该实例上运行自定义脚本。

简短描述

要在启动或重启 EC2 实例时运行命令,请配置用户数据脚本,使其在重启或启动实例时运行。

根据您的操作系统 (OS),您的配置使用以下代理来处理用户数据:

  • Windows Server 2012 R2 及更早版本使用 EC2Config。
  • Windows Server 2016 和 2019 使用 EC2Launch。
  • Windows Server 2022 和 2025 使用 EC2Launch v2。

**注意:**要使用 Amazon EC2 控制台更新实例的用户数据,您必须停止该实例。但是,对于 EC2Launch v2,您可以使用 YAML 脚本在不停止和启动的情况下更新实例。

解决方法

(仅限 EC2Launch v2)使用 YAML 脚本更新您的实例,无需停止和启动

使用远程桌面协议 (RDP) 连接到您的 Windows 实例。

要在每次重启时运行脚本,请更新 agent-config.yml 文件。将 executeScript 任务添加到 stage: postReady,并将 frequency 设置为 always。

YAML 文件示例:

version: "1.0"
config:
  - stage: boot
    tasks:
      - task: extendRootPartition
  - stage: preReady
    tasks:
      - task: activateWindows
        inputs:
          activation:
            type: amazon
      - task: setDnsSuffix
        inputs:
          suffixes:
            - $REGION.ec2-utilities.amazonaws.com
      - task: setAdminAccount
        inputs:
          password:
            type: random
      - task: setWallpaper
        inputs:
          attributes:
            - hostName
            - instanceId
            - privateIpAddress
            - publicIpAddress
            - ipv6Address
            - instanceSize
            - availabilityZone
            - architecture
          path: C:\Windows\Web\Wallpaper\Windows\img0.jpg
  - stage: postReady
    tasks:
      - task: startSsm
      - task: executeScript
        inputs:
          - frequency: always
            type: powershell
            runAs: localSystem
            content: |-
                New-Item -Path 'C:\PowerShellTest.txt' -ItemType File

要仅在下次实例重启时运行脚本,请打开 C:\ProgramData\Amazon\EC2Launch\state,然后删除 .run-once 文件。更新 agent-config.yml 文件,将 executeScript 任务添加到 stage: postReady,并将 frequency 设置为 once。

**重要事项:**当您删除 .run-once 文件时,实例的本地管理员密码将在重启时发生更改。如果您在启动实例时没有密钥对,或者丢失了密钥对,则重启时您可能会失去对实例的访问权限。

有关命令语法的更多信息,请参阅 YAML 配置脚本的语法。

配置实例以进行停止和启动

**注意:**当停止或启动某个实例时,该实例的公有 IP 地址将发生变化。最佳做法是使用弹性 IP 地址(而不是公有 IP 地址)将外部流量路由到您的实例。如果您使用的是 Amazon Route 53,则在公有 IP 地址发生变化时可能需要更新 Route 53 DNS 记录。停止和启动与实例重启不同。有关详细信息,请参阅 EC2 实例停止和启动的工作原理。

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

更新实例的用户数据

将您的命令作为脚本添加到实例的用户数据中。有关如何配置脚本以在每次重启时运行的信息,请参阅在后续重启或启动时运行脚本。

**注意:**要在 EC2Launch v2 每次启动或重启时运行脚本,请添加 YAML 脚本作为 executeScript 任务或添加 XML 脚本。对于 YAML,请将 frequency 设置为 always;对于 XML 脚本,请添加 <persist>true</persist> 标签。对于所有代理,请将用户数据包含在定义命令是在命令提示符还是 Windows PowerShell 中运行的标签内。有关命令语法的更多信息,请参阅 Windows PowerShell 脚本的语法。

对问题进行故障排除

要对问题进行故障排除,请检查 EC2Config、EC2Launch 或 EC2Launch v2 日志文件中的标准输出和标准错误流。

要查找日志文件,请检查以下位置:

  • 对于 EC2Config,请检查 C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2Config.log。
  • 对于 EC2Launch,请检查 C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log。
  • 对于 EC2Launch v2,请检查 C:\ProgramData\Amazon\EC2Launch\log\agent.log。

相关信息

如何在启动新的 EC2 Windows 实例时运行命令?

AWS 官方已更新 8 个月前