AWS Lambda调用Invoke-Command时PowerShell脚本无法执行问题
问题原因
- 本地路径残留说明
报错中出现的本地Windows路径是打包工具生成启动文件时嵌入的调试符号信息,属于打包过程的正常残留,和运行时错误没有关联,不需要针对该路径做处理。 - 核心报错触发原因
- 你当前使用的是默认Linux环境的PowerShell Lambda运行时,当脚本调用
Invoke-Command时会自动加载PSWSMan依赖模块,该模块在Linux环境下依赖大量系统原生组件(如krb5、gssapi库等),Lambda默认Linux运行时未预装这些依赖,同时旧版本的AWS.Tools.PowerShellLambda打包工具存在遗漏.NET运行时ref目录的问题,直接触发/var/runtime/ref路径不存在的报错。 Invoke-Command依赖WinRM协议,目标Workspaces实例的安全组需要开放5985/5986端口允许Lambda侧的访问请求,你当前未提及相关安全组配置,也可能是后续连通性的潜在问题。- 你为Lambda分配弹性IP属于无效配置,Lambda访问VPC内网资源不需要公网IP,弹性IP仅用于公网入方向访问Lambda的场景,你当前场景下不需要该配置。
解决方案
方案一(推荐,稳定性更高):替换Invoke-Command为SSM RunCommand
你部署的目标就是安装SSM Agent,可直接通过SSM远程命令接口完成操作,无需配置WinRM,安全性和稳定性更高:
- 为Lambda执行角色添加如下权限:
ssm:SendCommand、ssm:GetCommandInvocation、ec2:DescribeNetworkInterfaces - 替换脚本中的
Invoke-Command逻辑,改用Send-SSMCommand接口向目标Workspaces实例下发安装命令,只要目标实例已配置SSM IAM权限即可执行。
方案二(适配原有Invoke-Command逻辑):切换Lambda运行时为Windows环境
- 首先升级本地的PowerShell Lambda打包工具到最新版本,修复ref目录遗漏问题:
Update-Module AWS.Tools.PowerShellLambda -Force
- 重新发布Lambda时指定Windows运行时,原生支持WinRM和
Invoke-Command,无需额外配置依赖:
Publish-AWSPowerShellLambda -ScriptPath .\Demo.ps1 -Name Demo -Region eu-west-1 -Runtime provided.al2 -Architecture x86_64 -HostOS Windows
- 配置Workspaces实例的安全组,入方向开放5985(HTTP WinRM)或5986(HTTPS WinRM)端口,允许Lambda关联的安全组访问。
额外优化建议
- 不要在脚本中明文存储账号密码,可将凭证存入AWS Secrets Manager,Lambda运行时通过接口动态读取,避免敏感信息泄露。
- 移除Lambda的弹性IP配置,只要Lambda所在VPC子网配置了NAT网关可访问公网下载SSM Agent安装包即可,不需要公网入方向地址。
内容的提问来源于stack exchange,提问作者Himanshu Vaish
相关产品推荐
相关产品推荐

