目标仅在通过 AWS CLI 调用 Lambda 时有效

use*_*392 5 amazon-web-services aws-lambda aws-api-gateway

我有一个 hello-world 测试 Lambda 配置了:

  • 触发器:API 网关
  • 目的地:亚马逊 SQS。一个等待成功,另一个等待失败。
import json

def lambda_handler(event, context):
    print("Received event: " + json.dumps(event))

    return {
        "statusCode": 200,
        "body": 'success'
    }
Run Code Online (Sandbox Code Playgroud)

当我通过 CLI 调用 Lambda 时,消息按预期进入成功队列:

aws lambda invoke --function-name event-destinations --invocation-type Event --payload '{}' response.json
Run Code Online (Sandbox Code Playgroud)

但是,当我通过 API 网关调用 Lambda 时,没有消息排入任一目标队列。我启用了 Lambda 代理集成。Cloudwatch 指标确认调用成功(调用计数增加,错误计数不增加)。以下从我的 Lambda 代码返回 200 和预期的响应正文:

curl 'https://REDACTED.execute-api.us-east-1.amazonaws.com/api_trigger' \
--header 'Content-Type: application/json' \
--data-raw '{}'
Run Code Online (Sandbox Code Playgroud)

同样,当我使用 Lambda 控制台中的“测试”按钮时,没有消息被排入任一目标队列。编辑:这是每个 https://www.trek10.com/blog/lambda-destinations-what-we-learned-the-hard-way 的预期行为

为什么这 3 次调用的目标行为会有所不同?对于此测试,我已将重试次数设置为 0。

use*_*392 6

似乎有一组有效的 {trigger, destination} 对,而 {API Gateway, SQS} 不是其中之一。能够从给定的触发器调用 lambda 不足以将事件传递到目的地。AWS 控制台不会强制执行这些配对或发出警告。

我参考了以下图表:https : //www.trek10.com/blog/lambda-destinations-what-we-learned-the-hard-way/

我向我的 lambda 添加了一个 S3 触发器,并且 S3 事件发布到目标 SQS 队列没有问题。