我有一个S3 bucket上传通知,将消息放入SQS队列。SQS队列触发lambda函数。我试图从触发lambda函数的SQS消息中提取上传的文件名。我的SQS事件记录在打印到CloudWatch日志时如下所示:
{
"Records": [
{
"eventVersion": "2.1",
"eventSource": "aws:s3",
"awsRegion": "eu-west-2",
"eventTime": "2020-04-05T13:55:30.970Z",
"eventName": "ObjectCreated:Put",
"userIdentity": {
"principalId": "A2RFWU4TTDGK95"
},
"requestParameters": {
"sourceIPAddress": "HIDDEN"
},
"responseElements": {
"x-amz-request-id": "024EF2A2E94BD5CA",
"x-amz-id-2": "P/5p5mDwfIu29SeZcNo3wjJaGAiM4yqBqp4p3gOfLVPeZhf+w5sRjnxsost3BuYub1FVf7tuMFs9KoC98+fwSI9NrT5WbjYq"
},
"s3": {
"s3SchemaVersion": "1.0",
"configurationId": "ImageUpload",
"bucket": {
"name": "HIDDEN",
"ownerIdentity": {
"principalId": "A2RFWU4TTDGK95"
},
"arn": "arn:aws:s3:::HIDDEN"
},
"object": {
"key": "activity1.png",
"size": 41762,
"eTag": "9e1645a32c2948139a90e75522deb5ab",
"sequencer": "005E89E354A986B50D"
}
}
}
]
}
使用此代码:
import boto3
rek = boto3.client('rekognition')
def test(event, context):
for record in event['Records']:
print ("test")
payload=record["body"]
fullpayload=str(payload)
print(fullpayload)
使用['s3]['object]['key']访问文件名“activity1”。有效负载字符串上的“png”显示以下错误:
's3': KeyError
Traceback (most recent call last):
如何从lambda函数访问文件名?
打印(完整有效负载)
的输出是什么?我希望有效负载为None
,因为记录中没有名为body
的属性。
从问题中的示例记录中,您应该这样做:
record['s3']['object']['key']
如果这就是我所认为的:S3对象创建事件--
print(event)
的输出实际上是整个事件的json,如下所示:
{ 'Records':
[
{
'messageId': '61155c1d-aaaa-aaaa-aaaa-aaaaaaaaaaaa',
'receiptHandle': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalF5156pb+aSqhRWbEY1XWIAVpingcBgOM8/uv1pIgfVXtfNRwzjtoCcInH6doGo9C38uWG7V48uEzpiAPr6Ao2IkXn5IEQKgxXzgelT5FtW3gpwhsQ3fvsFZdZNkMj2YiBHpdJ9QDgfmjFOWmqEJL+LWHUyksdAHxqVZMFrdaS1Tmno3Xni7DMBg1Ed+HpHkBmAVOWssDfM25lC1RNUivXj8i3iI/gD0yBlCttA4aioAlYNZ0txBrkm8aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaML+jK3JcKXiaslbu+JNZaB7hwevHRNsGIQ2MLuRhX+eHD4BN',
'body':
'{"Records":
[
{
"eventVersion":"2.1",
"eventSource":"aws:s3",
"awsRegion":"us-east-1",
"eventTime":"2021-02-24T00:30:07.549Z",
"eventName":"ObjectCreated:Put",
"userIdentity":{"principalId":"AWS:AROAAAAAAAAAA:Rolehere"},
"requestParameters":{"sourceIPAddress":"x.x.x.x"},"responseElements":{"x-amz-request-id":"860A2aaaaaaaB19","x-amz-id-2":"J8epzX+FGaLsliSYSiJaaaaaaaaaaaaaETviVcrVCD/FsQjVLNBJgcv8v/PIh37Y9waaaaaaaaaaaaaaaaoUkoqhlr"},
"s3":
{"s3SchemaVersion":"1.0",
"configurationId":"New arrival",
"bucket":
{"name":"molly-bucketname","ownerIdentity":{"principalId":"A2aaaaaaFMND3"},"arn":"arn:aws:s3:::molly-bucketname"},
"object":{"key":"dietcokeofevil.mp3","size":420049,"eTag":"bf153e303affbb6e54feb0a233879d4d","versionId":"B2WJZpLLvpWA4nXP5T5QjVZY09qpnHKa","sequencer":"0060359E131BAA52C0"}
}
}
]
}',
'attributes': {
'ApproximateReceiveCount': '1',
'SentTimestamp': '1614126612305',
'SenderId': 'AIDAJHaaaaaaaaaaJEBU',
'ApproximateFirstReceiveTimestamp': '1614126612308'
},
'messageAttributes': {},
'md5OfMessageAttributes': None,
'md5OfBody': 'c752a7082100075786323ff7e5cdfc26',
'eventSource': 'aws:sqs',
'eventSourceARN': 'arn:aws:sqs:us-east-1:#########:queuename',
'awsRegion': 'us-east-1'
}
]
}
当s3没有传递给lambda时,lambda正在从队列中读取数据——在put示例中实际看到的json周围似乎有一个包装器。如果您试图在lambda中将打印的事件(如上)添加到您的测试中,则会出现json错误。我们需要解析初始记录json
import json
import boto3
def lambda_handler(event, context):
#Loops through every file uploaded
for record in event['Records']:
#pull the body out & json load it
jsonmaybe=(record["body"])
jsonmaybe=json.loads(jsonmaybe)
#now the normal stuff works
bucket_name = jsonmaybe["Records"][0]["s3"]["bucket"]["name"]
print(bucket_name)
key=jsonmaybe["Records"][0]["s3"]["object"]["key"]
print(key)
我有触发lambda的SQS。 当我将消息放入SQS队列时,它会显示正在传输的消息,而我的lambda无法处理该消息。 我的Lambda有以下权限 它也有以下权限 当我附加"管理员访问"权限权限,它的工作和lambda被触发。我不确定我在这里错过了哪个许可。我的SQS队列未加密。
但是,如果我的Lambda不期望任何输入,它将自己转到SQS并拉出消息,有输入有意义吗?我是否可以让它无效,或者甚至完全使用其他方法签名(当然,在本例中不实现那个接口)?
我有一个连接到lambda的队列(fifo)。我想在lambda中向标准队列发送一条消息。但没有发送/接收任何消息。然而,如果我尝试从非SQS连接的lambda(通过AppSync)发送它,它会工作。 我查过: lambda有权发送SQS消息(您可以在那里看到) 由于我已成功地从另一个lambda(非SQS)向标准队列发送消息,因此正确配置了标准队列 SQS URL是否正确 控制台中不会显示任何错
当消息到达SQS时,如何触发AWS Lambda函数(Python),并将消息传递给HTTPendpoint,在处理API中的数据后,从SQS队列中删除消息?如何在Python lambda中实现这一点?
我需要实现向带有属性的SQS发送消息。消息的正文上传良好,但我有问题的属性。消息属性需要具有属性名称、数据类型和值的关联数组。我有这样的错误: $Attributes数组应该是什么样子?