从Lambda函数向SSM传递参数后文档变量为空的问题求解
问题原因及修复方案
你当前的实现逻辑是正确的,参数为空的核心原因是SSM文档中引用传入参数的语法错误,SSM不会自动识别PowerShell变量里的参数名,需要用SSM规定的占位符语法先做参数替换。
具体修复步骤
步骤1:修改SSM文档的参数引用语法
SSM 2.2版本文档中,要引用你定义的parameters块里的参数,必须使用{{ 参数名 }}的占位符格式,SSM执行脚本前会先把该占位符替换为你从Lambda传入的实际值,再下发到EC2执行PowerShell脚本。
你需要把SSM文档中runCommand里的代码:
$s3Folder = "$keyvalue" #e.g. PRO1
修改为:
$s3Folder = "{{ keyvalue }}" #e.g. PRO1
修改完成后的完整SSM文档示例:
{ "schemaVersion": "2.2", "description": "SSM document to transfer SQL bak files from EC2 to S3", "parameters": { "keyvalue": { "type": "String", "description": "S3 bucket folder EX: PRO1" } }, "mainSteps": [ { "action": "aws:runPowerShellScript", "name": "example", "inputs": { "runCommand": [ "# Constants", "$sourceDrive = \"C:\\\"", "$sourceFolder = \"MSSQL\\BACKUP\"", "$sourcePath = $sourceDrive + $sourceFolder", "$s3Bucket = \"transferec2tos3\"", "$s3Folder = \"{{ keyvalue }}\" #e.g. PRO1", "# 后续添加拷贝到S3的逻辑即可" ] } } ] }
步骤2:(可选优化)修复Lambda中命令结果获取的逻辑
你当前代码中调用send_command后立刻调用list_command_invocations,此时命令还未下发执行,大概率获取不到正确的执行结果,建议添加轮询逻辑等待命令执行完成后再查结果,示例逻辑:
# 发送命令后增加轮询等待 time.sleep(3) while True: output = ssm.list_command_invocations( CommandId=command_id, InstanceId=instanceid ) if output['CommandInvocations']: status = output['CommandInvocations'][0]['Status'] if status not in ['Pending', 'InProgress', 'Delayed']: break time.sleep(5)
验证方法
- 先在Lambda中打印
tagvalues的值,确认你查询的EC2实例都配置了Environment标签,否则tagvalues会为空,传到SSM也会是空值。 - 可以在SSM文档的PowerShell脚本开头加一行
Write-Host "传入的keyvalue值为: {{ keyvalue }}",执行完成后在SSM控制台的命令历史中查看对应命令的输出,即可确认参数是否传递成功。
内容的提问来源于stack exchange,提问作者Manoj Paritala
相关产品推荐
相关产品推荐

