Boto3 SNS发布到通配符主题ARN

时间:2016-09-13 02:36:59

标签: amazon-web-services boto3

背景

AWS服务是区域性的(例如us-west-2us-east-1), boto3 库要求您在访问客户端或资源之前设置默认区域。但是,文档here表明您可以拥有一个SNS主题ARN,并使用通配符替换该区域。文档说:

文档:Amazon Simple Notification Service(Amazon SNS)

语法:

arn:aws:sns:region:account-id:topicname
arn:aws:sns:region:account-id:topicname:subscriptionid

示例:

arn:aws:sns:*:123456789012:my_corporate_topic
arn:aws:sns:us-east-1:123456789012:my_corporate_topic:02034b43-fefa-4e07-a5eb-3be56f8c54ce

代码

当我使用boto3的SNS资源/客户端发布到主题ARN(该区域有一个通配符)时,我收到以下错误。当我没有该区域的通配符时(例如我指定us-west-2),一切正常。我查看了boto3库,它似乎只是替换JSON映射中的值(例如插入Topic字符串),所以我不明白为什么如果上面的文档显示它是有效的,这将是一个无效的参数。

import boto3

client = boto3.client('sns', region_name='us-west-2')
client.publish(TopicArn='arn:aws:sns:*:123456789:some-topic', Message='SomeMessage')

错误消息

File "/Users/wliu/.virtualenvs/myenv/lib/python2.7/site-packages/botocore/client.py", line 548, in _make_api_call
raise ClientError(parsed_response, operation_name)
ClientError: An error occurred (InvalidParameter) when calling the Publish operation: Invalid parameter: TopicArn Reason: A * ARN must begin with arn:null, not arn:aws:sns:*:123456789:my_topic

1 个答案:

答案 0 :(得分:2)

文档未显示它对您使用它的上下文有效。您误用或误解了文档,混淆了模式和文字的适用性。发布需要文字,并且不会在底层API的文档的relevant section中提及通配符。

You can use wildcards as part of the resource ARN在指定应用IAM策略声明的资源时,特定服务何时支持资源级策略。

来自SNS特定的政策语言文档:

  

对于Amazon SNS,主题是您可以在策略中指定的唯一资源类型。以下是主题的亚马逊资源名称(ARN)格式。

     

示例

     

如果您在Amazon SNS支持的每个不同区域中都有名为my_topic的主题,则可以使用以下ARN指定主题。

     

arn:aws:sns:*:123456789012:my_topic

     

http://docs.aws.amazon.com/sns/latest/dg/UsingIAMwithSNS.html#SNS_ARN_Format

但是,这一切都仅适用于也支持arn:aws:sns:*:123456789012:bob_*等模式的策略,而且这种模式(可能更直观地)不是Publish请求的有效主题。