我正在使用python boto3在多个帐户中自动创建cloudtrail。我的问题是create_trail不会自动创建与跟踪关联的sns主题。 create_trail期望sns主题已经存在。
我可以使用boto创建sns主题,但我似乎无法设置主题的策略以允许cloudtrail发布到主题。
这是控制台中正确的策略:
{
"Sid": "AWSCloudTrailSNSPolicy20150319",
"Effect": "Allow",
"Principal": {
"Service": "cloudtrail.amazonaws.com"
},
"Action": "SNS:Publish",
"Resource": "arn:aws:sns:us-east-1:123456678912:us-east-1-trail"
}
似乎没有办法通过boto:
为服务授予权限client.add_permission(
TopicArn=arn,
Label='AWSCloudTrailSNSPolicy20150319',
AWSAccountId=[
'12345678912'
],
ActionName=[
'Publish',
]
)
如果我在此处添加帐户,则create_trail调用仍会失败:
调用CreateTrail操作时发生错误(InsufficientSnsTopicPolicyException):SNS主题不存在或主题策略不正确!
有没有办法只提供服务权限或在创建跟踪或sns主题时自动设置?
答案 0 :(得分:1)
也许使用SetTopicAttributes(http://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)。 本主题讨论允许将Cloudwatch事件发布到SNS主题 - http://docs.aws.amazon.com/AmazonCloudWatch/latest/events/resource-based-policies-cwe.html
答案 1 :(得分:0)
不确定这是哪个版本的boto,但今天可以与更高版本一起使用。
conn = boto3.Session() # initialize you Session
sns = conn.client('sns')
lam = conn.client('lambda')
# add permission to lambda that allows sns service to invoke it
lam.add_permission(FunctionName="your_lambda_name",
StatementId=str(uuid.uuid4()),
Action="lambda:InvokeFunction",
Principal="sns.amazonaws.com")
# subscribe lambda to sns, to receive notifications
lambda_arn = "arn:aws:lambda:us-east-1:123456789012:function:your_lambda_name"
topic_arn = "arn:aws:sns:us-east-1:123456789012:your-sns-topic-name"
resp = sns.subscribe(TopicArn=topic_arn, Protocol='Lambda', Endpoint=lambda_arn)
答案 2 :(得分:0)
当我通过Terraform将Cloud Trail与SNS一起使用时,我收到了完全相同的错误。
问题在于,在Terraform docs中,sns_topic_name
被写为:
sns_topic_name-(可选)指定Amazon SNS主题的名称 定义用于通知日志文件的传递。
当我输入SNS主题名称时-它给了我提到的错误。
当我将其更改为ARN时-它起作用了。