添加服务到SNS策略

时间:2017-07-27 16:32:06

标签: python aws-sdk boto3

我正在使用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主题时自动设置?

3 个答案:

答案 0 :(得分:1)

答案 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时-它起作用了。