繁体   English   中英

AWS 中的导航事件 Lambda Python

[英]Navigating Event in AWS Lambda Python

所以我对 AWS 和 Python 都很陌生。 我正在完成一项大学任务并且遇到了障碍。

我正在将数据上传到 AWS S3,此信息正在发送到 SQS 队列并传递到 AWS Lambda。 我知道,将 go 直接从 S3 到 Lambda 会容易得多......但显然“这不是简短的”。

因此,我的事件准确地进入了 AWS Lambda,但无论我挖掘多深,我都无法获得所需的信息。 在 AMS Lambda 中,我运行以下查询。

def lambda_handler(event, context):
print(event)

通过 CloudWatch,我得到了 output

{'Records': [{'messageId': '1d8e0a1d-d7e0-42e0-9ff7-c06610fccae0', 'receiptHandle': 'AQEBr64h6lBEzLk0Xj8RXBAexNukQhyqbzYIQDiMjJoLLtWkMYKQp5m0ENKGm3Icka+sX0HHb8gJoPmjdTRNBJryxCBsiHLa4nf8atpzfyCcKDjfB9RTpjdTZUCve7nZhpP5Fn7JLVCNeZd1vdsGIhkJojJ86kbS3B/2oBJiCR6ZfuS3dqZXURgu6gFg9Yxqb6TBrAxVTgBTA/Pr35acEZEv0Dy/vO6D6b61w2orabSnGvkzggPle0zcViR/shLbehROF5L6WZ5U+RuRd8tLLO5mLFf5U+nuGdVn3/N8b7+FWdzlmLOWsI/jFhKoN4rLiBkcuL8UoyccTMJ/QTWZvh5CB2mwBRHectqpjqT4TA3Z9+m8KNd/h/CIZet+0zDSgs5u', 'body': '{"Records":[{"eventVersion":"2.1","eventSource":"aws:s3","awsRegion":"eu-west-2","eventTime":"2021-03-26T01:03:53.611Z","eventName":"ObjectCreated:Put","userIdentity":{"principalId":"MY_ID"},"requestParameters":{"sourceIPAddress":"MY_IP_ADD"},"responseElements":{"x-amz-request-id":"BQBY06S20RYNH1XJ","x-amz-id-2":"Cdo0RvX+tqz6SZL/Xw9RiBLMCS3Rv2VOsu2kVRa7PXw9TsIcZeul6bzbAS6z4HF6+ZKf/2MwnWgzWYz+7jKe07060bxxPhsY"},"s3":{"s3SchemaVersion":"1.0","configurationId":"test","bucket":{"name":"MY_BUCKET","ownerIdentity":{"principalId":"MY_ID"},"arn":"arn:aws:s3:::MY_BUCKET"},"object":{"key":"test.jpg","size":246895,"eTag":"c542637a515f6df01cbc7ee7f6e317be","sequencer":"00605D33019AD8E4E5"}}}]}', 'attributes': {'ApproximateReceiveCount': '1', 'SentTimestamp': '1616720643174', 'SenderId': 'AIDAIKZTX7KCMT7EP3TLW', 'ApproximateFirstReceiveTimestamp': '1616720648174'}, 'messageAttributes': {}, 'md5OfBody': '1ab703704eb79fbbb58497ccc3f2c555', 'eventSource': 'aws:sqs', 'eventSourceARN': 'arn:aws:sqs:eu-west-2:ARN', 'awsRegion': 'eu-west-2'}]}

[免责声明,我已尝试编辑任何识别信息,但如果有任何我不理解或遗漏的敏感数据,请告诉我]

无论如何,仅作为示例,我想获得 Object 密钥,即 test.jpg。 我试图尽可能多地深入研究,最终得到: -

def lambda_handler(event, context):
print(event['Records'][0]['body'])

这返回了以下内容(很高兴看到完全风格化):-

{
"Records": [
    {
        "eventVersion": "2.1",
        "eventSource": "aws:s3",
        "awsRegion": "eu-west-2",
        "eventTime": "2021-03-26T01:08:16.823Z",
        "eventName": "ObjectCreated:Put",
        "userIdentity": {
            "principalId": "MY_ID"
        },
        "requestParameters": {
            "sourceIPAddress": "MY_IP"
        },
        "responseElements": {
            "x-amz-request-id": "ZNKHRDY8GER4F6Q5",
            "x-amz-id-2": "i1Cazudsd+V57LViNWyDNA9K+uRbSQQwufMC6vf50zQfzPaH7EECsvw9SFM3l3LD+TsYEmnjXn1rfP9GQz5G5F7Fa0XZAkbe"
        },
        "s3": {
            "s3SchemaVersion": "1.0",
            "configurationId": "test",
            "bucket": {
                "name": "MY_BUCKET",
                "ownerIdentity": {
                    "principalId": "MY_ID"
                },
                "arn": "arn:aws:s3:::MY_BUCKET"
            },
            "object": {
                "key": "test.jpg",
                "size": 254276,
                "eTag": "b0052ab9ba4b9395e74082cfd51a8f09",
                "sequencer": "00605D3407594DE184"
            }
        }
    }
]

}

但是,从这个阶段开始,如果我尝试编写 print(event['Records'][0]['body']['Records']) 或 print(event['Records'][0]['s3'] ),我会被告知我需要一个 integer,而不是字符串。 如果我尝试编写 print(event['Records'][0]['body'][0]),每次都会给我一个字符(这导致第一个 { 括号)。

我不确定这是否与元组有关,或者在这个阶段它是否都保存为一个大字符串,但至少在 output 视图中它似乎没有以这种方式保存。

有谁知道我在这个阶段会做什么来获取更多信息? 在我完成测试后的完整版本中,我希望保存一个音频文件和文件名,而不是图片。

谢谢。

您遇到此问题是因为body的内容是 JSON。 但以字符串格式。 您应该解析它以便能够像普通字典一样访问它。 像这样:

import json

def handler(event: dict, context: object):
    body = event['Records'][0]['body']
    body = json.loads(body)
    # use the body as a normal dictionary

使用 integer 索引时,您只会得到一个字符,因为它是一个字符串。 因此,在字符串中使用[n]将返回第 n 个字符。

这是因为您获得了字符串化的 JSON 数据。 您需要将其加载回其 Python dict 格式。

有一个有用的 package 称为 lambda_decorators。 您可以使用pip install lambda_decorators

所以你可以这样做:

from lambda_decorators import load_json_body

@load_json_body
def lambda_handler(event, context):
    print(event['Records'][0]['body'])

    # Now you can access the the items in the body using there index and keys.

这将为您提取 JSON。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM