【问题标题】:AWS Lambda Microservice Design and Chaining C# Lambda with SNS (security?)AWS Lambda 微服务设计和链接 C# Lambda 与 SNS(安全性?)
【发布时间】:2018-04-08 11:45:17
【问题描述】:

我是微服务新手,所以尝试做一个小应用程序。

这是我目前的设计:

创建两个 LambdaService:

1) GetSomeData (string domainName, string nextSNS, ILambdaContext context) 
2) StoreSomeData (string jsonData)

第 1 部分:

我对微服务的理解是每个功能应该只做一件事。所以“GetSomeData”接受一个域名,进行网络调用,将结果解析为 JSON。然后我需要将它存储在 StoreSomeData 中的 RDS 数据库中。 但在未来,我可能只想获取数据,或者用它做其他事情。

我现在 99% 的时间都需要的函数是 GetAndStoreSomeData。但如果我这样做,我就不是微服务了,对吧?

所以我在想如果一个程序只想从“GetSomeData”返回 JSON,它只会在 nextSNS 中传递 null。但是如果它想要存储数据,它将在 nextSNS 中传递一个 SNSTopicName 或 arn,然后“GetSomeData”将使用 JSON 响应向该 SNS 发布一条消息。

该进程将由我尚未完全弄清楚的其他进程启动,该进程将从 RDS 数据库中选择一些域,并可能调用 API-Gateway 以启动“GetSomeData”。我可能不得不从某种类型的调度程序运行它。

我想知道这是否是一个好的设计。我刚刚发布并测试了没有“nextSNS”参数的“GetSomeData”。

第 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)

【问题讨论】:

    标签: c# amazon-web-services aws-lambda amazon-sns


    【解决方案1】:

    根据定义,你在这里得到的任何答案都会有点固执,但是......

    第 1 部分

    “微服务”是一个很好的营销名称,但归根结底它是一种设计模式,而不是硬性的设计规则。对我来说,这很大程度上取决于围绕服务的支持结构。例如,我主要在创业环境中工作。这意味着我必须使用 AWS ELB 处理 AWS RDS、AWS VPC、AWS EC2,等等,使用 TLA's

    其他环境有专门的 DevOps 人员协助管理环境。

    如果您只想维护一个 Lambda,那么就维护一个 Lambda,这是一个很长的说法。微服务警察可能会或可能不会与您搭讪,但只有您知道在这方面什么最有意义。

    第 2 部分

    关于 AWS Lambda(和 EC2 有一个非常相似的概念)的一个很酷的事情是您可以设置 an execution role。基本上,这是您的 Lambda 代码在其下运行的 IAM 中的一个角色。因此,例如,如果您的 Lambda 需要发送 SNS 消息,您可以将 AmazonSNSFullAccess 添加到运行 Lambda 的角色中,您的 Lambda 现在可以发送和接收 SNS 消息。

    在获取 C# 环境的凭据方面,this blog post 似乎让您知道如何去做。

    我承认我不熟悉发送 SNS 消息的 C# 方面,但看起来 Publish 很好地映射到 Java 方面。

    【讨论】:

    • 好的,谢谢这个角色。我确实有一个角色,但没有考虑如何给它SNS。仍在尝试弄清楚如何编码/引用 PublishRequest(请参阅@markb 的评论)。对于微服务,我只是在尝试成为一个纯粹主义者会是什么样子。这对于 CI/CD、测试、快速部署、附带损害最小等都是有意义的......
    • 在微服务方面——完全同意。同样,在我看来,这一切都取决于您周围的支持结构。如果您是团队中的两名工程师之一,您可能没有所有的支持结构。但是一个完整的团队将拥有这一点。在发布方面,我找到了this link(滚动过去粘贴的 HTML 代码),它看起来像是一段非常简单的代码。
    • 谢谢,我想我找到了同一个页面,一旦我开始寻找 C# 和 PublishRequest。但我在 Lambda/Core 中找不到正确的“使用”语句来引用它。
    • 现在试试这个:Install-Package AWSSDK.SimpleNotificationService -Version 3.3.0.23
    • 针对发布 SDK 开始了新的特定问题。 stackoverflow.com/questions/46979765/…
    【解决方案2】:

    您的特定安全问题的答案是您为每个 Lambda 函数分配一个 IAM 执行角色,从而允许它访问 SNS 等内容。您不要在 Lambda 函数中使用 AWS 秘密访问密钥等凭证。

    关于 Java 和 C# 与 AWS 交互的差异,您为发布到 SNS 而链接的 C# 方法是使用原始 HTTP 连接,而不是使用适用于 .NET 的 AWS 开发工具包,因此当然是更多的代码行。您绝对应该使用the official AWS SDK,这将使您的 C# 代码看起来与您链接的 Java 代码几乎相同。

    【讨论】:

    • 我刚刚使用“Install-Package AWSSDK.Core -Version 3.3.18.2”来添加 SDK 核心,但我不知道如何使用 PublishRequest 或 AWSClientFactory 的 using 语句。有什么想法吗?
    • 我终于在这里找到了 c# 示例:docs.aws.amazon.com/sdkfornet/latest/apidocs/items/…(SDK 的 2.0)。 SDK 3.0 似乎在 Google 中有一些错误链接,搜索显示“稍后尝试”。所以我不认为 2.0 是针对 Core 的,而且他们没有显示 using 语句。
    • 现在试试这个:Install-Package AWSSDK.SimpleNotificationService -Version 3.3.0.23
    • 针对发布 SDK 开始了新的特定问题。 stackoverflow.com/questions/46979765/…
    猜你喜欢
    • 2021-07-21
    • 2017-12-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2016-12-25
    • 2016-05-02
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多