我是微服务的新手,所以试着做一个小应用程序。
这是我目前的设计:
创建两个LambdaServices:
1) GetSomeData (string domainName, string nextSNS, ILambdaContext context)
2) StoreSomeData (string jsonData)
第1部分:
我对微服务的理解是每个函数应该只做一件事。所以" GetSomeData"获取域名,进行Web调用,将结果解析为JSON。然后我需要将它存储在StoreSomeData中的RDS数据库中。 但是在将来,我可能想要获取数据,或者用它做其他事情。
我现在99%的时间需要的功能,实际上是GetAndStoreSomeData。但如果我这样做,我不是微服务,对吧?
所以我在想一个程序是否只是希望JSON从#34; GetSomeData"回来,它只会在nextSNS中传递null。但是如果它想要存储数据,它将在nextSNS中传递SNSTopicName或arn,然后" GetSomeData"将使用JSON响应向该SNS发布消息。
这个过程将由我尚未完全弄清楚的其他过程启动,它将从RDS数据库中选择一些域,并可能调用API-Gateway来启动" GetSomeData&#34 ;。我可能不得不从某种类型的调度程序运行它。
我想知道这是不是一个好设计。我刚刚得到了#34; GetSomeData"在没有" nextSNS"的情况下发布和测试PARM。
第2部分:
如果" GetSomeData"需要发布到SNS,如何在不存储IAM凭据的情况下执行此操作。我可以使用角色吗?或者我必须使用秘密访问密钥,这可能是我可以放入一个环境变量,至少使其远离代码。
我正在考虑克隆此方法:https://gist.github.com/bkizzy/2705156以发布SNS消息。但后来我发现了一个Java样本,这个调用只有大约6行代码:Lambda does not trigger SNS event. Chaining AWS lambdas with SNS。是否有类似的简短方法从C#做同样的事情?我在亚马逊网站上找不到关于如何发布SNS而不是原始请求/响应的信息。 (https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)
答案 0 :(得分:2)
根据定义,你在这里得到的任何答案都会有点自以为是但是......
第1部分
“微服务”是一个非常好的营销名称,但最终它是一种设计模式,而不是一个硬性和快速的设计规则。对我来说很多,取决于服务周围的支持结构。例如,我主要在启动环境中工作。这意味着我必须使用{4}}处理AWS RDS,AWS VPC,AWS ELB和AWS ELB,等等。
其他环境中有专门的DevOps人员可以协助管理环境。
这是一个很长的路要说,如果你只想维护一个Lambda,那么维护一个Lambda。微服务警察可能会或可能不会与你交往,但只有你知道这个领域最有意义的是什么。
第2部分
AWS Lambda的一个很酷的事情(和EC2有一个非常相似的概念)是你可以设置TLA's。基本上这是在你的Lambda代码运行的IAM中的一个角色。因此,例如,如果您的Lambda需要发送SNS消息,则可以将AmazonSNSFullAccess
添加到运行Lambda的角色,您的Lambda现在可以发送和接收SNS消息。
在获取C#环境的凭据方面,看起来an execution role会让您了解如何执行此操作。
我承认我不熟悉发送SNS消息的C#方面,但看起来this blog post很好地映射到Java方面。
答案 1 :(得分:1)
您的特定安全问题的答案是您为每个Lambda函数分配一个IAM执行角色,允许它访问SNS之类的东西。您不会将AWS秘密访问密钥等凭据与Lambda函数一起使用。
关于与AWS的Java和C#交互的差异,您链接用于发布到SNS的C#方法是使用原始HTTP连接而不是使用AWS SDK for .NET,因此当然更多的代码行。您绝对应该使用Publish,这将使您的C#代码看起来与您链接的Java代码几乎完全相同。