SQS DeleteMessage阻止并且不返回响应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQS DeleteMessage阻止并且不返回响应相关的知识,希望对你有一定的参考价值。

我正在处理lambda函数中的sqs消息,一旦处理成功,我尝试删除它。这就是问题的来源。似乎对deleteMessage的调用并没有完成。 lambda函数在deleteMessage返回之前100秒后超时。

以下是用于尝试删除邮件的代码示例。当我在临时发送它作为黑客攻击时,我将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:Full access

在队列本身我允许任何人执行任何动作:enter image description here

任何人对我在这里做错了什么有什么想法?

答案

事实证明,我的VPC和EndPoint上有一些缺少的属性......

我将这些添加到VPC中

EnableDnsSupport: true
EnableDnsHostnames: true

并将其添加到端点

PrivateDnsEnabled: true

然后lambda函数最终能够与SQS通信

另一答案

事实证明,我的VPC和EndPoint上有一些缺少的属性......

我将这些添加到VPC中

EnableDnsSupport: true
EnableDnsHostnames: true

并将其添加到端点

PrivateDnsEnabled: true

然后lambda函数最终能够与SQS通信

以上是关于SQS DeleteMessage阻止并且不返回响应的主要内容,如果未能解决你的问题,请参考以下文章

aws lambda 上的保留并发不会阻止 lambda 进行更多扩展?

汉语-词语-回响:百科

如何使用 celery worker 从 SQS 轮询消息,消息为 JSON 格式,并且 worker 无法解码该格式

返回响应时,Symfony 4.4 转储不输出任何内容

返回响应时,Symfony 4.4 转储不输出任何内容

基于 SQS 队列大小的自动缩放