SQS DeleteMessage 阻止并且不 return 响应
SQS DeleteMessage blocks and does not return a response
我正在 lambda 函数中处理一条 sqs 消息,一旦处理成功,我就会尝试删除它。这就是问题所在。似乎对 deleteMessage
的调用没有完成。 lambda 函数在 deleteMessage
returns.
前 100 秒后超时
下面是用于尝试删除邮件的代码示例。
当我在此期间将其作为 hack 发送时,我将 queueUrl 与消息一起传递(处理队列 url、arns 和名称目前是混乱且不一致的)。
我已验证 queueUrl 和 ReceiptHandle 是否正确。
async deleteSQSMessage(record: SQSRecord) {
try {
let queueUrl: any = record.messageAttributes['queueUrl']
console.log(`Deleting message from queue: ${JSON.stringify(queueUrl)}`)
if(queueUrl) {
console.log(`Deleting queue message: ${record.body}`)
let sqs = new SQS()
let deleteParams = { QueueUrl: queueUrl.stringValue, ReceiptHandle: record.receiptHandle }
// THIS IS THE LAST STATEMENT PRINTED IN THE LOGS (AFTER 100 SECS THE LAMBDA FUNCTION TIMES OUT
console.log(`Delete params: ${JSON.stringify(deleteParams)}`)
let result = await sqs.deleteMessage(deleteParams).promise()
console.log(`Delete result: ${result}`)
} else {
console.error(`Invalid event record, no queueUrl attribute, cant delete message off of queue. ${record}`)
}
}
catch(err) {
console.error(JSON.stringify(err))
}
}
我已添加此 VPC 端点以启用对 sqs 的访问:
SQSVPCEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.sqs'
VpcId: !Ref VPC
VpcEndpointType: Interface
SubnetIds:
- !Ref SubnetA
- !Ref SubnetB
- !Ref SubnetC
SecurityGroupIds:
- !Ref VPCSecurityGroup
上面提到的安全组:
VPCSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: 'Open security group for subnet IPS'
VpcId: !Ref VPC
VPCSecurityGroupIngress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: !Ref VPCSecurityGroup
IpProtocol: tcp
FromPort: 0
ToPort: 65535
SourceSecurityGroupId: !Ref VPCSecurityGroup
VPCSecurityGroupEgress:
Type: AWS::EC2::SecurityGroupEgress
Properties:
GroupId: !Ref VPCSecurityGroup
IpProtocol: tcp
FromPort: 0
ToPort: 65535
DestinationSecurityGroupId: !Ref VPCSecurityGroup
我已授予 lambda 对 sqs 的完全访问权限:
在队列本身,我允许任何人执行任何操作:
有人对我在这里做错了什么有任何想法吗?
事实证明,我的 VPC 和端点上缺少一些属性...
我将这些添加到 VPC
EnableDnsSupport: true
EnableDnsHostnames: true
并将其添加到端点
PrivateDnsEnabled: true
然后lambda函数终于可以和SQS通信了
我正在 lambda 函数中处理一条 sqs 消息,一旦处理成功,我就会尝试删除它。这就是问题所在。似乎对 deleteMessage
的调用没有完成。 lambda 函数在 deleteMessage
returns.
下面是用于尝试删除邮件的代码示例。 当我在此期间将其作为 hack 发送时,我将 queueUrl 与消息一起传递(处理队列 url、arns 和名称目前是混乱且不一致的)。
我已验证 queueUrl 和 ReceiptHandle 是否正确。
async deleteSQSMessage(record: SQSRecord) {
try {
let queueUrl: any = record.messageAttributes['queueUrl']
console.log(`Deleting message from queue: ${JSON.stringify(queueUrl)}`)
if(queueUrl) {
console.log(`Deleting queue message: ${record.body}`)
let sqs = new SQS()
let deleteParams = { QueueUrl: queueUrl.stringValue, ReceiptHandle: record.receiptHandle }
// THIS IS THE LAST STATEMENT PRINTED IN THE LOGS (AFTER 100 SECS THE LAMBDA FUNCTION TIMES OUT
console.log(`Delete params: ${JSON.stringify(deleteParams)}`)
let result = await sqs.deleteMessage(deleteParams).promise()
console.log(`Delete result: ${result}`)
} else {
console.error(`Invalid event record, no queueUrl attribute, cant delete message off of queue. ${record}`)
}
}
catch(err) {
console.error(JSON.stringify(err))
}
}
我已添加此 VPC 端点以启用对 sqs 的访问:
SQSVPCEndpoint:
Type: AWS::EC2::VPCEndpoint
Properties:
ServiceName: !Sub 'com.amazonaws.${AWS::Region}.sqs'
VpcId: !Ref VPC
VpcEndpointType: Interface
SubnetIds:
- !Ref SubnetA
- !Ref SubnetB
- !Ref SubnetC
SecurityGroupIds:
- !Ref VPCSecurityGroup
上面提到的安全组:
VPCSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: 'Open security group for subnet IPS'
VpcId: !Ref VPC
VPCSecurityGroupIngress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: !Ref VPCSecurityGroup
IpProtocol: tcp
FromPort: 0
ToPort: 65535
SourceSecurityGroupId: !Ref VPCSecurityGroup
VPCSecurityGroupEgress:
Type: AWS::EC2::SecurityGroupEgress
Properties:
GroupId: !Ref VPCSecurityGroup
IpProtocol: tcp
FromPort: 0
ToPort: 65535
DestinationSecurityGroupId: !Ref VPCSecurityGroup
我已授予 lambda 对 sqs 的完全访问权限:
在队列本身,我允许任何人执行任何操作:
有人对我在这里做错了什么有任何想法吗?
事实证明,我的 VPC 和端点上缺少一些属性...
我将这些添加到 VPC
EnableDnsSupport: true
EnableDnsHostnames: true
并将其添加到端点
PrivateDnsEnabled: true
然后lambda函数终于可以和SQS通信了