You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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)

验证方法

  1. 先在Lambda中打印tagvalues的值,确认你查询的EC2实例都配置了Environment标签,否则tagvalues会为空,传到SSM也会是空值。
  2. 可以在SSM文档的PowerShell脚本开头加一行Write-Host "传入的keyvalue值为: {{ keyvalue }}",执行完成后在SSM控制台的命令历史中查看对应命令的输出,即可确认参数是否传递成功。

内容的提问来源于stack exchange,提问作者Manoj Paritala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:39:01