AWS Windows EC2 实例的 userdata 应用笔记

因为平常主要是使用 EC2 的 Linux 实例,所以之前写过的一篇关于 UserData 的日志 创建 AWS EC2 实例时 userdata 的一些知识 默认就是讲的有关 Linux 实例的 UserData。本文补充上 Windows 的 EC2 实例 UserData 的基本使用,参考自 AWS 官方文档 Run commands on your Windows instance at launch

Windows 的 UserData 被谁执行,依据所选择 AMI 的不同有以下三种方式

  1. EC2Launch v2: 最新方式,只是被当前预览版的 AMI 所支持,它支持 YAML 配置的脚本
  2. EC2Launch: 当前方式,Windows Server 2016 及更新版
  3. EC2Cofnig: 旧有方式, Windows Sever 2012 R2 及旧版本

UserData 脚本的语法

可支持 batch, PowerShell, 或 YAML 配置(EC2Launch), 和 Linux 下的 UserData 要求 Shebang(#!) 类似,Windows 的 UserData 中必须用标签来指定是何种脚本方式。如果 UserData 中同时声明有 <script><powershell>, 那么总是先执行 <script>, 再执行 <powershell>, 与它们的声明先后顺序无关。

batch 脚本

1<script>
2echo batch scripts ....
3</script>
4<persist>true</persist>

<persist> 是可选的,默认为 false, 即 userdata 只在初始化实例时运行一次,persist 为 true 是则在实例重启时也被执行

PowerShell 脚本

1<powershell>
2New-Item test.txt -ItemType file
3</powershell>
4<persist>true</persist>

PowerShell 中除了能执行 batch 脚本外,还有更强大的功能。<persist> 的功用与上相同

YAML 配置脚本

如果 UserData 由 EC2Launch v2 来执行,就可用 YAML 方式来配置脚本
 1version: 1.0
 2tasks:
 3- task: executeScript
 4  inputs:
 5  - frequency: always
 6    type: powershell
 7    runAs: localSystem
 8    content: |-
 9      $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
10      New-Item $file -ItemType file

frequencyonce, always 取值与前面的 <persist> false, true 是一致的。

UserData 执行的日志

日志是非常重要的,同样根据发起执行者的不同而记录在不同的位置。注:C:\ProgramData 是一个隐藏目录。

EC2Launch v2: C:\ProgramData\Amazon\EC2Launch\log\agent.log

EC2Launch: C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log

EC2Config: C:\Program Files\Amazon\Ec2ConfigService\Logs\EC2Config.log

每次启动(含重启)都执行 UserData

希望每次都执行 UserData, 或在实例初始化后对 UserData 进行的更新后在重启后得到执行

  1. 配置 <persist>true</persist>frequency 为 always
  2. EC2Launch: 运行 C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 –Schedule 启用调度任务
  3. Ec2Config: 运行 C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe,然后开启

PowerShell 的一些工具

除了直接使用 awscli 外,可直接使用 PowerShell 下的 AWS Tools, 参考 AWS Tools for PowerShell Cmdlet Reference。其实就是以 PowerShell 的方式来使用 awscli。
1<powershell>
2Copy-S3Object -BucketName test-bucket -Key abc/test.txt -LocalFile test.txt
3</powershell>

不过对于用习惯了 awscli 的人来说,PowerShell 的对象操作方式有点罗嗦。

其他

对于 Windows 的实例我仍然是延续着非必要不进入它的远程桌面,所以通常是用 AWS SSM 连接到 Windows EC2 实例的 PowerShell,Linux 可参考 AWS Session Manager 管理 EC2 实例。连接 Windows 的 Session Manager 也类似,两个基本条件,SSM Agent + 有 AmazonSSMManagedInstanceCore 策略的 Instance Profile. 连接用
$ aws ssm start-session --target  <INSTANCE_ID>
有些 Windows AMI 会配置 ssh

点击该链接进入 PowerShell 命令参考

查看 Windows 系统信息

systeminfo
而且在 PowerShell 中 cat, rm, curl/wget 等命令也能直接使用,它们映射到了 Get-Content, Remove-Item 和 Invoke-WebRequest 命令。更多的 GNU 命令还有待以后发掘。

下载和安装 VC 运行时

1Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vc_redist.x64.exe -OutFile vc_redist.x64.exe `
2Start-Process -filepath vc_redist.x64.exe -ArgumentList "/install", "/passive", "/norestart", "/log log.txt" -Passthru | wait-process

Get-VcList 的安装参考 VcRedist docs/Quick install, 如果上面安装的 vc_redist 没效的话,可以试下 VcRedist
1Set-ExecutionPolicy Bypass -Scope Process -Force; `
2 [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; `
3 iex ((New-Object System.Net.WebClient).DownloadString('https://vcredist.com/install.ps1'))

执行 PowerShell 前设置以下几个选项很有必要
1$ErrorActionPreference = "Stop"                          # 出现错误时不执行后续的脚本
2$ProgressPreference = 'SilentlyContinue'                 # 不显示操作的进度,如下载,解压大文件时
3$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'  # 重定向 >, 或管道操作 | 用 Out-File 时的默认字符集,否则可能为 UTF16-LE

想要用其他的  Linux 命令也没问题
choco install awk grep sed wget curl -y
永久链接 https://yanbin.blog/aws-windows-ec2-instance-userdata-note/, 来自 隔叶黄莺 Yanbin's Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。