AWS (GovCloud) Lambda 目标未触发

Fan*_*nge 5 amazon-web-services amazon-kinesis aws-lambda

我在AWS GovCloud工作我在 AWS Lambda 中有以下配置:

  1. 一个用于解码有效负载的 Lambda 函数
  2. Kinesis Stream 设置为上述函数的触发器
  3. Lambda 目标(我们尝试过 Lambda 函数以及 SQS、SNS)

无论配置如何,我似乎都无法让 Lambda 触发目标函数(或 SQS 事件中的队列)。

这是当前的 Lambda 函数。我已经尝试了许多结果/返回有效载荷的排列,但无济于事。

import base64
import json

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    for record in event['Records']:
        payload = base64.b64decode(record['kinesis']['data']).decode('utf-8', 'ignore')
        print("Success")
        result = {
        "statusCode": 202,
        "headers": {
        #'Content-Type': 'application/json',
            },
        "body": '{payload}'
        }
    
    return json.dumps(result)
Run Code Online (Sandbox Code Playgroud)

然后,我使用 AWS CLI 向 Kinesis 发送一条消息(我注意到控制台中的“测试”没有按照Jared Short观察目标)。

Every 0.1s: aws kinesis put-records --stream-name test-stream --records Data=SGVsbG8sIHRoaXMgaXMgYSB0ZXN0IGZyb20gdGhlIEFXUyBDTEkh,PartitionKey=partitionkey1                            Thu Jul  8 19:03:54 2021

{
    "FailedRecordCount": 0,
    "Records": [
        {
            "SequenceNumber": "49619938447946944252072058244333476686328287240252293122",
            "ShardId": "shardId-000000000000"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

使用 Cloudwatch 指标和日志,我能够观察由每 0.1 秒发送到 Kinesis 的消息触发的函数。

在此处输入图片说明

指标图表表明成功(如我所料)。

以下是 Cloudwatch 的示例日志:

START RequestId: 0cf3fb87-06e6-4e35-9de8-b30147e7be9d Version: $LATEST
Loading function
Success
END RequestId: 0cf3fb87-06e6-4e35-9de8-b30147e7be9d
REPORT RequestId: 0cf3fb87-06e6-4e35-9de8-b30147e7be9d  Duration: 1.27 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 51 MB  Init Duration: 113.64 ms    
START RequestId: e663fa4a-2d0b-42d6-9e38-599712b71101 Version: $LATEST
Success
END RequestId: e663fa4a-2d0b-42d6-9e38-599712b71101
REPORT RequestId: e663fa4a-2d0b-42d6-9e38-599712b71101  Duration: 1.04 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 51 MB  
START RequestId: b1373bbe-d2c6-49fb-a71f-dcedaf9210eb Version: $LATEST
Success
END RequestId: b1373bbe-d2c6-49fb-a71f-dcedaf9210eb
REPORT RequestId: b1373bbe-d2c6-49fb-a71f-dcedaf9210eb  Duration: 0.98 ms   Billed Duration: 1 ms   Memory Size: 128 MB Max Memory Used: 51 MB  
START RequestId: e0382653-9c33-44d6-82a7-a82f0f416297 Version: $LATEST
Success
END RequestId: e0382653-9c33-44d6-82a7-a82f0f416297
REPORT RequestId: e0382653-9c33-44d6-82a7-a82f0f416297  Duration: 1.05 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 51 MB  
START RequestId: f9600ef5-419f-4271-9680-7368ccc5512d Version: $LATEST
Success
Run Code Online (Sandbox Code Playgroud)

但是,查看目标 lambda 函数或 SQS 队列的 cloudwatch 日志/指标清楚地表明目标没有被触发。

在故障排除过程中,我为 Lambda 函数执行角色过度配置了 IAM 策略,因此我相当确信这不是与 IAM 相关的问题。此外,这两个功能共享相同的执行角色。

在查看 AWS 文档和第 3 方信息后,我不清楚的一件事是 AWS 确定给定功能成功或失败的标准。我目前正在研究调用文档以寻找这里可能出现的问题 - 但我的解释是 AWS 知道我们的函数是成功的,基于上述 Cloudwatch 指标显示 100% 的成功率。

有谁知道我做错了什么或如何尝试对 lambda 的目标触发器进行故障排除?

编辑:正如所指出的,该代码对于多个记录事件是不正确的。这是一种无意义的故障排除/更改代码以触发目标的功能。即使像这样简单的事情也不会调用目的地。

import base64
import json

def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    # for record in event['Records']:
    #     payload = base64.b64decode(record['kinesis']['data']).decode('utf-8', 'ignore')
    #     print("Success")
    #     result = {
    #     "statusCode": 202,
    #     "headers": {
    #     'Content-Type': 'application/json',
    #         },
    #     "body": '{"Success":True, payload}'
    #     }

    return { "result": "OK" }
Run Code Online (Sandbox Code Playgroud)

所以,问题是:有人可以证明可以让 Kinesis Stream 事件源触发 Lambda 函数,从而成功触发 AWS Govcloud 中的 Lambda 目标吗?