Lambda服务引发错误执行角色,没有权限在SQS上调用receiveMessage

时间:2019-04-02 10:52:12

标签: amazon-web-services aws-lambda amazon-sqs

我有一个SQS队列,我想在消息到达队列时触发lambda函数。我已经编写了lambda函数,当我单击“测试”按钮时,该函数成功运行。当我转到SQS并尝试将其配置为lambda触发器时,我看到以下错误消息。

我使用相同的用户和角色创建了SQS队列和lambda函数,并且lambda函数对同一角色具有执行权限。

我还添加了SQS receiveMessage权限,但是除非设置时做错了什么,否则似乎没有什么不同。

可能是什么原因引起的问题?

感谢您的帮助

enter image description here

3 个答案:

答案 0 :(得分:2)

尽管目前可能已经实现了解决方案。.但是由于此线程是在顶部向我建议的。.我将为其他用户发布答案:

即使向SQS授予了用户完全访问权限,我仍然遇到相同的问题。问题出在lambda执行角色上。创建lambda时,需要为其分配一个lambda执行角色。大多数用户在创建lambda时分配自动生成的执行角色。该执行角色没有SQS权限。

因此打开lambda >>单击“权限”选项卡>>在顶部编辑执行角色>>分配SQS权限>>繁荣。

permissions tab showing execution role

答案 1 :(得分:1)

  • 您好,据我了解,您的lambda需要以下权限aws docks
  • 希望它不在VPC中。

    aws_lambda_permission

  • 或者可以在sqs:*上为其设置上帝模式,仅用于测试。

  • 如果以后可能有用,则可以仅使用特定方法。附加了针对Lambda角色的策略,如果您需要从该Lambda调用另一个Lambda,则可能必须将account_number更改为您的帐户

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:eu-west-2:account_number:function:*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "logs:PutLogEvents",
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Resource": "*"
        },
        {
            "Sid": "",
            "Effect": "Allow",
            "Action": [
                "sqs:*"
            ],
            "Resource": "*"
        }
    ]
    

    }

答案 2 :(得分:1)

您需要附加到角色的以下权限,您的 lambda 假定

  • sqs:ReceiveMessage
  • sqs:DeleteMessage
  • sqs:GetQueueAttributes

如果您使用的是 Terraform:

data "aws_iam_policy_document" "YOUR_DOCUMENT" {
  statement {
    sid       = "some_id"
    actions   = [
      "sqs:ReceiveMessage",
      "sqs:DeleteMessage",
      "sqs:GetQueueAttributes"
    ]
    resources = [
      aws_sqs_queue.YOUR_QUEUE.arn
    ]
  }
}

resource "aws_iam_policy" "YOUR_POLICY" {
  name   = "your_policy"
  policy = data.aws_iam_policy_document.YOUR_DOCUMENT.json
}

resource "aws_iam_role_policy_attachment" "POLICY_ATTACHMENT" {
  role       = aws_iam_role.YOUR_LAMBDA_ROLE.name
  policy_arn = aws_iam_policy.YOUR_POLICY.arn
}

resource "aws_lambda_function" "YOUR_LAMBDA" {
  ....
  role = aws_iam_role.YOUR_LAMBDA_ROLE.arn
  ....
}