所以我对AWS和Python都是新手。我在执行一项大学任务,遇到了一个障碍。
我正在将数据上传到亚马逊S3,这些信息将被发送到SQS队列并传递到亚马逊网络服务Lambda。我知道,直接从S3转到Lambda...but会容易得多,显然“这不是重点”。
因此,我已经将我的活动准确地输入到AWS Lambda中,但无论我挖掘得多深,我都无法获得所需的信息。在AMS Lambda中,我运行以下查询。
def lambda_handler(event, context):
print(event)
通过CloudWatch,我可以获得输出
{'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。我试着尽可能深入,最终得到:-
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‘’body‘)或print(event’‘Records’‘S3’),我会被告知需要一个整数,而不是一个字符串。如果我尝试写print(event‘’Records‘’body‘),我每次都会得到一个字符(在这种情况下,第一个{方括号)。
我不确定这是否与元组有关,或者在这个阶段是否全部保存为一个大字符串,但至少在输出视图中看起来不是这样保存的。
有谁知道我在这个阶段会做些什么来获取更多的信息?在我完成测试后的完整版本中,我想要保存一个音频文件和文件名,而不是图片。
谢谢。
发布于 2021-03-26 09:22:43
您会遇到这个问题,因为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
当使用整数索引时,您只能得到一个字符,因为它是一个字符串。因此,在字符串中使用[n]
将返回第n个字符。
发布于 2021-03-26 09:25:00
这是因为你得到了字符串形式的JSON数据。您需要将其加载回其Python dict格式。
有一个很有用的包,叫做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。
https://stackoverflow.com/questions/66809735
复制相似问题