【问题标题】:Invoking SNS from cross account using API Gateway使用 API Gateway 从跨账户调用 SNS
【发布时间】:2019-11-18 15:53:19
【问题描述】:

我的 AWS 账户中有一个 API 网关端点,它将调用同一地区另一个 AWS 账户中的 SNS。

我账户中API网关的访问策略如下

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": "sns:Publish",
        "Resource": "arn:aws:sns:ap-southeast-1:604970532282:PublishSourceMsgTopic"
    }
]
}

sns arn : arn:aws:sns:ap-southeast-1:604970532282:PublishSourceMsgTopic 属于同一地区的另一个 AWS 账户。

上述SNS中配置的访问策略的json为:

{
"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:Receive",
    "SNS:AddPermission",
    "SNS:Subscribe"
  ],
  "Resource": "arn:aws:sns:ap-southeast-1:604970532282:PublishSourceMsgTopic",
  "Condition": {
    "StringEquals": {
      "AWS:SourceOwner": "604970532282"
    }
  }
},
{
  "Sid": "__console_pub_0",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::148445556582:root"
  },
  "Action": "SNS:Publish",
  "Resource": "arn:aws:sns:ap-southeast-1:604970532282:PublishSourceMsgTopic"
}
]
 }

当我调用 API 网关时,它显示以下错误:

User: arn:aws:sts::148445556582:assumed-role/api_gateway_sns_role/BackplaneAssumeRoleSession is not 
authorized to perform: SNS:Publish on resource: arn:aws:sns:ap-southeast- 
1:604970532282:PublishSourceMsgTopic

如果我提供在我的 AWS 账户中配置的 SNS 主题,我能够成功调用 SNS。

我在这里错过了什么?

【问题讨论】:

    标签: amazon-web-services aws-api-gateway amazon-sns amazon-ses


    【解决方案1】:

    您正在授予外部帐户的根所有者发布主题的权限,但实际发布请求使用的是 API 网关的角色。

    因此,在您的访问策略中,您需要将发布权限授予 API 网关正在使用的角色,而不是 root 角色。

    通常您要做的是设置“Principal”:“*”,然后在策略中的资源下添加条件以匹配从另一个帐户访问 SNS 的资源的帐户和 arn。

    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": "*",
        "Action": "SNS:Publish",
        "Resource": "arn:aws:sns:us-east-2:444455556666:MyTopic",
        "Condition": {
          "ArnLike": {
            "aws:SourceArn": "arn:aws:cloudwatch:us-east-2:111122223333:alarm:MyAlarm"
          }
        }
      }]
    }      
    

    有几个示例访问策略here,应该会对您有所帮助。

    【讨论】:

    • 谢谢K Mo...我会尝试您的建议并确认。同时您能否确认我是否将委托人作为委托人": { "AWS": "*" } ,这可行吗?
    • 理论上,虽然我从未尝试过。 “校长”:“*”肯定会起作用。我添加了一个指向我的答案的链接,其中包含您应该能够适应的几个示例策略。
    • 我尝试了两种方法 1.在 Principal 中赋予 API Gateway 角色,即:"Principal": { "AWS": "arn:aws:iam::xxxxxxxxxxx:role/api_gateway_sns_role" } 2. Principal": { "AWS": "*" } 并添加条件,但没有运气。我需要在 Api Gateway 中提供任何访问策略
    • 尝试“校长”:“*”。我已经更新了我的答案以提供更完整的示例。只需将 arns 替换为您的 SNS 资源和来自其他帐户的 api 网关资源。
    • 试过了,但没有运气......我粗略的猜测是 API 网关可能存在一些问题......我对 S3 进行了同样的尝试......即我提供了 S3 的资源 arn 并且有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多