因为平常主要是使用 EC2 的 Linux 实例,所以之前写过的一篇关于 UserData 的日志 创建 AWS EC2 实例时 userdata 的一些知识 默认就是讲的有关 Linux 实例的 UserData。本文补充上 Windows 的 EC2 实例 UserData 的基本使用,参考自 AWS 官方文档 Run commands on your Windows instance at launch。
Windows 的 UserData 被谁执行,依据所选择 AMI 的不同有以下三种方式
- EC2Launch v2: 最新方式,只是被当前预览版的 AMI 所支持,它支持 YAML 配置的脚本
- EC2Launch: 当前方式,Windows Server 2016 及更新版
- EC2Cofnig: 旧有方式, Windows Sever 2012 R2 及旧版本
UserData 脚本的语法
可支持 batch, PowerShell, 或 YAML 配置(EC2Launch), 和 Linux 下的 UserData 要求 Shebang(#!) 类似,Windows 的 UserData 中必须用标签来指定是何种脚本方式。如果 UserData 中同时声明有 <script>
和 <powershell>
, 那么总是先执行 <script>
, 再执行 <powershell>
, 与它们的声明先后顺序无关。
batch 脚本
1 2 3 4 |
<script> echo batch scripts .... </script> <persist>true</persist> |
<persist>
是可选的,默认为 false, 即 userdata 只在初始化实例时运行一次,persist 为 true 是则在实例重启时也被执行
PowerShell 脚本
1 2 3 4 |
<powershell> New-Item test.txt -ItemType file </powershell> <persist>true</persist> |
PowerShell 中除了能执行 batch 脚本外,还有更强大的功能。<persist>
的功用与上相同
YAML 配置脚本
如果 UserData 由 EC2Launch v2 来执行,就可用 YAML 方式来配置脚本
1 2 3 4 5 6 7 8 9 10 |
version: 1.0 tasks: - task: executeScript inputs: - frequency: always type: powershell runAs: localSystem content: |- $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file |
frequency
的 once
, 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 进行的更新后在重启后得到执行
- 配置
<persist>true</persist>
或frequency
为 always - EC2Launch: 运行
C:\ProgramData\Amazon\EC2-Windows\Launch\Scripts\InitializeInstance.ps1 –Schedule
启用调度任务 - Ec2Config: 运行
C:\Program Files\Amazon\Ec2ConfigService\Ec2ConfigServiceSetting.exe
,然后开启
PowerShell 的一些工具
除了直接使用 awscli 外,可直接使用 PowerShell 下的 AWS Tools, 参考 AWS Tools for PowerShell Cmdlet Reference。其实就是以 PowerShell 的方式来使用 awscli。
1 2 3 |
<powershell> Copy-S3Object -BucketName test-bucket -Key abc/test.txt -LocalFile test.txt </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 运行时
1 2 |
Invoke-WebRequest -Uri https://aka.ms/vs/17/release/vc_redist.x64.exe -OutFile vc_redist.x64.exe ` Start-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
1 2 3 |
Set-ExecutionPolicy Bypass -Scope Process -Force; ` [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; ` iex ((New-Object System.Net.WebClient).DownloadString('https://vcredist.com/install.ps1')) |
执行 PowerShell 前设置以下几个选项很有必要
1 2 3 |
$ErrorActionPreference = "Stop" # 出现错误时不执行后续的脚本 $ProgressPreference = 'SilentlyContinue' # 不显示操作的进度,如下载,解压大文件时 $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 Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。