AWS user-data HTTP端点返回异常?如何查看真实用户数据?
问题:Spinnaker流水线注入Windows EC2实例UserData异常排查
我正在调试一个Spinnaker流水线,它无法向Windows EC2实例正确注入UserData。测试时,我使用一段简单的Base64编码UserData脚本启动实例:
<powershell> write-output "Running userdata-test script" </powershell>
在实例内查询UserData HTTP端点时返回如下内容:
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data powershell ---------- ...
但日志文件显示该脚本已实际运行:
2023/04/08 01:49:27Z: Begin user data script process. 2023/04/08 01:49:27Z: Unable to parse <persist> tags. This can happen when tags are unmatched or poorly formed. 2023/04/08 01:49:27Z: Sending telemetry bool: IsUserDataScheduledPerBoot 2023/04/08 01:49:27Z: Unregister the scheduled task to persist user data. 2023/04/08 01:49:31Z: Unable to parse <runAsLocalSystem> tags. This can happen when tags are unmatched or poorly formed. 2023/04/08 01:49:31Z: Unable to parse <script> tags. This can happen when tags are unmatched or poorly formed. 2023/04/08 01:49:31Z: Unable to parse <powershellArguments> tags. This can happen when tags are unmatched or poorly formed. 2023/04/08 01:49:31Z: <powershell> tag was provided.. running powershell content 2023/04/08 01:49:35Z: Message: The output from user data script: Running userdata-test script 2023/04/08 01:49:35Z: User data script completed.
请问这是HTTP端点的Bug吗?有没有其他可靠方法查看真实的UserData?
解答
这不是HTTP端点的Bug。Windows EC2的UserData处理服务(EC2Config或EC2Launch)会在执行脚本后,修改元数据端点返回的内容——只保留标签结构,清空脚本具体内容,这是设计行为,目的是避免脚本中的敏感信息重复暴露。
以下是几种查看真实UserData的可靠方法:
查看EC2服务本地日志
你已经获取的日志文件(路径根据实例使用的服务不同有所区别:EC2Config对应C:\Program Files\Amazon\EC2ConfigService\Logs\Ec2ConfigLog.txt,EC2Launch对应C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log)会完整记录执行的脚本内容和输出,从你的日志可以确认脚本确实正常运行。检查本地缓存的UserData文件
EC2服务会把原始UserData缓存到本地:- 若使用EC2Config:查看
C:\Program Files\Amazon\EC2ConfigService\Settings\Config.xml,其中包含Base64编码的UserData,解码后即可看到原始内容; - 若使用EC2Launch:直接查看
C:\ProgramData\Amazon\EC2-Windows\Launch\Config\userdata,文件内是未编码的原始脚本。
- 若使用EC2Config:查看
通过AWS CLI从服务端查询
在拥有对应实例权限的机器上执行以下命令,直接从AWS服务端拉取实例创建时注入的原始UserData,不受实例本地修改影响:aws ec2 describe-instance-attribute --instance-id <你的实例ID> --attribute userData --output text --query 'UserData.Value' | base64 --decode
内容的提问来源于stack exchange,提问作者Elliott B
相关产品推荐
相关产品推荐

