AWS Lambda无返回值问题:Slack交互式响应场景排查
AWS Lambda处理Slack交互式响应无返回日志问题排查
我在开发Slack应用时,用AWS Lambda处理Slack的交互式响应(要求3秒内返回结果)。代码里用Event类型调用另一个Lambda,并且明确返回return {"statusCode": 200},但CloudWatch日志里看不到返回值记录——Lambda执行无异常,就是找不到返回内容。
主Lambda函数代码
import logging from urllib.parse import parse_qs import utils.slack.client as slack from functions.flows.update_zendesk_ticket import pass_to_pso from lambda_warmer.lambda_warmer import lambda_warmup from utils.common import invoke_lambda, PSO_NOC_ALERTS logger = logging.getLogger() logger.setLevel(logging.DEBUG) @lambda_warmup() def lambda_handler(event, context): logger.info(f'this is the event: {event}') logger.info(f'this is the context: {context}') params = dict(parse_qs(event['body'], keep_blank_values=False)) if "payload" in params: payload = eval(params["payload"][0].replace('false', 'False').replace('null', 'None').replace('true', 'True')) if payload["type"] == "message_action": logger.info(f'{payload["user"]["username"]} clicked on {payload["view"]["callback_id"]}') elif payload["type"] == "view_submission": logger.debug(payload) logger.info(f'{payload["user"]["username"]} submitted {payload["view"]["callback_id"]}') submitted_data = payload["view"]["state"]["values"] logger.info(submitted_data) if payload["view"]["callback_id"] == "pass_to_pso": result = pass_to_pso_handler(submitted_data) return result return {"statusCode": 200} def pass_to_pso_handler(submitted_data): pso_slack_id = submitted_data["pso"]["pso_select-action"]["selected_user"] slack_client = slack.SlackClient() pso_email = slack_client.get_email_from_slack(pso_slack_id) zd_ticket_id = submitted_data["ticket_id"]["ticket_id-action"]["value"] thread_link = submitted_data["thread_link"]["thread_link-action"]["value"] reply_language = submitted_data["reply_language"]["reply_language-action"]["selected_option"][ "value"] reply_type = submitted_data["reply_type"]["reply_type-action"]["selected_option"]["value"] pass_to_pso(pso_email=pso_email, ticket_id=zd_ticket_id, thread_link=thread_link, reply_language=reply_language, reply_type=reply_type) pso_name = pso_email.split('@')[0] invoke_lambda({ "pso": pso_name, "ticket id": zd_ticket_id, "channel_id": PSO_NOC_ALERTS }, "Event") return {"statusCode": 200}
Lambda调用工具函数代码
def invoke_lambda(payload, invocation_type): client = boto3.client('lambda', 'us-east-1') response = client.invoke( FunctionName=SLACK_MESSAGE_LAMBDA, InvocationType=invocation_type, Payload=bytes(json.dumps(payload), encoding='utf8'))
CloudWatch日志截图

问题原因及解决办法
- Lambda默认不记录返回值:AWS Lambda不会自动把函数返回值写入CloudWatch日志,只有通过
logger显式输出的内容才会被记录。你代码里仅返回了响应对象,但没打印它,所以日志里看不到。 - 添加日志语句输出返回值:在两个返回响应的位置,先打印再返回,比如:
在lambda_handler末尾修改为:
在response = {"statusCode": 200} logger.info(f"主函数返回响应: {response}") return responsepass_to_pso_handler末尾修改为:response = {"statusCode": 200} logger.info(f"Pass-to-PSO处理函数返回响应: {response}") return response - 异步调用额外提醒:用
Event类型调用的Lambda是异步执行,主函数不会等待其完成,若被调用Lambda出问题,需单独查看它的CloudWatch日志,这和当前返回值日志缺失无关,但需注意排查逻辑。 - 确认日志级别:当前日志级别设为
DEBUG,info级别的打印会被记录,后续若调整日志级别,要确保返回值的日志语句级别不会被过滤。
内容的提问来源于stack exchange,提问作者Tomer Oszlak
相关产品推荐
相关产品推荐

