我正在编写AWS Lambda以从SQS读取消息,然后在过滤后将一些消息保存到S3。由于80%的消息将被过滤掉,因此我决定为100000个SQS消息编写一次S3。
仅当SQS中的消息达到10000时才可以触发Lambda吗?
答案 0 :(得分:6)
在AWS CloudWatch的帮助下是可能的。
您可以配置一个AWS CloudWatch警报,一旦您的SQS队列收到100000条可见消息,它就会触发“ AlarmAction”。如果发生“警报”,您将通知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
答案 1 :(得分:0)
@MaiKaY我正在尝试实现与OP类似的功能。但是我的阈值是队列中有10条消息。我尝试了您指定的Cloudwatch路由,此路由有效。但是我发现需要一些时间才能反映出队列中的更改。
在这里大声思考;为什么不只是在添加消息后立即从SQS触发Lambda,从队列中获取消息,检查具有预定编号(在我的情况下为10)的消息对象数组的长度并实现其余的逻辑?