通过Lambda启动Windows EC2时Powershell Userdata未执行求助
问题原因及修复方案
- 核心问题:缺少Base64编码处理
AWS EC2的UserData参数要求传入Base64编码后的内容,直接传入原始字符串会导致EC2服务端无法正确解析,是本次脚本未执行的最核心原因。 - 次要排查点:代码缩进异常(粘贴场景大概率为格式丢失)
你贴出的代码中ec2.run_instances调用不在lambda_handler函数作用域内,若实际运行代码也是该写法,会导致函数触发时未执行传入UserData的实例创建逻辑,如果你确认实例能正常启动,可忽略该点,仅排查编码问题。 - 可选优化:避免脚本前导冗余空格+补充执行权限
原始init_script中每行PowerShell代码带大量前导缩进,同时可补充PowerShell执行策略设置,避免权限限制导致脚本执行失败。
修正后的代码示例
#!/usr/bin/python # -*- coding: utf-8 -*- import os import boto3 import base64 AMI = os.environ["AMI"] INSTANCE_TYPE = os.environ["INSTANCE_TYPE"] KEY_NAME = os.environ["KEY_NAME"] SUBNET_ID = os.environ["SUBNET_ID"] REGION = os.environ["REGION"] ec2 = boto3.client("ec2", region_name=REGION) def lambda_handler(event, context): init_script = '''<powershell> Set-ExecutionPolicy Unrestricted -Force $USERNAME="Latchu" $PASSWORD="eM2An@ydxk" net user /add $USERNAME $PASSWORD </powershell>''' # 手动对UserData做Base64编码 encoded_script = base64.b64encode(init_script.encode('utf-8')).decode('utf-8') instance = ec2.run_instances( ImageId=AMI, InstanceType=INSTANCE_TYPE, KeyName=KEY_NAME, SubnetId=SUBNET_ID, MaxCount=1, MinCount=1, InstanceInitiatedShutdownBehavior="terminate", UserData=encoded_script, )
后续排查方法
如果修改后仍未执行,可登录Windows实例查看UserData执行日志定位问题,日志路径为:C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log
内容的提问来源于stack exchange,提问作者Lakshminarayanan S
相关产品推荐
相关产品推荐

