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 消息中的民意调查来进行另一个测试。当它来自实际读取队列而不是测试时,我遇到了问题。
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
根据您问题中的示例记录,您应该这样做:
1 | record['s3']['object']['key'] |