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

AWS Lambda目标函数未触发:主函数异步调用配置问题

解决方案

问题根源

CloudFront触发Lambda(包括Lambda@Edge)时默认是同步调用模式。你之前在主Lambda里配置的「异步调用目的地(子Lambda)」,仅当主Lambda被异步调用(比如CLI用--invocation-type Event参数)时,AWS才会自动触发子Lambda。但CloudFront是同步调用主Lambda,因此该配置无法生效。

解决步骤

1. 为主Lambda添加调用权限

确保主Lambda的IAM角色拥有调用子Lambda的权限,在角色的权限策略中添加以下内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:你的区域:你的账号ID:function:子Lambda函数名"
        }
    ]
}

2. 修改主Lambda代码,主动异步调用子Lambda

在主Lambda代码中使用AWS SDK主动发起异步调用,无论主Lambda是同步还是异步触发,都能触发子Lambda。修改后的代码示例:

const https = require("https");
const AWS = require("aws-sdk");
const lambda = new AWS.Lambda();

exports.handler = async (event, context, callback) => {
    // 异步调用子Lambda,不等待执行结果
    try {
        await lambda.invoke({
            FunctionName: "你的子Lambda函数名", // 也可使用完整ARN
            InvocationType: "Event", // 指定异步调用类型
            Payload: JSON.stringify({ event, context }) // 传递参数给子Lambda
        }).promise();
    } catch (err) {
        console.error("调用子Lambda失败:", err);
        // 仅记录日志,不影响主流程(符合你不需要返回值的需求)
    }

    await post("https://example.com/notify", {
        type: "viewer-response",
        event,
        context,
    });

    let response = "";
    try {
        response = event.Records[0].cf.response;
    } catch (e) {
        response = event; // 调试用
    }

    return response;
};

3. 额外注意事项

  • 如果主Lambda是Lambda@Edge,子Lambda需部署在支持Lambda@Edge的区域(如us-east-1),或为主Lambda配置跨区域调用权限。
  • Lambda运行时默认集成AWS SDK,无需额外打包依赖。

为什么之前的尝试无效?

  • 修改响应头X-Amz-Invocation-Type:该头是调用Lambda时用来指定调用类型的参数,而非主Lambda返回给CloudFront的响应头,因此添加后无作用。
  • 环境变量:Lambda的环境变量无法改变调用模式,无法触发子Lambda。

内容的提问来源于stack exchange,提问作者Çağrı Eroğlu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 15:30:44