跨账户 SQS 被拒绝访问

问题描述 投票:0回答:1

我正在尝试从账户 A 中运行的 lambda 函数(用 Go 编写)在账户 B 中的 SQS 队列上调用 sqs:SendMessage。我收到访问被拒绝错误并且不明白为什么。

lambda 作为 IAM 角色运行,该角色具有允许 sqs:SendMessage 到另一个帐户中的队列的内联策略,如 AWS Lambda GUI、配置选项卡、权限选项卡、资源摘要“按资源”视图中所验证:

账户 B 中的队列本身允许账户 A 中的任何用户或角色调用 sendmessage。队列未启用 KMS。我已经为测试/故障排除打开了相当广泛的权限:

我从 Golang SDK 得到的错误是:

AccessDenied: Access to the resource https://sqs.us-west-2.amazonaws.com/ is denied.\n\tstatus code: 403, request id: 27725068-xxxx-xxxx-xxxx-0cbc781c2526

我的代码从一个环境变量中获取 SQS 队列的 URL,该 URL 由 Terraform 从资源的 url 属性填充,因此我很确定我正在将我的数据发送到正确的 URL。 (我也没有看到我的代码调用的内容与使用凝视比较的队列的 URL 之间的区别。)

任何人都可以提出其他可能导致此问题的原因,或者我如何从 AWS 获得更详细的错误消息?

编辑:错误消息中的 URL 使它看起来好像我没有完整的队列 URL。但是,sqs.SendMessageInput 结构在我的日志中有以下数据:

    "DelaySeconds": null,
    "MessageAttributes": null,
    "MessageBody": "{\"CreatedTime\":1683599412006493,\"FooID\":\"1bec4d4a-336d-4a7c-bb0e-e73b6eb23c55\",\"S3Bucket\":\"myredactedbucketname\",\"S3Key\":\"b9f01b2f-4043-4e6b-b9e8-f47ea630a053/b992fee7-0181-4a0f-8cc3-e29c54747135\"}",
    "MessageDeduplicationId": null,
    "MessageGroupId": null,
    "MessageSystemAttributes": null,
    "QueueUrl": "https://sqs.us-west-2.amazonaws.com/<my-aws-account-id>/asset_xxxxxxx_queue_us-west-2"
amazon-web-services amazon-sqs
1个回答
0
投票

您的情况是:

  • Account-A 中的 AWS Lambda 函数
  • Account-B 中的 Amazon SQS 队列

要授予 Lambda 函数向 SQS 队列发送消息的权限,需要两件事:

  1. IAM 角色 中与 Lambda 函数关联的权限,可以将消息发送到队列,AND
  2. SQS 队列的权限 信任使用队列的 IAM 角色

这两个元素都是必需的,因为 IAM 角色和 SQS 队列位于不同的 AWS 账户。仅在一个账户中授予 IAM 角色权限不足以使用不同账户中的资源。

解释一下,假设您有一个具有 Lambda 函数和 IAM 角色的 AWS 账户。另外,我自己的 AWS 账户中有一个 SQS 队列。我不认识你,所以我不希望你能够向我的队列发送消息。因此,您(在您的账户中)应该不可能给予 Lambda 函数足够的权限来使用我的 SQS 队列。如果我想让您访问我的 SQS 队列,我需要告诉我的 SQS 队列我愿意让您的 Lambda 函数和 IAM 角色写入我的 SQS 队列。

这可以通过 SQS 队列上的访问策略来完成

{
  "Version": "2012-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__owner_statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::222:root"
      },
      "Action": "SQS:*",
      "Resource": "arn:aws:sqs:ap-southeast-2:222:my-queue"
    },
    {
      "Sid": "__sender_statement",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111:role/your-iam-role"
      },
      "Action": "SQS:SendMessage",
      "Resource": "arn:aws:sqs:ap-southeast-2:222:my-queue"
    }
  ]
}

策略的第一部分授予我的帐户 (222) 中的资源使用 SQS 队列的权限。

策略的第二部分授予your 帐户 (111) 中的 IAM 角色向队列发送消息的权限。

此策略实际上是在我创建队列时由 Amazon SQS 控制台创建的,但您可以在创建队列后通过转到Access policy 选项卡手动添加它。

© www.soinside.com 2019 - 2024. All rights reserved.