如何在AWS Lambda日志中打印CLI Payload的执行结果?
问题:如何让Lambda执行传入的CLI命令并将结果输出到日志?
我通过aws lambda invoke的--payload参数传递一条CLI命令给Lambda函数my_func,但现在只能得到{"status":"OK"}的返回结果,想知道怎么把这条CLI命令的执行结果打印到Lambda的日志里。
当前使用的本地调用脚本如下:
set -x ls aws sts get-caller-identity aws lambda invoke \ --function-name my_func \ --cli-binary-format raw-in-base64-out \ --payload '{"command":"/opt/awscli/aws sts decode-authorization-message --encoded-message '$1' --output text"}' \ --output text \ response.json
解决方案
1. 修改Lambda函数逻辑,捕获并输出命令执行结果
你的Lambda函数my_func目前只返回了状态,需要改成执行传入的命令、捕获输出、将结果写入日志的逻辑。以下是Python示例:
import subprocess import json import logging # 配置日志级别 logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): # 从payload中提取要执行的命令 command = event.get('command') if not command: logger.error("未收到要执行的命令") return {"status": "ERROR", "message": "No command provided"} try: # 执行命令并捕获标准输出/错误 result = subprocess.run(command, shell=True, capture_output=True, text=True) # 将输出写入Lambda日志 logger.info(f"命令执行结果:\n{result.stdout}") if result.stderr: logger.error(f"命令执行错误:\n{result.stderr}") # 同时可以把结果返回给调用端 return {"status": "OK", "stdout": result.stdout, "stderr": result.stderr} except Exception as e: logger.error(f"执行命令时发生异常:{str(e)}") return {"status": "ERROR", "message": str(e)}
2. 修复本地调用脚本的payload格式问题
原脚本中--payload的单引号嵌套可能导致shell解析异常,建议用文件传递payload避免转义问题:
set -x ls aws sts get-caller-identity # 生成JSON格式的payload文件 echo "{\"command\":\"/opt/awscli/aws sts decode-authorization-message --encoded-message '$1' --output text\"}" > payload.json # 用文件传递payload调用Lambda aws lambda invoke \ --function-name my_func \ --cli-binary-format raw-in-base64-out \ --payload file://payload.json \ --output text \ response.json
3. 查看Lambda日志
修改完成后,你可以通过两种方式查看日志:
- 登录AWS控制台,进入Lambda函数页面,点击「监控」→「日志」查看CloudWatch日志
- 使用AWS CLI命令实时查看:
aws logs tail /aws/lambda/my_func --follow
内容的提问来源于stack exchange,提问作者marcin2x4
相关产品推荐
相关产品推荐

