当前位置: 首页 > 知识库问答 >
问题:

在Lambda函数中提取SQS队列消息

袁建木
2023-03-14

我有一个触发Lambda函数的SQS队列。我正在尝试解析SQS消息并提取相关数据。我特别尝试提取s3对象键和s3 bucket arn。

我当前的Lambda函数:

def lambda_handler(event, context):
       
    for record in event['Records']:
        payload = record['body']
        print(str(payload))

        objectKey = record['body']['s3']['object']['key']
        bucketARN = record['body']['s3']['bucket']['arn']
        
        print('Filename is: ' + str(objectKey))
        print('Bucket ARN is: ' + str(bucketARN))

CloudWatch中显示的我的SQS消息:

{
    "Records": [
        {
            "eventVersion": "2.1",
            "eventSource": "aws:s3",
            "awsRegion": "xxx",
            "eventTime": "2021-03-27T19:39:41.694Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
                "principalId": "AWS:AIDAQ5MMP4GQL2S4KQ2SZ"
            },
            "requestParameters": {
                "sourceIPAddress": "xxx"
            },
            "responseElements": {
                "x-amz-request-id": "xxx",
                "x-amz-id-2": "xxx"
            },
            "s3": {
                "s3SchemaVersion": "1.0",
                "configurationId": "xxx",
                "bucket": {
                    "name": "xxx",
                    "ownerIdentity": {
                        "principalId": "AHWVPEVW911DW"
                    },
                    "arn": "arn:aws:s3:::xxx"
                },
                "object": {
                    "key": "Audio1.mp3",
                    "size": 16659,
                    "eTag": "71d5ea0a7152e04d0d170be8146080ba",
                    "sequencer": "00605F8A02147F848A"
                }
            }
        }
    ]
}

最后一个错误是:

[ERROR] TypeError: string indices must be integers
Traceback (most recent call last):
  File "/var/task/transcribe.py", line 14, in lambda_handler
    objectKey = record['body']['s3']['object']['key']

我还尝试了objectKey=record['Records][0]['s3']['object']['key']。谢谢

共有1个答案

姬经义
2023-03-14

在这里找到了一个类似问题的有用答案。

这对我很有用:

for record in event['Records']:     
        #pull the body out & json load it
        jsonmaybe = record['body']
        jsonmaybe = json.loads(jsonmaybe)
        
        objectKey = jsonmaybe['Records'][0]['s3']['object']['key']
        print(objectKey)
        bucketARN = jsonmaybe['Records'][0]['s3']['bucket']['arn']
        print(bucketARN)
 类似资料:
  • 目前我正在使用SQS-Lambda集成 Lambda的并发可用。SQS批次设置为1记录,0延迟。 SQS的可见性超时为15分钟,Lambda最大执行时间为15分钟 我会注意到,有时SQS消息在飞行中被卡住,根本没有被任何Lambda处理(它们在15分钟后落入死信队列,CloudWatch显示没有Lambda被消息调用) 有人面临过同样的问题吗? 我在VPC内部运行Lambda,如果这很重要的话

  • 我正在使用Lambda函数将消息推送到SQS队列。消息放入SQS队列后,我需要触发其他Lambda函数来处理队列中的消息。 我认为我们可以使用SNS实现这一点。我是AWS服务新手,请建议在SNS的帮助下基于SQS队列消息触发Lambda函数的解决方案。

  • 有一个SQS队列,我在其中不断收到消息。我只需要阅读和处理过去24小时内收到的信息。目前收到的信息应在第二天处理<代码>时间戳存储在消息正文中。 是否可以从SQS队列中选择性地读取消息。例如,只读那些值大于前一天的时间戳但小于当前时间戳(当前时间戳是此作业运行的时间)的消息?

  • 我知道可以使用多个线程使用SQS队列。我想保证每封邮件都会被消费一次。我知道可以更改消息的可见性超时,例如,等于我的处理时间。如果我的进程花费的时间超过可见性超时时间(例如连接速度慢),则其他线程可以使用相同的消息。 保证消息只处理一次的最佳方法是什么?

  • 我试图实现一个AWS SQS队列,以最大限度地减少来自后端服务器的数据库交互,但我遇到了问题。 我有一个消费者进程,它从一个SQS队列中查找消息 为了测试功能,我为一个客户端实现了逻辑。它运行得很好。然而,当我添加了3个客户端时,它不能正常工作。我能够看到SQS队列被500条消息卡住了,后端作业正在正常工作,从队列中读取。 我需要增加后端作业的数量还是增加客户端SQS队列的数量?现在,所有客户端都