关于亚马逊 s3:在 AWS Lambda 中解析 SQS 消息触发器 – Python

Parse SQS message trigger in AWS Lambda - Python

我收到关于 S3 存储桶上传的通知,以将消息放入 SQS 队列。 SQS 队列触发一个 lambda 函数。我正在尝试从触发 lambda 函数的 SQS 消息中提取上传的文件的名称。当打印到 CloudWatch 日志时,我的 SQS 事件记录如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{
"Records": [
    {
       "eventVersion":"2.1",
       "eventSource":"aws:s3",
       "awsRegion":"eu-west-2",
       "eventTime":"2020-04-05T13:55:30.970Z",
       "eventName":"ObjectCreated:Put",
       "userIdentity": {
           "principalId":"A2RFWU4TTDGK95"
        },
       "requestParameters": {
           "sourceIPAddress":"HIDDEN"
        },
       "responseElements": {
           "x-amz-request-id":"024EF2A2E94BD5CA",
           "x-amz-id-2":"P/5p5mDwfIu29SeZcNo3wjJaGAiM4yqBqp4p3gOfLVPeZhf+w5sRjnxsost3BuYub1FVf7tuMFs9KoC98+fwSI9NrT5WbjYq"
        },
       "s3": {
           "s3SchemaVersion":"1.0",
           "configurationId":"ImageUpload",
           "bucket": {
               "name":"HIDDEN",
               "ownerIdentity": {
                   "principalId":"A2RFWU4TTDGK95"
                },
               "arn":"arn:aws:s3:::HIDDEN"
            },
           "object": {
               "key":"activity1.png",
               "size": 41762,
               "eTag":"9e1645a32c2948139a90e75522deb5ab",
               "sequencer":"005E89E354A986B50D"
            }
        }
    }
]
}

使用此代码:

1
2
3
4
5
6
7
8
9
import boto3
rek = boto3.client('rekognition')

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

使用 [\\'s3][\\'object][\\'key\\'??] 访问有效负载字符串上的文件名 \\'activity1.png\\' 会出现以下错误:

1
2
's3': KeyError
Traceback (most recent call last):

如何通过 lambda 函数访问文件名?


如果这就是我的想法:S3 对象创建事件 --> SQS <-- lambda polls, 我也遇到了这个。我正在使用 s3 put 示例测试,并且还使用我的 sqs 消息中的民意调查来进行另一个测试。当它来自实际读取队列而不是测试时,我遇到了问题。

print(event) 的输出实际上是整个事件的 json,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    {   'Records':
        [  
            {
            'messageId': '61155c1d-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
            'receiptHandle': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalF5156pb+aSqhRWbEY1XWIAVpingcBgOM8/uv1pIgfVXtfNRwzjtoCcInH6doGo9C38uWG7V48uEzpiAPr6Ao2IkXn5IEQKgxXzgelT5FtW3gpwhsQ3fvsFZdZNkMj2YiBHpdJ9QDgfmjFOWmqEJL+LWHUyksdAHxqVZMFrdaS1Tmno3Xni7DMBg1Ed+HpHkBmAVOWssDfM25lC1RNUivXj8i3iI/gD0yBlCttA4aioAlYNZ0txBrkm8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaML+jK3JcKXiaslbu+JNZaB7hwevHRNsGIQ2MLuRhX+eHD4BN',
            'body':
                '{"Records":    
                  [
                    {  
                   "eventVersion":"2.1",
                   "eventSource":"aws:s3",
                   "awsRegion":"us-east-1",
                   "eventTime":"2021-02-24T00:30:07.549Z",
                   "eventName":"ObjectCreated:Put",
                   "userIdentity":{"principalId":"AWS:AROAAAAAAAAAA:Rolehere"},
                   "requestParameters":{"sourceIPAddress":"x.x.x.x"},"responseElements":{"x-amz-request-id":"860A2aaaaaaaB19","x-amz-id-2":"J8epzX+FGaLsliSYSiJaaaaaaaaaaaaaETviVcrVCD/FsQjVLNBJgcv8v/PIh37Y9waaaaaaaaaaaaaaaaoUkoqhlr"},
                   "s3":
                        {"s3SchemaVersion":"1.0",
                       "configurationId":"New arrival",                    
                       "bucket":
                        {"name":"molly-bucketname","ownerIdentity":{"principalId":"A2aaaaaaFMND3"},"arn":"arn:aws:s3:::molly-bucketname"},
                       "object":{"key":"dietcokeofevil.mp3","size":420049,"eTag":"bf153e303affbb6e54feb0a233879d4d","versionId":"B2WJZpLLvpWA4nXP5T5QjVZY09qpnHKa","sequencer":"0060359E131BAA52C0"}
                        }
                    }
                   ]
                 }'
,
            'attributes': {
                'ApproximateReceiveCount': '1',
                'SentTimestamp': '1614126612305',
                'SenderId': 'AIDAJHaaaaaaaaaaJEBU',
                'ApproximateFirstReceiveTimestamp': '1614126612308'
            },
            'messageAttributes': {},
            'md5OfMessageAttributes': None,
            'md5OfBody': 'c752a7082100075786323ff7e5cdfc26',
            'eventSource': 'aws:sqs',
            'eventSourceARN': 'arn:aws:sqs:us-east-1:#########:queuename',
            'awsRegion': 'us-east-1'
            }
        ]
    }

当 s3 没有传递给 lambda 时,lambda 正在从队列中读取 - 看起来你在 put 示例中实际看到的 json 周围有一个package器。如果您尝试在 lambda 中将打印的事件(上图)添加到您的测试中,则会出现 json 错误。我们需要解析初始的 Records json


print(fullpayload) 的输出是什么?我希望有效负载为 None 因为记录中没有名为 body 的属性。

根据您问题中的示例记录,您应该这样做:

1
record['s3']['object']['key']