SQS DeleteMessage блокирует и не возвращает ответ - PullRequest
0 голосов
/ 06 апреля 2019

Я обрабатываю сообщение sqs в лямбда-функции, и как только оно успешно обработано, я пытаюсь удалить его.Вот тут и возникает проблема. Кажется, что вызов deleteMessage просто не завершается.Лямбда-функция отключается через 100 секунд, прежде чем возвращается deleteMessage.

Ниже приведен пример кода, который используется для попытки удаления сообщения.Я передаю queueUrl вместе с сообщением, когда отправляю его как промежуточный хак (работа с URL-адресами, аргументами и именами в очереди на данный момент грязная и несовместимая).

Я подтвердил, что 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

Я дал лямбду полнойдоступ к sqs: Full access

И в самой очереди я разрешил любому выполнять любое действие: enter image description here

Любой имеетЛюбые идеи о том, что я мог бы делать здесь не так?

1 Ответ

0 голосов
/ 14 апреля 2019

Оказывается, у меня было несколько недостающих атрибутов в моем VPC и EndPoint ...

Я добавил их в VPC

EnableDnsSupport: true
EnableDnsHostnames: true

И добавил это к конечной точке

PrivateDnsEnabled: true

И тогда лямбда-функция наконец-то смогла связаться с SQS

...