首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在对流层中向现有sns主题添加订阅

在对流层中向现有sns主题添加订阅
EN

Stack Overflow用户
提问于 2019-08-06 00:53:50
回答 1查看 653关注 0票数 0

我有一个用例,其中我有一个现有的sns主题,并且我正在使用cloudformation和对流层创建lambda函数。我必须以某种方式创建我的堆栈,在这种方式下,主题向我的lambda函数发送订阅,但不应该重新创建主题本身。

下面是我的代码:

代码语言:javascript
复制
from troposphere import FindInMap, GetAtt, Join, Output
from troposphere import Template, Ref
from troposphere.awslambda import Function, Code, Permission
from troposphere.sns import Topic, SubscriptionResource

folder_names = ["welt", "jukin"]

t = Template()

t.set_version("2010-09-09")

t.add_mapping("MapperToTenantId",
              {
                  u'welt': {'id': u't-012'},
                  u'jukin': {'id': u't-007'}
              }
              )

t.add_mapping("LambdaExecutionRole",
                {u'lambda-execution-role': {u'ARN': u'arn:aws:iam::498129003450:role/service-role/lambda_execution_role'}}
            )

code = [
    "def lambda_handler(event, context):\n",
    "    message = event[‘Records’][0][‘Sns’][‘Message’]\n",
    "    print(“From SNS: “ + message)\n",
    "    return message\n"
]


for cp in folder_names:
    lambda_function = t.add_resource(Function(
        f"{cp}MapperLambda",
        Code=Code(
        ZipFile=Join("", code)
    ),
    Handler="index.handler",
    Role=FindInMap("LambdaExecutionRole", "lambda-execution-role", "ARN"),
    Runtime="python3.6",
    )
    )

    t.add_resource(Permission(
        f"InvokeLambda{cp}Permission",
        FunctionName=GetAtt(lambda_function, "Arn"),
        Action="lambda:InvokeFunction",
        SourceArn='arn:aws:sns:us-west-2:498129003450:IngestStateTopic',
        Principal="sns.amazonaws.com"
    ))

    t.add_resource(SubscriptionResource(
        EndPoint=GetAtt(lambda_function, "Arn"),
        Protocol='lambda',
        TopicArn='arn:aws:sns:us-west-2:498129003450:IngestStateTopic'
    ))



with open('mapper_cf.yaml', 'w') as y:
    y.write(t.to_yaml())

我得到了下面的错误,但我无法找到解决方法:

代码语言:javascript
复制
Traceback (most recent call last):
  File "create_cloudformation.py", line 54, in <module>
    TopicArn='arn:aws:sns:us-west-2:498129003450:IngestStateTopic'
TypeError: __init__() missing 1 required positional argument: 'title'

在对流层中这是可能的吗?我不想在云形成中硬编码块,但我想在对流层中生成它。

这有可能做到吗?

请给我一些提示。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 01:11:44

您得到的错误与未指定标题字符串有关。试试这个:

代码语言:javascript
复制
t.add_resource(SubscriptionResource(
    f"{cp}Subscription",
    EndPoint=GetAtt(lambda_function, "Arn"),
    Protocol='lambda',
    TopicArn='arn:aws:sns:us-west-2:498129003450:IngestStateTopic'
))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57362949

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档