Могу ли я запускать лямбду только тогда, когда количество сообщений достигает целевого значения в SQS? - PullRequest
0 голосов
/ 08 января 2019

Я пишу AWS Lambda, чтобы прочитать сообщение из SQS и затем сохранить некоторые сообщения в S3 после фильтрации. Поскольку 80% сообщений будут отфильтрованы, я решил написать S3 один раз для 100000 сообщений SQS.

Возможно ли запускать лямбду только тогда, когда сообщения в SQS достигают 10000?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

@ MaiKaY Я пытаюсь реализовать функцию, аналогичную OP. Но мой порог составляет 10 сообщений в очереди. Я попробовал указанный вами маршрут Cloudwatch, и он сработал. Но я обнаружил, что для отражения изменений в очереди требуется некоторое время.

Просто мысли вслух здесь; почему бы просто не вызвать лямбду из SQS, как только сообщение будет добавлено, извлечь сообщения из очереди, проверить длину массива объектов сообщений с заранее определенным числом (в моем случае 10) и реализовать оставшуюся часть логика?

0 голосов
/ 08 января 2019

Это возможно с помощью AWS CloudWatch .

Вы можете настроить AWS CloudWatch Alarm, который вызывает «AlarmAction», как только ваша очередь SQS получает 100000 видимых сообщений. В случае «тревоги» вы уведомляете тему SNS, которая затем запускает вашу AWS Lambda.

Если вы используете AWS CloudFormation , это может выглядеть следующим образом:

AWSTemplateFormatVersion: 2010-09-09
Resources:
  Queue:
    Type: AWS::SQS::Queue

  QueueVisibleMessagesTopic:
    Type: AWS::SNS::Topic

  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

  Lambda:
    Type: AWS::Lambda::Function
    Properties:
      Handler: handler.index
      Role: !GetAtt LambdaExecutionRole.Arn
      Runtime: nodejs8.10
      MemorySize: 128
      Timeout: 10

  LambdaSubscription:
    Type: AWS::SNS::Subscription
    Properties:
      Endpoint: !GetAtt Lambda.Arn
      Protocol: lambda
      TopicArn: !Ref QueueVisibleMessagesTopic

  LambdaSubscriptionPermissions:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt Lambda.Arn
      Action: lambda:InvokeFunction
      Principal: sns.amazonaws.com
      SourceArn: !Ref QueueVisibleMessagesTopic

  QueueVisibleMessagesAlarm:
    Type: AWS::CloudWatch::Alarm
    Properties:
      Namespace: AWS/SQS
      MetricName: ApproximateNumberOfMessagesVisible
      Dimensions:
        - Name: QueueName
          Value: !GetAtt Queue.QueueName
      Statistic: Sum
      Period: 300
      EvaluationPeriods: 1
      ComparisonOperator: GreaterThanOrEqualToThreshold
      Threshold: 100000
      AlarmActions:
        - !Ref QueueVisibleMessagesTopic
...