【问题标题】:SQS with AWS Event BridgeSQS 与 AWS 事件桥
【发布时间】:2023-01-05 02:09:37
【问题描述】:

我正在尝试设置一个演示环境来试用 SQS 作为 AWS Event Bridge 源。我尝试将一些文档上传到 SQS 以查看 Event Bridge 是否检测到任何更改,但我没有看到任何事件被触发。如何使用 AWS Event Bridge 测试作为源的 SQS?

Resources:
  Queue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: !Sub ${AWS::StackName}

  LambdaHandlerExecutionRole:
    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

  EventConsumerFunction:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.lambda_handler
      Role: !GetAtt LambdaHandlerExecutionRole.Arn
      Code:
        ZipFile: |
          import json

          def lambda_handler(event, context):
              print("Received event: " + json.dumps(event, indent=2))

      Runtime: python3.7
      Timeout: 50

  EventRule:
    Type: AWS::Events::Rule
    Properties:
      Description: eventEventRule
      State: ENABLED
      EventPattern:
        source:
          - aws.sqs
        resources:
          - !GetAtt Queue.Arn
      Targets:
        - Arn: !GetAtt EventConsumerFunction.Arn
          Id: EventConsumerFunctionTarget

  PermissionForEventsToInvokeLambda:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !Ref EventConsumerFunction
      Action: lambda:InvokeFunction
      Principal: events.amazonaws.com
      SourceArn: !GetAtt EventRule.Arn

【问题讨论】:

    标签: amazon-web-services amazon-sqs amazon-cloudwatch aws-event-bridge


    【解决方案1】:

    SQS 数据事件(发布新消息)不是事件桥 (EB) 的源事件。 EB 只能拾取管理事件,例如:

    • 清除队列
    • 创建新队列
    • 队列的删除

    此外,您的事件规则应该更通用:

      EventRule:
        Type: AWS::Events::Rule
        Properties:
          Description: eventEventRule
          State: ENABLED
          EventPattern:
            source:
              - aws.sqs
            # resources:
            #   - !GetAtt Queue.Arn
          Targets:
            - Arn: !GetAtt EventConsumerFunction.Arn
              Id: EventConsumerFunctionTarget
    

    您还可以为 SQS 启用 CloudWatch 试用和检测 API 事件。这应该能够获取更多事件。

    【讨论】:

    • 谢谢你的澄清。看起来它不能满足我的要求。
    • @thotam 你想达到什么目的?如果你想向 EB 发布消息,你必须这样做:SQS -> Lambda -> EB。
    • 我正在尝试查看是否可以利用事件桥根据 SQS 消息数来扩展 Fargate 容器。目前,我有以下流程:SQS --> Cloudwatch Alarm(ApproximateNumberOfMessagesVisible) --> SNS --> Lambda --> Fargate 缩放。使用 Event Bridge,尝试实现这个:SQS --> EventBridge --> Fargate
    • @thotam 可悲的是你不能做 SQS->EB->Fargate。为什么不直接做,SQS->Fargate?
    • 我们需要仅在 SQS 中有消息时才运行的短期 Fargate 容器。 Lambda 不适合我们的作业运行时间超过 15 分钟的用例。
    【解决方案2】:

    我可能会迟到,但这对其他人有好处, 看看这个: https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-ecs-patterns.QueueProcessingFargateService.html

    这将根据 SQS 队列中的消息数量处理 Fargate 容器的扩展。

    可以使用 AWS CDK 定义一个最简单的堆栈,如下所示:

    queue = sqs.Queue(stack, "Queue")
    
    cluster = aws_ecs.Cluster(
                stack, 'FargateCluster'
            )
    
    queue_processing_fargate_service = QueueProcessingFargateService(stack, "Service",
            cluster=cluster,
            memory_limit_mi_b=512,
            image=ecs.ContainerImage.from_registry("test"),
            command=["-c", "4", "amazon.com"],
            enable_logging=False,
            desired_task_count=2,
            environment={
                "TEST_ENVIRONMENT_VARIABLE1": "test environment variable 1 value",
                "TEST_ENVIRONMENT_VARIABLE2": "test environment variable 2 value"
            },
            queue=queue,
            max_scaling_capacity=5,
            container_name="test"
        )
    

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    • 嘿,我正在尝试使用这个QueueProcessingFargateService,但我到底怎么知道队列中的哪些数据将其放入我的 python 函数中,或者就此而言如何获取消息的访问权限?关于这件事的文档非常少
    猜你喜欢
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 2022-01-27
    • 2022-11-12
    相关资源
    最近更新 更多