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

如何通过AWS Lambda带参数运行YAML格式SSM运行文档

问题场景
  • 基于Python运行时的AWS Lambda环境,调用boto3的ssm.send_command接口携带参数运行YAML格式SSM文档时,即使运行Hello World示例也会抛出如下错误:

"errorMessage": "An error occurred (InvalidParameters) when calling the SendCommand operation: document TestMessage does not support parameters."

  • 相同调用逻辑下JSON格式的SSM文档可正常运行,初步判断问题和参数传递格式有关。但目标文档包含较长的PowerShell脚本,JSON格式要求将全部脚本压缩为单行,操作成本极高,同时不希望通过S3存储桶调用脚本,需要找到可直接从Lambda携带参数运行YAML格式SSM文档的可行方案。
根本原因

该报错和文档的YAML/JSON格式本身无关,触发InvalidParameters的核心原因是创建的YAML格式SSM文档没有在顶层parameters段定义可接收的入参字段,SSM默认会拦截所有未提前声明的参数传递,直接抛出参数不支持的错误。

可行方案

方案1:正确声明YAML文档参数段(优先推荐,无额外依赖)

YAML原生支持多行文本块语法,不需要把PowerShell脚本压缩为单行,只要按SSM文档规范显式声明所有入参即可正常调用。

标准YAML格式SSM文档示例

---
schemaVersion: '2.2'
description: 支持传入PowerShell脚本的自定义文档
parameters:
  # 所有需要通过send_command传入的字段必须在此处提前声明
  ExecutionScript:
    type: String
    description: 待执行的PowerShell脚本内容
mainSteps:
- action: aws:runPowerShellScript
  name: RunScript
  inputs:
    timeoutSeconds: '300'
    runCommand:
    - "{{ ExecutionScript }}"

Lambda侧调用代码示例

import boto3

ssm_client = boto3.client('ssm')
# 长段PowerShell脚本直接用三引号定义,保留原有换行格式即可,无需压缩为单行
ps_script = '''
Write-Host "Hello World"
Get-Service
# 此处可写入任意长度的PowerShell逻辑,不需要做转义或换行处理
'''

resp = ssm_client.send_command(
    InstanceIds=['i-替换为你的目标实例ID'],
    DocumentName='TestMessage',
    Parameters={
        # SSM的Parameters字段值必须为列表类型,即使传单个值也要用数组包裹
        'ExecutionScript': [ps_script]
    }
)

注意事项:

  • send_command接口的Parameters字段对应值必须是列表类型,单值传参会触发格式错误
  • YAML文档中所有需要外部传入的字段,必须在顶层parameters块声明对应类型和描述,缺省任意字段声明都会触发参数不支持报错
  • YAML的多行语法天然支持保留文本换行,无论是把脚本直接写在文档内,还是作为参数传入,都不需要做单行压缩处理

方案2:文档内置固定脚本,仅传动态参数(适合脚本逻辑固定场景)

如果PowerShell脚本的主体逻辑固定,仅少部分变量需要动态传入,不需要把整段脚本作为参数传递:直接把完整的多行PowerShell脚本写在YAML文档的runCommand段,仅将需要动态调整的变量声明为参数即可,既降低参数传递成本,也完全不需要压缩脚本。
对应的YAML文档示例:

---
schemaVersion: '2.2'
description: 固定脚本逻辑仅传动态参数示例
parameters:
  OutputMsg:
    type: String
    description: 自定义输出的消息内容
mainSteps:
- action: aws:runPowerShellScript
  name: RunFixedLogic
  inputs:
    timeoutSeconds: '180'
    runCommand:
    - Write-Host "脚本开始执行"
    - Write-Host "传入的自定义消息:{{ OutputMsg }}"
    - # 后续任意长度的固定PowerShell逻辑,直接按原有换行格式编写即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:01:33