python - 在 Lambda 函数中提取 SQS 队列消息
问题描述
我有一个触发我的 Lambda 函数的 SQS 队列。我正在尝试解析 SQS 消息并提取相关数据。我专门尝试提取 s3 对象键和 s3 存储桶 arn。
我当前的 Lambda 函数:
def lambda_handler(event, context):
for record in event['Records']:
payload = record['body']
print(str(payload))
objectKey = record['body']['s3']['object']['key']
bucketARN = record['body']['s3']['bucket']['arn']
print('Filename is: ' + str(objectKey))
print('Bucket ARN is: ' + str(bucketARN))
CloudWatch 中显示的我的 SQS 消息:
{
"Records": [
{
"eventVersion": "2.1",
"eventSource": "aws:s3",
"awsRegion": "xxx",
"eventTime": "2021-03-27T19:39:41.694Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "AWS:AIDAQ5MMP4GQL2S4KQ2SZ"
},
"requestParameters": {
"sourceIPAddress": "xxx"
},
"responseElements": {
"x-amz-request-id": "xxx",
"x-amz-id-2": "xxx"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "xxx",
"bucket": {
"name": "xxx",
"ownerIdentity": {
"principalId": "AHWVPEVW911DW"
},
"arn": "arn:aws:s3:::xxx"
},
"object": {
"key": "Audio1.mp3",
"size": 16659,
"eTag": "71d5ea0a7152e04d0d170be8146080ba",
"sequencer": "00605F8A02147F848A"
}
}
}
]
}
最后是我得到的错误:
[ERROR] TypeError: string indices must be integers
Traceback (most recent call last):
File "/var/task/transcribe.py", line 14, in lambda_handler
objectKey = record['body']['s3']['object']['key']
我也试过 objectKey = record['Records][0]['s3']['object']['key']。谢谢。
解决方案
在这里找到了对类似问题的有用答案。
这对我有用:
for record in event['Records']:
#pull the body out & json load it
jsonmaybe = record['body']
jsonmaybe = json.loads(jsonmaybe)
objectKey = jsonmaybe['Records'][0]['s3']['object']['key']
print(objectKey)
bucketARN = jsonmaybe['Records'][0]['s3']['bucket']['arn']
print(bucketARN)
推荐阅读
- reactjs - 带有 Rollup 和 ES 模块的 Cherry-pick 模块?
- html - 是否可以隐藏/删除多个 div 相交区域内的边框?
- javascript - 如何根据数据更改线条颜色 - chartist 或 chart.js
- css - 通过从 firebase 获取数据将文本移动到新行
- http-headers - 使用数据库主键构造 http ETag 标头是不是一个坏主意?
- flutter - 使用 Navigator 参数发送 null id 而不会出现任何错误
- php - 在 PHP 中:“return”、“yield”、“yield from”和在同一个函数中混合 yield 和 return 有什么区别?
- solidity - 我如何从 UI 中调用实心发射
- vue.js - 在网格中渲染多个组件
- apache-spark - Spark Session 作为另一个用户