【问题标题】:How to Invoke AWS step function using API gateway?如何使用 API 网关调用 AWS 步骤函数?
【发布时间】:2017-04-28 01:48:24
【问题描述】:

根据亚马逊的文档,可以使用 HTTP API 调用 step 函数。

可以通过 Step Functions 访问和使用 Step Functions 控制台、AWS 开发工具包或 HTTP API。

我试图搜索详细信息,但似乎找不到任何好的信息。有谁知道如何使用 API 网关调用 AWS step 函数,类似于它调用 Lambda 函数的方式?

【问题讨论】:

  • 我今天试图解决这个问题。事实证明,Lambda 和 Step Function 有一个关键区别——当您将 AWS API Gateway API 放在 Lambda 前面时,它可以从客户端安全地使用 API 密钥、身份验证等,并且它可以将结果返回给调用者。但是,只能使用您的 AWS 凭证调用 Step Function。因此,Step Functions 的 HTTP API 是 SDK 的替代品,而不是补充功能。 AFAIK 无法从客户端调用 step 函数并获得结果,就像 Lambda 一样(这很糟糕)。
  • 幸运的是,现在您可以在创建与集成类型的集成时选择 Step Functions 作为 AWS 服务:AWS 服务。

标签: amazon-web-services aws-lambda aws-api-gateway aws-step-functions


【解决方案1】:

我最近在https://stackoverflow.com/a/59326771/6697093 上发布了一个使用 CloudFormation 和 OpenApi 使其工作的示例代码。

【讨论】:

    【解决方案2】:

    它使用的是 HTTP API,而不是 API Gateway。

    阶梯函数端点遵循以下格式:

    https://states.${region}.amazonaws.com
    

    例如:

    https://states.us-east-1.amazonaws.com
    

    您使用 HTTP API(同样,不是 API 网关)对您的状态进行操作。

    在此处了解有关 HTTP API 的更多信息:

    http://docs.aws.amazon.com/step-functions/latest/apireference/Welcome.html

    从技术上讲,您可以使用 API 网关来重定向到步骤函数 API,但这并没有多大意义。

    【讨论】:

    • 嗨@Emdob,感谢您的澄清!
    • 我刚刚查看了 HTTP API,它在每个请求中都需要身份验证参数。您认为在生产环境中使用 AWS-SDK 更有意义吗?
    • AWS SDK 可以更轻松地使用 HTTP API,所以是的,当然。
    【解决方案3】:

    如果您需要从 API Gateway 调用 StepFunction,现在可以并在文档中进行了详细描述:https://docs.aws.amazon.com/step-functions/latest/dg/tutorial-api-gateway.html

    • 对于集成类型,选择AWS Service
    • 对于 AWS 服务,从列表中选择 Step Functions
    • 对于 HTTP 方法,从列表中选择 POST
    • 对于操作类型,选择Use action name
    • 对于操作,输入StartExecution
    • 对于执行角色,键入具有API Gateway 受信任身份提供者和附加策略AWSStepFunctionsFullAccess 的角色的ARN

    【讨论】:

    • 知道如何在 CloudFormation 中进行配置吗?
    【解决方案4】:

    这不是“官方”AWS 方式——请参阅 Erndob 的回答。

    AWS 方式(使用 AWS 凭证签署每个请求)的问题在于,大多数企业已经拥有成熟的方法来通过其 API 网关管理身份验证和授权,并且(作为企业架构师)不想处理在 AWS 凭证级别复制此内容令人头疼。

    我确信 AWS 最终会将 Step Functions 与 API Gateway 集成,但在撰写本文时 (1/17),这可能是完成工作的最简单方法。下面是我编写的一个简单的 Lambda 代理函数,用于利用 SDK 对请求进行签名:

    'use strict';
    
    const AWS = require('aws-sdk');
    const stepfunctions = new AWS.StepFunctions();
    
    exports.handler = (event, context, callback) => {
        if(!event && event.action)
            callback("Error: 'action' is required.");
        if(!event && event.params)
            callback("Error: 'params' is required.");
        
        stepfunctions[event.action](event.params, function (err, data) {
            if (err) 
                console.log(err, err.stack);
            callback(err, data);
        });
    };

    您需要授予 Lambda 权限才能与您的 Step Functions 交互。要为其授予对所有操作的完全访问权限,请创建一个新角色并附加以下策略:

    • AWSLambdaBasicExecutionRole
    • AWSStepFunctionsFullAccess

    现在将 Lambda 配置为正常通过 API 网关调用,传入具有两个属性的事件:

    并确保锁定您的 API! :-)

    【讨论】:

    • 您知道如何发送 sendTaskSuccess 和 sendTaskFailure 吗?我不是 node.js 方面的专家,但我想测试一些东西。
    • 使用action=startExecution时,返回的数据只有executionArn和startDate。有没有办法等待并获得实际的步骤结果?
    猜你喜欢
    • 2021-08-31
    • 2018-09-11
    • 2020-04-04
    • 2019-11-11
    • 2019-10-27
    • 2023-01-19
    • 2019-06-05
    • 2016-09-18
    • 2021-04-13
    相关资源
    最近更新 更多