Fan*_*nge 5 amazon-web-services amazon-kinesis aws-lambda
我在AWS GovCloud工作我在 AWS Lambda 中有以下配置:
无论配置如何,我似乎都无法让 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 目标吗?
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |