如何修复 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 账户层次结构:
- 在会员/组织账户 (XYZ) 中,我创建了一个 AWS 预算。
- 超过预算阈值时,它会向在根 AWS 账户 (ABC) 中创建的 SNS 主题发布消息。
- SNS 主题将触发 lambda 函数来执行某些业务逻辑。
架构:
问题是,当我在会员账户 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."
为了让设计工作,实际架构应该是:
- 在会员账户中创建预算
- 在会员账户中创建 SNS 主题
- 为 lambda 函数创建 SNS 订阅从根帐户到成员帐户中的 SNS 主题
- 如果它不起作用 - 检查 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内部服务团队并转发反馈。希望将来可以使用此功能。
我试图在我的 AWS Organization/Member 账户中实施 AWS 预算并触发根账户中存在的 SNS 主题。
AWS 账户层次结构:
- 在会员/组织账户 (XYZ) 中,我创建了一个 AWS 预算。
- 超过预算阈值时,它会向在根 AWS 账户 (ABC) 中创建的 SNS 主题发布消息。
- SNS 主题将触发 lambda 函数来执行某些业务逻辑。
架构:
问题是,当我在会员账户 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."
为了让设计工作,实际架构应该是:
- 在会员账户中创建预算
- 在会员账户中创建 SNS 主题
- 为 lambda 函数创建 SNS 订阅从根帐户到成员帐户中的 SNS 主题
- 如果它不起作用 - 检查 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内部服务团队并转发反馈。希望将来可以使用此功能。