[英]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.