首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS Lambda Python中的导航事件

AWS Lambda Python中的导航事件
EN

Stack Overflow用户
提问于 2021-03-26 09:17:51
回答 2查看 40关注 0票数 1

所以我对AWS和Python都是新手。我在执行一项大学任务,遇到了一个障碍。

我正在将数据上传到亚马逊S3,这些信息将被发送到SQS队列并传递到亚马逊网络服务Lambda。我知道,直接从S3转到Lambda...but会容易得多,显然“这不是重点”。

因此,我已经将我的活动准确地输入到AWS Lambda中,但无论我挖掘得多深,我都无法获得所需的信息。在AMS Lambda中,我运行以下查询。

代码语言:javascript
运行
复制
def lambda_handler(event, context):
print(event)

通过CloudWatch,我可以获得输出

代码语言:javascript
运行
复制
{'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'}]}

免责声明,我已尝试删除任何识别信息,但如果有任何我不理解或遗漏的敏感数据,请让我知道

不管怎样,作为示例,我想要获取对象键,它是test.jpg。我试着尽可能深入,最终得到:-

代码语言:javascript
运行
复制
def lambda_handler(event, context):
print(event['Records'][0]['body'])

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

代码语言:javascript
运行
复制
{
"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‘’body‘)或print(event’‘Records’‘S3’),我会被告知需要一个整数,而不是一个字符串。如果我尝试写print(event‘’Records‘’body‘),我每次都会得到一个字符(在这种情况下,第一个{方括号)。

我不确定这是否与元组有关,或者在这个阶段是否全部保存为一个大字符串,但至少在输出视图中看起来不是这样保存的。

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-26 09:22:43

您会遇到这个问题,因为body的内容是JSON。而是字符串格式。您应该解析它,以便能够像访问普通字典一样访问它。如下所示:

代码语言:javascript
运行
复制
import json

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

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

票数 2
EN

Stack Overflow用户

发布于 2021-03-26 09:25:00

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

有一个很有用的包,叫做lambda_decorators。您可以使用pip install lambda_decorators进行安装

所以你可以这样做:

代码语言:javascript
运行
复制
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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66809735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档