首页 > 解决方案 > 在 Lambda 函数中提取 SQS 队列消息

问题描述

我有一个触发我的 Lambda 函数的 SQS 队列。我正在尝试解析 SQS 消息并提取相关数据。我专门尝试提取 s3 对象键和 s3 存储桶 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']。谢谢。

标签: pythonamazon-web-servicesaws-lambdaamazon-sqs

解决方案


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

这对我有用:

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)

推荐阅读