如何修复 AWS 上的错误 "Your budget must have permissions to send a notification to your topic "

How to fix ERORR "Your budget must have permissions to send a notification to your topic " on AWS

我试图在我的 AWS Organization/Member 账户中实施 AWS 预算并触发根账户中存在的 SNS 主题。

AWS 账户层次结构:

架构:

问题是,当我在会员账户 AWS 预算设置中粘贴 Root 账户 SNS 主题 ARN 时,会抛出此错误 ->“您的预算必须有权向您的主题发送通知”

因此,我按照 AWS 文档中提到的步骤进行操作:https://docs.aws.amazon.com/cost-management/latest/userguide/budgets-sns-policy.html 并添加了 SNS 主题访问策略

但仍然出现同样的错误。

SNS 主题访问策略:

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "__default_statement_ID",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": [
        "SNS:Publish",
        "SNS:RemovePermission",
        "SNS:SetTopicAttributes",
        "SNS:DeleteTopic",
        "SNS:ListSubscriptionsByTopic",
        "SNS:GetTopicAttributes",
        "SNS:AddPermission",
        "SNS:Subscribe"
      ],
      "Resource": "arn:aws:sns:us-east-1:ROOT_ACCOUNT_ID:AWS_Sandbox_Budget",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "*"
        }
      }
    },
    {
      "Sid": "AWSBudgetsSNSPublishingPermissions",
      "Effect": "Allow",
      "Principal": {
        "Service": "budgets.amazonaws.com"
      },
      "Action": "SNS:Publish",
      "Resource": "arn:aws:sns:us-east-1:ROOT_ACCOUNT_ID:AWS_Sandbox_Budget",
      "Condition": {
        "StringEquals": {
          "AWS:SourceOwner": "*"
        }
      }
    }
  ]
}

我该如何解决这个问题?

请帮我解决这个问题,我不想将 Root 帐户架构移动到成员帐户。

将您的 SID 部分“AWSBudgetsSNSPublishingPermissions”替换为以下内容,它应该可以工作。

{
   "Sid": "AWSBudgetsSNSPublishingPermissions",
   "Effect": "Allow",
   "Principal": {
       "Service": "budgets.amazonaws.com"
    },
    "Action": "SNS:Publish",
    "Resource": "arn:aws:sns:us-east-1:ROOT_ACCOUNT_ID:AWS_Sandbox_Budget"
}

来自 AWS 预算文档:

Amazon SNS topics must be in the same account as the Budgets you're configuring. Cross-account Amazon SNS isn't supported."

Link

为了让设计工作,实际架构应该是:

  1. 在会员账户中创建预算
  2. 在会员账户中创建 SNS 主题
  3. 为 lambda 函数创建 SNS 订阅根帐户到成员帐户中的 SNS 主题
  4. 如果它不起作用 - 检查 lambda 权限或 SNS 策略

不支持跨账户 SNS 配置

已联系 AWS Premium Support 了解更多详情,这里是回复。


来自 AWS 高级支持的热烈问候。

我了解到您正在尝试配置预算警报以将通知发送到另一个帐户中的 SNS 主题。在创建预算警报时,您收到错误消息“您的预算必须有权向您的主题发送通知。”即使主题具有所需的权限。请纠正我,以防我误解了问题。

为了调查此问题,我尝试通过在不同帐户中创建 SNS 主题和预算通知[1] 来在我的测试环境中复制类似的设置,并观察到即使 SNS 主题具有此处提到的所需权限[1]预算控制台抛出错误“您的预算必须有权向您的主题发送通知。”。

此外,我最后尝试对此进行研究,根据调查,我想通知您,AWS Budgets 服务目前不支持跨账户 SNS 通知[2]。这可能是控制台显示错误消息的原因,例如“您的预算必须有权向您的主题发送通知。”[3] 即使跨账户主题有权让 AWS 预算服务向其发布通知。

更进一步,我想分享一下,我们的开发团队知道这个限制,并且有一个功能请求支持 AWS 预算的跨账户 SNS 主题通知。我代表您将您的要求转达给服务团队,以便该团队了解越来越多的客户 required/requesting 此功能。您可以放心,Budget 团队通过向服务添加不同的功能来精心工作,以提供更好的客户体验。但是,作为支持工程师,我恐怕无法提供任何有关新功能的解决或发布的 ETA,我们对后端开发团队工作的了解非常有限 queue/roadmap。因此,我恳请您关注预算发布历史以获取更新信息或有关新更新的公告:

[+] https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/History.html

您还可以通过参考以下页面来跟踪预算的更新和改进:

[+] https://aws.amazon.com/new/ [+] https://aws.amazon.com/blogs/

话虽如此,将通知从账户 A 发送到账户 B 的解决方法是添加 Lambda 函数作为中介。您可以向同一账户中的 SNS 主题发送预算通知。此 SNS 主题可以订阅驻留在不同账户(例如:账户 B)中的 Lambda 函数。此 Lambda 函数将需要有一个自定义逻辑来根据您的要求处理到达它的事件,然后使用 SNS Publish API 调用 [4] 将通知发送到 SNS 主题(账户 B),如果您希望使用从主题收到的通知采取进一步的行动。工作流程如下所示:

可能的解决方案:

AWS Budgets -> SNS topic (same account i.e. Account A) -> Lambda function (Account B) -> SNS topic (Account B)

对于 AWS Budget 的这一限制给您带来的不便,我深表歉意。但是,我希望提供的解决方法对您实现所需的要求有用。


AWS技术团队已联系AWS Budget内部服务团队并转发反馈。希望将来可以使用此功能。