背景
AWS服务是区域性的(例如us-west-2
,us-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
答案 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
请求的有效主题。