AWS Lambda 的 AWS SQS 权限

AWS SQS permissions for AWS Lambda

我正在使用 AWS SQS 服务,但我很难在我的 SQS 队列上定义权限。在我的设置中,我使用的是 AWS Lambda 服务,该服务在将对象推送到 S3 存储桶时触发。

不过为了让我的问题保持简短,这就是我想要实现的目标:

  1. 对象被推送到 S3 存储桶
  2. S3 存储桶触发 AWS Lambda
  3. Lambda 进行了一些计算,并将事件推送到我的 SQS 队列(需要定义权限)
  4. 应用程序从 SQS 读取

您可以从之前的用例中了解到,我希望我的 AWS Lambda 方法成为唯一可以向 SQS 队列发送消息的应用程序。我试图设置一个主体和一个条件 "sourceArn"。但是 none 他们工作..

有人可以帮忙吗?

我认为 SourceArn 字段不会被 Lambda 填充。我知道 SourceArn 适用于 SNS,但 Lambda 实际上是 运行 任意代码,而不是像 SNS 这样的 AWS 功能。

作为替代方案,您可以将策略附加到运行 Lambda 函数的 IAM 角色。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1440529349000",
            "Effect": "Allow",
            "Action": [
                "sqs:SendMessage"
            ],
            "Resource": [
                "arn:aws:sqs:us-west-2:123456789012:test-queue"
            ]
        }
    ]
}

此方法不需要直接附加到队列的策略。

您还可以指定拒绝发送除您的 lambda 之外的消息的 SQS 访问策略

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "Only API Gateway is allowed to send messages",
      "Effect": "Deny",
      "Principal": "*",
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:eu-west-1:XXX:my_sqs_queue",
      "Condition": {
        "StringNotLike": {
          "aws:userid": [
            "AROA4XB7NRHNVE2XY7ABC:*"
          ]
        }
      }
    }
  ]
}

通过为角色 ID 提供通配符 Principal * 和条件键 aws:userid。条件子句中需要指定以下内容

<USER ID of the Role being used by the Lambda:*>

可以使用以下 CLI 命令检索角色 AROA4XB7NRHNVE2XY7ABC 的用户 ID

aws iam get-role --role-name my_lambda_role

{
    "Role": {
       "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Principal": {
                        "Service": "lambda.amazonaws.com"
                    },
                    "Effect": "Allow",
                    "Sid": ""
                }
            ]
        },
        "RoleId": "AROA4XB7NRHNWU35SVABC",
        "CreateDate": "2020-01-21T11:40:55Z",
        "RoleName": "my_lambda_role",
        "Path": "/",
        "Arn": "arn:aws:iam::XXX:role/my_lambda_role"
    }
}

可以找到有关此案例的更多信息here