【问题标题】:AmazonWebService - Should i use AWS API Gateway or AWS SDKAmazonWebService - 我应该使用 AWS API Gateway 还是 AWS SDK
【发布时间】:2017-07-09 15:30:13
【问题描述】:

我正在尝试从 NodeJS 调用 lambda 函数。经过研究,我知道了两种方法:

  1. 将 Lambda 函数分配到 AWS API Gateway 并调用该 API。
  2. 通过 AWS SDK 调用 Lambda 函数

API Gateway 和 AWS SDK 的优缺点是什么?以及何时使用上述每种方式?

【问题讨论】:

    标签: node.js amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    这取决于。 API Gateway 主要用于在不安全的环境(即浏览器、桌面应用程序,而非服务器)中提供对 Lambda 函数的临时访问权限。

    如果您的环境是安全的,例如它在具有 IAM 角色的 EC2 实例或具有安全存储凭证的另一台服务器上运行,那么请随意使用 SDK 并正确调用 Lambda 函数。

    如果您需要将您的 Lambda 函数公开给整个互联网,或者网络上的授权用户,或者任何有可能在传输过程中获取访问密钥和秘密的用户,那么您将需要使用 API Gateway在前面。

    借助 API Gateway,您可以使用 API 密钥或通过其他授权者(例如 Amazon Cognito)保护您的 Lambda 函数,以便用户需要先登录才能使用 API 终端节点。这样他们只能获得临时凭证,而不是任何人都不能使用的永久凭证。

    【讨论】:

    • 感谢您的回答,我可以再问一件事:哪种方式更易于使用? (也许是关于编码)。
    • 几乎相同。然而,这并不是关于什么更容易,而是关于什么是正确的。 Lambda 前面的 API Gateway 只是因为您更愿意编写 http 请求并不是正确的解决方案。
    • 谢谢,我明白了。
    【解决方案2】:

    我不同意 _DF 关于直接通过客户端调用 lambda 的安全问题。在 4 年中,我在无服务器方法上实施了 Client + AWS SDK。直接命中我们拥有的所有微服务,例如 Lambda、DynamoDB、S3、SQS 等。

    要使用这种方法,我们必须深入了解 IAM 角色策略,包括其语句概念、身份验证令牌、AWS 凭证和令牌 - 凭证交换。

    对我来说,使用 SDK 来实现 serverless 比 API Gateway 更好。为什么我更喜欢在我的无服务器基础设施上实现 SDK 而不是 API?

    • API 网关成本高
    • 网络无跳
    • 实际上,SDK 通常包含一个 API 来与其他应用程序通信 类库和简单调用,例如 dynamodb.put(params).promise()、lambda.invoke(params).promise()、s3.putObject( params).promise() 等。我们可以看到像 fetch(URL).promise() 这样的示例 API 调用,术语并没有什么不同
    • API 比较复杂,有些情况不能或不应该处理
    • SDK 不可扩展?不,我不这么认为。因为它是类基础,所以它的可扩展性非常好。
    • 精简基础架构和代码编写,即使用 s3 无需部署 API+Lambda
    • 加快流程,即通过API+lambda将数据存储到dynamodb,无需业务逻辑
    • 易于维护,我们只维护我们的客户端代码
    • 角色策略更具可扩展性;等等

    【讨论】:

    • 我有这样的应用程序流程 - 用户可以注册到用户池,然后从客户端,直接使用 aws-sdk,他们应该能够将项目放入 dynamodb。但我不想在客户端存储 AWS IAM 用户访问密钥。我听说我们可以联合身份池与用户池和身份池可以向客户端提供临时 IAM 凭证以直接访问 dynamodb 和其他 AWS 资源。我如何获得这个临时凭证,你能否包括一些显示登录的 4-5 行代码、获取临时访问密钥和使用这些临时凭证调用 dynamodb put 操作
    • 我从此链接docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/… 开始了我的 AWS 之旅。您可以从第 10 页开始,了解使用 cognito 联合身份生成临时凭证的基本概念。对于更高级的,您应该使用其他技术交换 Oauth2 令牌
    • 我理解了用户池与身份池的概念,并在我的演示项目中成功使用。但是有一个问题,如果我直接使用 aws-sdk 客户端并在 DynamoDB 表上执行 CRUDL 操作,尽管它受 IAM 保护(并且只有操作所需的有效 AWS 凭证),如果有人剥离该应用程序,他将能够看到表名或字段名或用户池名称、s3 存储桶名称等。这样可以吗?
    • 绝对不行,但我通过一些技术(例如受限 IAM 策略条件)来关心这些问题,我从未在客户端上公开我的用户池 ID 和身份池 ID,我运行我的 oauth2 请求和令牌通过 http api、隔离变量等在 lambda 上进行交换。在这里查看一些演示 demo.appycloud.tech
    • 甚至 AWS 放大框架在客户端使用用户池 ID 和身份池 ID。他们有一个名为 aws-exports.js 的文件,其中包含所有值 - 表名称、存储桶名称等
    猜你喜欢
    • 2017-11-26
    • 1970-01-01
    • 2017-05-29
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2018-02-09
    • 1970-01-01
    相关资源
    最近更新 更多