当前位置: 首页 > 知识库问答 >
问题:

SQS Lambda触发器的飞行消息

松英喆
2023-03-14

我有触发lambda的SQS。

当我将消息放入SQS队列时,它会显示正在传输的消息,而我的lambda无法处理该消息。

我的Lambda有以下权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "sqs:DeleteMessage",
                "sqs:GetQueueUrl",
                "sqs:ListDeadLetterSourceQueues",
                "sqs:DeleteMessageBatch",
                "sqs:ReceiveMessage",
                "sqs:GetQueueAttributes",
                "sqs:ListQueueTags"
            ],
            "Resource": "*"
        }
    ]
}

它也有以下权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:us-east-1:5722*****:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:5722****:log-group:/aws/lambda/815223_Test:*"
            ]
        }
    ]
}

当我附加"管理员访问"权限权限,它的工作和lambda被触发。我不确定我在这里错过了哪个许可。我的SQS队列未加密。

共有1个答案

华星文
2023-03-14

查看CloudTrail以确定API失败的根本原因。还要检查用于SQS的队列策略。

对于默认的SQS和Lambda组合,您只需要以下权限。

- "SQS:SendMessage"
- "SQS:ReceiveMessage"
- "SQS:DeleteMessage"
- "SQS:GetQueueAttributes"

下面是一个示例CloudFormation模板,供您参考。

AWSTemplateFormatVersion: "2010-09-09"
Description: >
  Creates the SQS and Lambda pattern
Resources:
  # SQS queue and queue policy
  FileProcessingEventsQueue:
    Type: AWS::SQS::Queue
    Properties:
      QueueName: "FileProcessingEventsQueue"
      VisibilityTimeout: 60
  FileProcessingEventsQueuePolicy:
    Type: AWS::SQS::QueuePolicy
    Properties:
      Queues:
        - !Ref FileProcessingEventsQueue
      PolicyDocument:
        Statement:
          - Action:
              - "SQS:*"
            Effect: "Allow"
            Resource: !GetAtt FileProcessingEventsQueue.Arn
            Principal:
              AWS: "*"
            Condition:
              StringEquals:
                aws:SourceAccount: !Sub "${AWS::AccountId}"
  # Lambda function and role for handling the SQS events
  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
      Policies:
        - PolicyName: InlinePolicy
          PolicyDocument:
            Statement:
              - Action:
                  - "SQS:SendMessage"
                  - "SQS:ReceiveMessage"
                  - "SQS:DeleteMessage"
                  - "SQS:GetQueueAttributes"
                Effect: Allow
                Resource: "*"
  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      Description: "Lambda for the event processing"
      Runtime: "python3.7"
      Role: !GetAtt LambdaExecutionRole.Arn
      Handler: index.handler
      MemorySize: 128
      Timeout: 60
      Code:
        ZipFile: |
          import json
          import logging

          # Configure logging

          LOGGER = logging.getLogger(__name__)
          LOGGER.setLevel(logging.DEBUG)

          def handler(event, context):
              LOGGER.debug(json.dumps(event, indent=4, default=str))
              data = {'status': 'event printed'}
              return data
  SQSAndLambdaMapping:
    Type: AWS::Lambda::EventSourceMapping
    Properties:
      EventSourceArn: !GetAtt FileProcessingEventsQueue.Arn
      FunctionName: !GetAtt LambdaFunction.Arn
Outputs:
  SQSQueue:
    Description: File processing queue
    Value: !Ref FileProcessingEventsQueue

 类似资料:
  • 最近,我阅读了有关飞行前请求(选项)的内容,了解到当内容类型为“application/json”或除“text/plain”、“application/x-www-form-urlencoded”之外的其他内容时,总是会触发该请求 所以我的问题是,为什么它总是针对特定的内容类型触发,比如“application/json”,而不是针对上述内容类型。

  • 我是石英调度器的新手。我有一个批处理文件,它将需要3分钟运行。我需要运行这批每2分钟使用石英调度器。所以我每天安排3个小时。我的问题是我需要检查第一个触发器的状态,如果它不是完整的状态,我需要从这个工作出来。我需要继续我安排的下一个工作。说明:作业53触发器在上午11.30开始,下一个触发器在上午11.32开始,下一个触发器在上午11.34开始,我需要检查上午11.30的触发器状态,如果它不是co

  • 我不知道如何使用电报机器人诱导(触发)本地服务器向通道发送消息。 例如,从用户注册并连接电报的网站向用户发送通知。我们假设用户已经开始与bot对话,并准备好接收来自bot的消息。 我有一个单独的服务器,可以使用bot向服务器发送请求,但我不明白如何在这个电报机器人服务器上接收和处理请求。 我正在使用go电报-机器人-api库,此时服务器使用长轮询方法而不是webhooks。所以它通过更新通道接收一

  • Apex触发器类似于在特定事件发生时执行的存储过程。 在记录事件发生之前和之后执行触发器。 语法 (Syntax) trigger triggerName on ObjectName (trigger_events) { Trigger_code_block } 执行触发器 以下是我们可以触发的事件 - insert update delete merge upsert undelete 触发示

  • 我有一个云函数,它在我的客户机上验证表单提交的输入。我正在使用云函数用于带有cors express中间件的Firebase https触发器。 Firebase功能 对函数的客户端调用 问题 是否可以防止firebase在预飞行请求上触发函数调用?如果没有,那么是否有一种方法可以阻止预飞行请求并成功地将数据传递给函数。

  • 问题内容: 我是在数据库中使用触发器的新手,我创建了一些对我来说效果很好的触发器,除了当我尝试创建一个在删除一行后将显示一条消息的触发器时。 我尝试使用此代码: 当我创建此触发器时,它不会给出错误消息,但是当我删除一行时,它不会显示我打印的消息。 问题答案: 这是因为触发器的运行方式,基本上它不在查询执行窗口中。一种方法是登录到事件查看器。 执行此操作的另一种方法是写入文件,这里当然存在权限问题,