使用Lambda代理集成实现的Step Functions和Lambdas

4

我写了一堆Lambda函数,通过API Gateway作为Rest端点暴露出来。我选择了“Lambda代理集成”,因为它似乎是一个简单的入门方式。

现在,我想通过AWS Step Functions将其中的2个函数链接起来。一般的集成和配置都可以正常工作,只是如何为每个任务创建适当的输入有些困难。

使用控制台,我可以启动一个执行并提供以下JSON:

{
    "headers": {
        "Authorization": "Bearer 12345"
    },
    "body": "\"some\": \"json\"",
    "queryParameters: {
        "more": "here"
    }
}

由于我在任何地方都使用Lambda代理集成,因此我的Lambda函数的输入如下所示。

输出大致如下:

{
  "isBase64Encoded": false,
  "statusCode": 200,
  "headers": {
    "Access-Control-Allow-Origin": "*"
  },
  "body": "{\"message\":\"Great\"}"
}

这也可以单独使用,API网关会将这些信息映射回适当的HTTP返回代码和响应中。

现在问题来了:在使用Step Functions时,我该如何创建这些输入JSON?当然,通过控制台可以很容易地创建第一个输入。但是,我该如何创建下一个输入并混入上一个输出的一部分呢?以下是一些问题的要点:

  • 使用InputPath、ResultPath和OutputPath,我只能似乎只能将前一个步骤的“整个”输出作为下一个步骤的输入或部分作为输入。但是我无法仅使用输出的一部分,例如响应的“body”元素。
  • 无论如何,这个“body”元素都被转义了,所以我想在将其用于下一个输入之前,需要对其进行解转义。但是,怎么做呢?
  • 输入JSON需要包含“headers”、“body”或“queryParameters”等元素,而这些元素在先前的输出中根本不出现。我该如何创建它们?

我在想,Step Functions是否真的不适用于构建用于Lambda代理集成的Lambda函数。是这样吗?人们如何在没有遇到这些问题的情况下使用Step Functions?

1个回答

0

步骤函数是专为与 Lambda 直接集成而设计的,而不是通过 API 网关进行集成,这就是为什么步骤函数不能自然地处理它转义 Jain 的原因。

如果您想让 Lambda 代码可以通过 API 网关和步骤函数访问,我建议您按照以下步骤操作:将 Lambda 代码逻辑分为两部分,即核心逻辑和包装器,后者基本上执行从主体中提取字段并取消转义的功能。这样,您的 API 网关可以调用包装器 Lambda,而您的步骤函数可以调用核心逻辑 Lambda。通过这种设计,您将能够实现您的目标。此外,您可以将 Lambda 定义为一个 CFN 和代码包的一部分,这将有助于简化维护。

希望这回答了您的问题。

谢谢


有趣的建议。所以你的意思是Lambda函数应该能够处理与API Gateway的集成和直接集成到类似Step Functions的东西?从代码角度来看,这是可行的,我想。只是感觉Lambda函数需要知道它是如何被调用并不是完美的解决方案。感觉我应该不再在API Gateway上使用Lambda代理集成,而是应该查看重写规则和参数映射,以便正确地将请求从API Gateway转发到Lambda函数... - hendrikbeck
1
在上述提案中,Lambda函数不知道调用者是谁。基本上有两个Lambda函数X和Y: X -> X包含核心逻辑,接收参数并执行其功能,然后返回结果 Y -> X的包装函数(遵循标准的装饰器模式),将从API Gateway接收到的输入转换为Lambda X所需的输入。[1] - Udit Bhatia
1
但是,如果在您的用例中有一种选择,可以通过直接从API Gateway映射字段(而不是使用代理集成)或完全将API Gateway从图片中删除,并仅依赖于SFn与Lambda的直接集成来摆脱lambda Y,则我同意,那样做是正确的 :) - Udit Bhatia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接