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通信了