如何通过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
相关产品推荐
相关产品推荐

